电子秤stm32程序(3)

2019-08-03 10:23

//返回值:RGB格式的颜色值 u16 LCD_BGR2RGB(u16 c) { u16 r,g,b,rgb; b=(c>>0)&0x1f; g=(c>>5)&0x3f; r=(c>>11)&0x1f; rgb=(b<<11)+(g<<5)+(r<<0); return(rgb); }

//当mdk -O1时间优化时需要设置 //延时i

void opt_delay(u8 i) { while(i--); }

//读取个某点的颜色值 //x,y:坐标

//返回值:此点的颜色

u16 LCD_ReadPoint(u16 x,u16 y) {

u16 r=0,g=0,b=0; if(x>=lcddev.width||y>=lcddev.height)return 0; //超过了范围,直接返回 LCD_SetCursor(x,y); if(lcddev.id==0X9341||lcddev.id==0X6804)LCD_WR_REG(0X2E);//9341/6804 发送读GRAM指令 else LCD_WR_REG(R34); //其他IC发送读GRAM指令

if(lcddev.id==0X9320)opt_delay(2); //FOR 9320,延时2us if(LCD->LCD_RAM)r=0; //dummy Read opt_delay(2);

r=LCD->LCD_RAM; //实际坐标颜色 if(lcddev.id==0X9341)//9341要分2次读出 { opt_delay(2); b=LCD->LCD_RAM; g=r&0XFF;//对于9341,第一次读取的是RG的值,R在前,G在后,各占8位 g<<=8; }else if(lcddev.id==0X6804)r=LCD->LCD_RAM;//6804第二次读取的才是真实值 if(lcddev.id==0X9325||lcddev.id==0X4535||lcddev.id==0X4531||lcddev.id==0X8989||lcddev.id==0XB505)return r;//这几种IC直接返回颜色值 else if(lcddev.id==0X9341)return (((r>>11)<<11)|((g>>10)<<5)|(b>>11)); //ILI9341需要公式转换一下 else return LCD_BGR2RGB(r); //

其他IC } //LCD开启显示

void LCD_DisplayOn(void) { if(lcddev.id==0X9341||lcddev.id==0X6804)LCD_WR_REG(0X29); //开启显示 else LCD_WriteReg(R7,0x0173); //开启显示 }

//LCD关闭显示

void LCD_DisplayOff(void) { if(lcddev.id==0X9341||lcddev.id==0X6804)LCD_WR_REG(0X28); //关闭显示 else LCD_WriteReg(R7,0x0);//关闭显示 }

//设置光标位置 //Xpos:横坐标 //Ypos:纵坐标

void LCD_SetCursor(u16 Xpos, u16 Ypos) {

if(lcddev.id==0X9341||lcddev.id==0X6804) { LCD_WR_REG(lcddev.setxcmd); LCD_WR_DATA(Xpos>>8); LCD_WR_DATA(Xpos&0XFF); LCD_WR_REG(lcddev.setycmd); LCD_WR_DATA(Ypos>>8); LCD_WR_DATA(Ypos&0XFF); }else { if(lcddev.dir==1)Xpos=lcddev.width-1-Xpos;//横屏其实就是调转x,y坐标 LCD_WriteReg(lcddev.setxcmd, Xpos); LCD_WriteReg(lcddev.setycmd, Ypos); } }

//设置LCD的自动扫描方向

//注意:其他函数可能会受到此函数设置的影响(尤其是9341/6804这两个奇葩), //所以,一般设置为L2R_U2D即可,如果设置为其他扫描方式,可能导致显示不正常. //dir:0~7,代表8个方向(具体定义见lcd.h)

//9320/9325/9328/4531/4535/1505/b505/8989/5408/9341等IC已经实际测试 void LCD_Scan_Dir(u8 dir) { u16 regval=0; u8 dirreg=0; u16 temp;

if(lcddev.dir==1&&lcddev.id!=0X6804)//横屏时,对6804不改变扫描方向! { switch(dir)//方向转换 { case 0:dir=6;break; case 1:dir=7;break; case 2:dir=4;break; case 3:dir=5;break; case 4:dir=1;break; case 5:dir=0;break; case 6:dir=3;break; case 7:dir=2;break; } }

if(lcddev.id==0x9341||lcddev.id==0X6804)//9341/6804,很特殊 { switch(dir) { case L2R_U2D://从左到右,从上到下 regval|=(0<<7)|(0<<6)|(0<<5); break; case L2R_D2U://从左到右,从下到上 regval|=(1<<7)|(0<<6)|(0<<5); break; case R2L_U2D://从右到左,从上到下 regval|=(0<<7)|(1<<6)|(0<<5); break; case R2L_D2U://从右到左,从下到上 regval|=(1<<7)|(1<<6)|(0<<5); break; case U2D_L2R://从上到下,从左到右 regval|=(0<<7)|(0<<6)|(1<<5); break; case U2D_R2L://从上到下,从右到左 regval|=(0<<7)|(1<<6)|(1<<5); break; case D2U_L2R://从下到上,从左到右 regval|=(1<<7)|(0<<6)|(1<<5); break; case D2U_R2L://从下到上,从右到左 regval|=(1<<7)|(1<<6)|(1<<5); break; } dirreg=0X36;

regval|=0X08;//BGR if(lcddev.id==0X6804)regval|=0x02;//6804的BIT6和9341的反了 LCD_WriteReg(dirreg,regval); if(regval&0X20) { if(lcddev.widthlcddev.height)//交换X,Y { temp=lcddev.width; lcddev.width=lcddev.height; lcddev.height=temp; } } LCD_WR_REG(lcddev.setxcmd); LCD_WR_DATA(0);LCD_WR_DATA(0); LCD_WR_DATA((lcddev.width-1)>>8);LCD_WR_DATA((lcddev.width-1)&0XFF); LCD_WR_REG(lcddev.setycmd); LCD_WR_DATA(0);LCD_WR_DATA(0); LCD_WR_DATA((lcddev.height-1)>>8);LCD_WR_DATA((lcddev.height-1)&0XFF); }else { switch(dir) { case L2R_U2D://从左到右,从上到下 regval|=(1<<5)|(1<<4)|(0<<3); break; case L2R_D2U://从左到右,从下到上 regval|=(0<<5)|(1<<4)|(0<<3); break; case R2L_U2D://从右到左,从上到下 regval|=(1<<5)|(0<<4)|(0<<3); break; case R2L_D2U://从右到左,从下到上 regval|=(0<<5)|(0<<4)|(0<<3); break; case U2D_L2R://从上到下,从左到右 regval|=(1<<5)|(1<<4)|(1<<3);

break; case U2D_R2L://从上到下,从右到左 regval|=(1<<5)|(0<<4)|(1<<3); break; case D2U_L2R://从下到上,从左到右 regval|=(0<<5)|(1<<4)|(1<<3); break; case D2U_R2L://从下到上,从右到左 regval|=(0<<5)|(0<<4)|(1<<3); break; } if(lcddev.id==0x8989)//8989 IC { dirreg=0X11; regval|=0X6040; //65K }else//其他驱动IC { dirreg=0X03; regval|=1<<12; } LCD_WriteReg(dirreg,regval); } } //画点 //x,y:坐标

//POINT_COLOR:此点的颜色 void LCD_DrawPoint(u16 x,u16 y) { LCD_SetCursor(x,y); //设置光标位置 LCD_WriteRAM_Prepare(); //开始写入GRAM LCD->LCD_RAM=POINT_COLOR; }

//快速画点 //x,y:坐标 //color:颜色

void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color) { if(lcddev.id==0X9341||lcddev.id==0X6804) { LCD_WR_REG(lcddev.setxcmd); LCD_WR_DATA(x>>8); LCD_WR_DATA(x&0XFF); LCD_WR_REG(lcddev.setycmd); LCD_WR_DATA(y>>8);


电子秤stm32程序(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:酒店人力资源管理试卷A

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: