#include #include #include #include "LCD1602.h" #include "delay.h" //LCD端口初始化 void LCDPort_Init(void) { LCD_BUS = 0X00; LCD_BUS_Direction_REG =0XFF; //LCD数据端口设置为输出 LCD_ControlPort_CLR; //RW RW EN低电平 LCD_ControlPort_SET; //RS RW EN脚均设置为输出 } //LCD初始化 void LCD_Init(void) { delay_ms(400); Write_Com(0x01);//清屏 delay_ms(5); Write_Com(0x38);//显示模式设置 16*2,5*7点阵,8位数据接口 delay_ms(5); Write_Com(0x38);//显示模式设置 16*2,5*7点阵,8位数据接口 delay_ms(5); Write_Com(0x38);//显示模式设置 16*2,5*7点阵,8位数据接口 delay_ms(5); Write_Com(0x06);//光标设置,读或写一个字符后,地址指针加1,光标加1,整屏不移动 delay_ms(5); //Write_Com(0x0f);//显示开关控制,开显示,光标显示,光标闪烁 Write_Com(0x0c);//显示开关控制,开显示,光标不显示,光标不闪烁 delay_ms(5); } //LCD写指令 void Write_Com(unsigned char LCD_Com) { // Check_Busy(); RS_CLR; //RS=0,写指令 RW_CLR; //RW=0,写命令 EN_SET; //E=1,写操作 LCD_BUS=LCD_Com; //数据送往数据端口? delay_ms(1); //这个延时非常重要,结合时序图来理解,可以跟送数据顺序调换 EN_CLR;// E=0,下角 delay_ms(1); } //LCD写字节数据 void Write_Data_Byte(unsigned char LCD_Data) { // Check_Busy(); RS_SET; //RS=1,数据寄存器 RW_CLR;//RW=0,写入 EN_SET; //写操作 LCD_BUS=LCD_Data; //数据送数据端口 delay_ms(1); //这个延时非常重要 EN_CLR; //E=0,下降沿送数据 delay_ms(1); } //指定当前写字符的位置 void Write_Place_xy(unsigned char x,unsigned char y) { unsigned char address; if(y==0) //行位置 { address=0x80+x; //列位置 } else { address=0xc0+x; } Write_Com(address); //写地址 } //在指定的(x,y)位置写入字符数据 void Write_Data_Char(unsigned char x,unsigned char y,unsigned char Data) { Write_Place_xy(x,y); delay_ms(1); Write_Data_Byte(Data); } //在指定的位置写字符串 void Write_Data_String(unsigned char x,unsigned char y,unsigned char *data) { unsigned char i; unsigned char Length; Write_Place_xy(x,y); //写地址 delay_ms(1); Length=strlen(data);//调用字符串函数算出字符的长度,并赋值给Length for(i=0;i Write_Data_Byte(*data); //显示单个字符 data++; } //也可以用下面这个算法来显示字符串 /* while(*data) { Write_Data_Byte(*data);//写字符 data++; //地址指针加1 }*/ } //读写检测函数,每次对液晶操作前都要进行读写检测 void Check_Busy(void) { LCD_BUS_Direction_REG = 0X00; //PB口为输入口,准备读取数据 RS_CLR; //RS=0,指令寄存器 RW_SET; //读操作 EN_SET; //使能(读操作都为高电平,写操作下降沿有效) delay_ms(5); while(0x80&LCD_BUS_READ_DATA) //读入PB7口,为高电平则忙,执行E=0; EN_CLR; LCD_BUS_Direction_REG = 0XFF; //直到PB7口(BF标志位)为0,PB口置为输出口,准备向端口发送数据 } /*显示屏清空显示*/ void LCD_clear(void) { Write_Com(0x01); delay_ms(5); }