//********************************************************************** // LCD 初始化 //********************************************************************** void Lcd_Reset() { Lcd_WriteCmd(0x30); //选择基本指令集 Lcd_WriteCmd(0x01); //清除显示,并且设定地址指针为00H Lcd_WriteCmd(0x0c); //开显示(无游标、不反白) Lcd_Clear(); //清除液晶GDRAM中的数据 Lcd_WriteCmd(0x01); //清除显示,并且设定地址指针为00H Lcd_WriteCmd(0x06); //在资料的读取及写入时游标自动右移 }
/**************************************************************************** Function: Name Description: LCD初始化程序 Input: Output: Notes: *****************************************************************************/ void Lcd_Init(void) { ANSEL = 0x00; Lcd_Delay(10); Lcd_WriteCmd(0x30); Lcd_Delay(1); Lcd_WriteCmd(0x30); Lcd_Delay(1); Lcd_WriteCmd(0x0c); Lcd_Delay(1); Lcd_WriteCmd(0x01); Lcd_Delay(10); }
//====================================================================// // 语法格式:void Lcd_Init(void) // 实现功能:LCD初始化 // 参 数:无 // 返 回 值:无 //====================================================================// void Lcd_Init(void) { LCD_PSB = 1; //并口方式 Lcd_WriteCmd(0x34); //扩充指令操作 delay(5); Lcd_WriteCmd(0x30); //基本指令操作 delay(5); Lcd_WriteCmd(0x0C); //显示开,关光标 delay(5); Lcd_WriteCmd(0x01); //清除LCD的显示内容 delay(5); }
//********************************************************************** // 向 LCD 指定起始位置写入一个字符串 //********************************************************************** void Lcd_WriteStr(unsigned char x,unsigned char y,unsigned char *Str) { Lcd_WriteCmd(0x30); switch(y) { case 0: Lcd_WriteCmd(0x80+x); break; case 1: Lcd_WriteCmd(0x90+x); break; case 2: Lcd_WriteCmd(0x88+x); break; case 3: Lcd_WriteCmd(0x98+x); break; } while(*Str>0) { Lcd_WriteData(*Str); Str++; } }
//当i=0时显示上面128×32,当i=8时显示下面128×32 //当i=0时显示上面128×32,当i=8时显示下面128×32 void Lcd_Fill(u8 test) { u8 x,y,i; for(i=0;i<9;i=i+8) for(y=0;y<0x20;y++) { for(x=0;x<8;x++) { Lcd_WriteCmd(0x36); //扩充指令 绘图显示 Lcd_WriteCmd(y+0x80); //行地址 Lcd_WriteCmd(x+0x80+i); //列地址 Lcd_WriteData(test); //写数据 D15-D8 Lcd_WriteData(test); //写数据 D7-D0 Lcd_WriteCmd(0x30); } } }
//********************************************************************** // 清除液晶GDRAM中的数据 //********************************************************************** void Lcd_Clear(void) { unsigned char i,j,k; Lcd_WriteCmd(0x34); //打开扩展指令集 i = 0x80; for(j = 0;j < 32;j++) { Lcd_WriteCmd(i); Lcd_WriteCmd(0x80); for(k = 0;k < 16;k++) Lcd_WriteData(0x00); Lcd_WriteCmd(i++); Lcd_WriteCmd(0x88); for(k = 0;k < 16;k++) Lcd_WriteData(0x00); } }
//图片取模方式:横向取模,字节正序 void pic_Disp(u8 *pic) //显示Gdram内容(显示图片) { u8 x,y; //for(i=0;i<9;i=i+8) for(y=0;y<16;y++) { for(x=0;x<1;x++) { Lcd_WriteCmd(0x36); //扩充指令,开绘图显示 Lcd_WriteCmd(0x80+y); //行地址 Lcd_WriteCmd(0x80+x); //列地址 Lcd_WriteData(*pic++); //写数据 D15-D8 Lcd_WriteData(*pic++); //写数据 D7-D0 Lcd_WriteCmd(0x30); } } }
void Table_Disp(u8 x,u8 y,u8 *s)//x:0~3 y: { Lcd_WriteCmd(addr_tab[8*x+y]); //写地址 while(*s) { Lcd_WriteData(*s); //写数据 s++; } }
void hanzi_Disp(Uint16 x,Uint16 y,char *s) { Lcd_WriteCmd(addr_tab[8*x+y]); //写地址 while(*s>0) { Lcd_WriteData(*s); //写数据 DelayUS2(1); s++; } }
/*****初始化LCD*****/ void Lcd_Init(void) { RCC->APB2ENR|=1<<3; //使能PORTb时钟 A是2 E是6/// GPIOB->CRH&=0XFF00FFFF; GPIOB->CRH|=0X00330000;//PB12 13 推挽输出 delay_ms(50); Lcd_WriteCmd(0x30); //选择基本指令集 delay_ms(1); Lcd_WriteCmd(0x30); //选择8bit数据流 delay_ms(1); Lcd_WriteCmd(0x0c); //开显示(无游标、不反白) delay_ms(1); Lcd_WriteCmd(0x01); //清除显示,并且设定地址指针为00H delay_ms(30); }
/******************************************************** 名称:GUI_Point(打点) 说明:X:横坐标(代表列的位置,0~127) Y:纵坐标(代表行的位置,0~63) 根据Datesheet需先把数据写到GDRAM,读取当前位置的数据,经过或和移位后再把数据重新写入 GDRAM每行有16个位元,共64行,每个位元有两个8位(高低8位) 计算出在那个位元,在该位元的哪一位 易出现的问题:1、打点位置的定位 2、读取当前显示的数据 3、或和移位,即重新写人的新数据 ********************************************************/ void GUI_Point(u8 x,u8 y,u8 flag) { u8 x_Dyte,x_byte; //定义列地址的字节位,及在字节中的哪1位 u8 y_Dyte,y_byte; //定义为上下两个屏(取值为0,1),行地址(取值为0~31) u8 GDRAM_hbit,GDRAM_lbit; Lcd_WriteCmd(0x36); //绘图模式命令 /***X,Y坐标互换,即普通的X,Y坐标***/ x_Dyte=x/16; //计算在16个字节中的哪一个 x_byte=x&0x0f; //计算在该字节中的哪一位 y_Dyte=y/32; //0为上半屏,1为下半屏 y_byte=y&0x1f; //计算在0~31当中的哪一行 Lcd_WriteCmd(0x80+y_byte); //设定行地址(y坐标) Lcd_WriteCmd(0x80+x_Dyte+8*y_Dyte); //设定列地址(x坐标),并通过8*y_Dyte选定上下屏 Lcd_ReadData(); GDRAM_hbit=Lcd_ReadData(); //读取当前显示高8位数据 GDRAM_lbit=Lcd_ReadData(); //读取当前显示低8位数据 delay_us(5); if(flag==1) { Lcd_WriteCmd(0x80+y_byte); //设定行地址(y坐标) Lcd_WriteCmd(0x80+x_Dyte+8*y_Dyte); //设定列地址(x坐标),并通过8*y_Dyte选定上下屏 delay_us(5); if(x_byte<8) //判断其在高8位,还是在低8位 { Lcd_WriteData(GDRAM_hbit|(0X01<<(7-x_byte))); //显示GDRAM区高8位数据 Lcd_WriteData(GDRAM_lbit); //显示GDRAM区低8位数据 } else { Lcd_WriteData(GDRAM_hbit); Lcd_WriteData(GDRAM_lbit|(0x01<<(15-x_byte))); } } else { Lcd_WriteData(0x00); //清除GDRAM区高8位数据 Lcd_WriteData(0x00); //清除GDRAM区低8位数据 } }
/*****整屏显示横条*****/ void LcdFill_Level(void) { u8 x,y,i; u8 k; for(i=0;i<9;i+=8) for(y=0;y<0x20;y++) { if((y%2)==1) k=0xff; else k=0; for(x=0;x<8;x++) { Lcd_WriteCmd(0x36); //扩充指令 绘图显示 Lcd_WriteCmd(y+0x80); //行地址 Lcd_WriteCmd(x+0x80+i); //列地址 Lcd_WriteData(k); Lcd_WriteData(k); Lcd_WriteCmd(0x30); } } }
void Init_lcd(void) { Init_lcd_Gpio(); DelayUS2(50000); Lcd_WriteCmd(0x30); //选择基本指令集 DelayUS2(10000); Lcd_WriteCmd(0x30); //选择8bit数据流 DelayUS2(10000); Lcd_WriteCmd(0x0c); //开显示(无游标、不反白) DelayUS2(10000); Lcd_WriteCmd(0x01); //清除显示,并且设定地址指针为00H DelayUS2(10000); hanzi_Disp(0,0,"永磁同步电机实验"); hanzi_Disp(1,0,"UDC:000 RPM:0000"); hanzi_Disp(2,0,"IA:00.0 IB:00.0"); hanzi_Disp(3,0,"+000 停止 正常"); }
/*****画点函数*****/ void Lcd_DrawPoint(u8 X,u8 Y,u8 Color ) //0000 1111 0000 0000 { u8 Row , Lie , Lie_bit ; u8 ReadOldH, ReadOldL ; Lcd_WriteCmd(0x34); Lcd_WriteCmd(0x36); Lie=X>> 4 ; //0000 0000 右移4等同于除以16,得到大地址 Lie_bit=X&0x0f ; //0000 1111 15 得到小地址 if(Y<32) { Row=Y; //0000 0000 0 } else { Row=Y-32; Lie+=8; } Lcd_WriteCmd(Row+0x80); //0 Lcd_WriteCmd(Lie+0x80); //0 Lcd_ReadData(); //虚读一次 ReadOldH =Lcd_ReadData(); ReadOldL =Lcd_ReadData(); Lcd_WriteCmd(Row+0x80); Lcd_WriteCmd(Lie+0x80); if(Lie_bit<8) { switch( Color) { case 0 : ReadOldH&=(~(0x01<<(7-Lie_bit))) ; break; //将该点变为0 case 1 : ReadOldH|=(0x01<<(7-Lie_bit)); break; //将该点变为1 case 2 : ReadOldH^=(0x01<<(7-Lie_bit )); break; //将该点翻转 default : break ; } Lcd_WriteData(ReadOldH) ; Lcd_WriteData(ReadOldL) ; } else { switch(Color) { case 0 : ReadOldL&=(~(0x01<<(15-Lie_bit)));break ; //将该点变为0 case 1 : ReadOldL|=(0x01<<(15-Lie_bit));break ; //将该点变为1 case 2 : ReadOldL^=(0x01<<(15-Lie_bit));break ; //将该点翻转 default : break ; } Lcd_WriteData(ReadOldH); Lcd_WriteData(ReadOldL); } Lcd_WriteCmd(0x30); }
//====================================================================// // 语法格式:void Lcd_SetPos(uchar X,uchar Y) // 实现功能:设定显示位置 // 参 数:X - 行,Y - 列 // 返 回 值:无 //====================================================================// void Lcd_SetPos(uchar X,uchar Y) { uchar pos; if (X==0) {X=0x80;} else if (X==1) {X=0x90;} else if (X==2) {X=0x88;} else if (X==3) {X=0x98;} pos = X+Y ; Lcd_WriteCmd(pos); //显示地址 }
/**************************************************************************** Function: Name Description:在LCD写入一个字符 Input: Output: Notes: *****************************************************************************/ void Lcd_StrDisp(u8 x,u8 y,const u8 *s) { const u8 addr_tab[]= { 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, }; Lcd_WriteCmd(addr_tab[8*x+y]); while(*s>0) { Lcd_WriteData(*s); s++; } }
//********************************************************************** // 有反白显示功能的打点函数:(X-水平位址,Y-竖直位址) //********************************************************************** void GUI_Point(unsigned char x,unsigned char y,unsigned char color) { unsigned char x_Dyte,x_byte; //定义列地址的字节位,及在字节中的哪1位 unsigned char y_Dyte,y_byte; //定义为上下两个屏(取值为0,1),行地址(取值为0~31) unsigned char GDRAM_hbit,GDRAM_lbit; Lcd_WriteCmd(0x36); //扩展指令命令 x_Dyte=x/16; //计算在16个字节中的哪一个 x_byte=x&0x0f; //计算在该字节中的哪一位 y_Dyte=y/32; //0为上半屏,1为下半屏 y_byte=y&0x1f; //计算在0~31当中的哪一行 Lcd_WriteCmd(0x80+y_byte); //设定行地址(y坐标) Lcd_WriteCmd(0x80+x_Dyte+8*y_Dyte); //设定列地址(x坐标) Lcd_ReadData(); //预读取数据 GDRAM_hbit=Lcd_ReadData(); //读取当前显示高8位数据 GDRAM_lbit=Lcd_ReadData(); //读取当前显示低8位数据 Lcd_WriteCmd(0x80+y_byte); //设定行地址(y坐标) Lcd_WriteCmd(0x80+x_Dyte+8*y_Dyte); //设定列地址(x坐标) if(x_byte<8) //判断其在高8位,还是在低8位 { if(color==1) { Lcd_WriteData(GDRAM_hbit|(0x01<<(7-x_byte)));//置位GDRAM区高8位数据中相应的点 } else Lcd_WriteData(GDRAM_hbit&(~(0x01<<(7-x_byte))));//清除GDRAM区高8位数据中相应的点 Lcd_WriteData(GDRAM_lbit); //显示GDRAM区低8位数据 } else { Lcd_WriteData(GDRAM_hbit); if(color==1) Lcd_WriteData(GDRAM_lbit|(0x01<<(15-x_byte)));//置位GDRAM区高8位数据中相应的点 else Lcd_WriteData(GDRAM_lbit&(~(0x01<<(15-x_byte))));//清除GDRAM区高8位数据中相应的点 } Lcd_WriteCmd(0x30); //恢复到基本指令集 }
/**************************************************************************** Function: Name Description: LCD清屏 Input: Output: Notes: *****************************************************************************/ void Lcd_ClrScreen(void) { Lcd_WriteCmd(CLEAR_SCREEN); }
/*****显示一个字节*****/ void Disp_achar(u8 x,u8 y,u8 achar)//x:0~3 y: { Lcd_WriteCmd(addr_tab[8*x+y]); //写地址 Lcd_WriteData(achar); //写数据 }