/************************************************/ /*功 能:使用51内核的单片机驱动的字符型液晶LCD*/ /*LCD型号:TC1604A */ /*MCU型号:STC89C54RD+ */ /*编程语言:C51(KEIL C) */ /*编写者:王兴权 */ /************************************************/ /*TC1604的管脚说明 */ /* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 */ /* VSS VDD VL RS R/W ET D0 D1 D2 D3 D4 D5 D6 D7 BLA BLK */ /*数据手册见文件夹中的数据手册 */ #include //LCD1604与微处理器的端口映射关系定义 #define LCD_Data_BUS P0 /*数据端 */ sbit LCD_RS=P1^0;/*数据/命令选择端:H/L */ sbit LCD_RW=P1^1;/*读/写选择端:H/L */ sbit LCD_ET=P1^2;/*使能控制端 */ /*LCD的各种状态的指令码定义*/ #define LCD_CODE_RESET 0x38 #define LCD_CODE_SETUP 0x08 #define LCD_CODE_SETUP_CUR_FLASH 0x01 #define LCD_CODE_CLEAR 0x01 #define LCD_CODE_SET_OFFSET 0x80 #define LCD_Display_DELAY 250 #define HIGHT 1 #define LOW 0 /*行设置 */ #define line_1 0x00 #define line_2 0x40 #define line_3 0x10 #define line_4 0x50 /****************LCD程序&&&&&&&&&&&&&&&&&&/ /************************************/ /*函数名称:Delay_LCD */ /*函数功能:LCD的延时函数 */ /*传递参数:无 */ /*返 回 值:无 */ /*备 注: */ /************************************/ void Delay_LCD() { unsigned int j; for(j=0;j<300;j++) {;} } /************************************/ /*函数名称:Write_LCD_Command */ /*函数功能:LCD的写指令函数 */ /*传递参数:指令码(comm) */ /*返 回 值:无 */ /*备 注: */ /************************************/ void Write_LCD_Command(comm) unsigned char comm; { LCD_RS = LOW; LCD_RW = LOW; LCD_ET = LOW; LCD_Data_BUS = comm; LCD_ET = HIGHT; Delay_LCD(); LCD_ET = LOW; } /************************************/ /*函数名称:Read_LCD_Status */ /*函数功能:读LCD的状态 */ /*传递参数:无 */ /*返 回 值:状态数据 */ /*备 注: */ /************************************/ unsigned char Read_LCD_Status() { unsigned char dat; LCD_ET = LOW; //收回使能 LCD_Data_BUS = 0xFF; LCD_RS = LOW; //命令 LCD_RW = HIGHT; //送写使能 LCD_ET = HIGHT; //使能 dat = LCD_Data_BUS; LCD_ET = LOW; //收回片选 return(dat); } /************************************/ /*函数名称:Write_LCD_Data */ /*函数功能:LCD的写数据函数 */ /*传递参数:所写数据wdata(1个字节) */ /*返 回 值:无 */ /*备 注: */ /************************************/ void Write_LCD_Data(wdata) unsigned char wdata; { LCD_RS = HIGHT; LCD_RW = LOW; LCD_ET = LOW; LCD_Data_BUS = wdata; LCD_ET = HIGHT; Delay_LCD(); LCD_ET = LOW; } /************************************/ /*函数名称:Init_LCD */ /*函数功能:LCD的初始化函数 */ /*传递参数:无 */ /*返 回 值:无 */ /*备 注: */ /************************************/ void Init_LCD() { Delay_LCD(); Write_LCD_Command(LCD_CODE_RESET); Delay_LCD(); Write_LCD_Command(LCD_CODE_RESET); Delay_LCD(); Write_LCD_Command(LCD_CODE_RESET); Delay_LCD(); Write_LCD_Command(LCD_CODE_RESET); Delay_LCD(); Write_LCD_Command(LCD_CODE_SETUP); Write_LCD_Command(LCD_CODE_CLEAR); Write_LCD_Command(0x06); Write_LCD_Command(0x0C); } /************************************/ /*函数名称:Clear_LCD */ /*函数功能:清屏函数 */ /*传递参数:无 */ /*返 回 值:无 */ /*备 注: */ /************************************/ void Clear_LCD() { Write_LCD_Command(LCD_CODE_CLEAR); } /************************************/ /*函数名称:Clear_LCD */ /*函数功能:设置坐标*/ /*传递参数:Line,Row*/ /*返 回 值:0/1*/ /*备 注:*/ /************************************/ unsigned char Set_LCD_XY(Line,Row) unsigned char Line; unsigned char Row; { unsigned char Delay,Data = 0; Delay = LCD_Display_DELAY; while(Delay > 0){ Data = Read_LCD_Status(); if ((Data & 0x80) == 0){ Write_LCD_Command((Line + Row) + LCD_CODE_SET_OFFSET); return(0); } Delay--; } return(1); } /************************************/ /*函数名称:Cursor_Glint */ /*函数功能:光标闪烁控制函数 */ /*传递参数:0/1 */ /*返 回 值:无 */ /*备 注:0是关,1是开 */ /*下面两句结合控制光标的闪烁位置*/ /* Set_LCD_XY(line_2,6);*/ /* Cursor_Glint(1);*/ /************************************/ void Cursor_Glint(NoOff) unsigned char NoOff; { unsigned char com; com=NoOff << 2; com |= 13; Write_LCD_Command(com); } /************************************/ /*函数名称:Display_BCDToLCD */ /*函数功能:在LCD显示BCD码的数字函数 */ /*传递参数:dat */ /*返 回 值:无 */ /*备 注: */ /************************************/ void Display_BCDToLCD(dat) unsigned char dat; { unsigned char b; b= (dat>>4)&0x0f;//高四位 if (b<10){ Write_LCD_Data('0'+b); }else{ Write_LCD_Data('A'+(b-10)); } b = dat & 0x0f;//低四位 if (b<10){ Write_LCD_Data('0'+b); }else{ Write_LCD_Data('A'+(b-10)); } //Write_LCD_Data(' '); //空格 } /************************************/ /*函数名称:Display_Strings */ /*函数功能:LCD显示字符串函数 */ /*传递参数:line,strings,number*/ /*返 回 值:*/ /*备 注:line是显示行的位置参数,可以取得的值可*/ /* 以是line_1,line_2,line_3,line_4*/ /* strings是要显示的字符串,使用""括起来*/ /* number是显示的字符串的个数*/ /*调用格式:Display_Strings(line_2+2,"Display",7);*/ /*含义:从第2行的第2个位置开始显示Display*/ /************************************/ void Display_Strings(line,strings,number) unsigned char line; char *strings; unsigned int number; { unsigned char i; Write_LCD_Command(line+0X80); for(i=0;i0;Delay--) { for(i=1000;i>0;i--); } } /************************************/ /*函数名称:main */ /*函数功能:主函数*/ /*传递参数:*/ /*返 回 值:*/ /*备 注:*/ /************************************/ main() { unsigned int cishu; Init_LCD(); //Write_LCD_Data(0x65); //Write_LCD_Data('A'); //Delay_System(65534); //Clear_LCD(); Display_Strings(line_1+4,"LCD Test",8); //下面两句结合控制光标的闪烁位置 //Set_LCD_XY(line_2,6); //Cursor_Glint(1); for(cishu=0;cishu<=99;cishu++) { Init_LCD(); Display_Strings(line_1+4,"LCD Test",8); Set_LCD_XY(line_3,6); Display_BCDToLCD(cishu); Delay_System(100); if(cishu==99) cishu = 0; } }