#include "all.h"
u8 xdata LCD1602_Write_Buffer1[16];
u8 xdata LCD1602_Write_Buffer2[16];
u8 code LCD1602_5x8[8]={0x08,0x00,0x07,0x08,0x08,0x08,0x08,0x07};
u8 xdata LCD1602_Write_Cursor_Add;
void LCD1602_Delay(u8 len)
{
u8 idata i;
while(len--)
{
i=15;
while(i--);
}
}
void LCD1602_Write_Add(u8 Add) //写地址命令
{
LCD1602_RS=0;
LCD1602_E=0;
LCD1602_Delay(10);
LCD1602_E=1;
HC595_Write_Buffer[0]=Add;
HC595_Write_Buffer[1]=0;
HC595_Write_Data_Drive();
LCD1602_E=0;
}
void LCD1602_Write_Dat(u8 Dat) //写内容
{
LCD1602_RS=1;
LCD1602_E=0;
LCD1602_Delay(10);
LCD1602_E=1;
HC595_Write_Buffer[0]=Dat;
HC595_Write_Buffer[1]=0;
HC595_Write_Data_Drive();
LCD1602_E=0;
}
void LCD1602_Init()
{
u8 i;
P4M0&=0x9f;
P4M1&=0x9f;//P4.6 P4.5 准双向口模式
LCD1602_Write_Add(0x38);
LCD1602_Delay(250);
LCD1602_Write_Add(0x01);
LCD1602_Delay(250);
LCD1602_Write_Add(0x02);
LCD1602_Delay(250);
LCD1602_Write_Add(0x06);
LCD1602_Delay(250);
LCD1602_Write_Add(0x0C);
LCD1602_Delay(250);
LCD1602_Write_Add(0x14);
LCD1602_Delay(250);
LCD1602_Write_Add(0x40);//自定义存储空间起始地址
for(i=0;i<8;i++)
{
LCD1602_Write_Dat(LCD1602_5x8[i]);
}
}
void LCD1602_Display_Ser()
{
u8 i;
LCD1602_Write_Add(0x80);
for(i=0;i<16;i++)
{
LCD1602_Write_Dat(LCD1602_Write_Buffer1[i]);
}
LCD1602_Write_Add(0xC0);
for(i=0;i<16;i++)
{
LCD1602_Write_Dat(LCD1602_Write_Buffer2[i]);
}
switch(LCD1602_Write_Cursor_Add)
{
case 0:LCD1602_Write_Add(0x0C);break;//不显示也不闪烁光标
case 1:LCD1602_Write_Add(0x0F);LCD1602_Write_Add(0xCa);break;
case 2:LCD1602_Write_Add(0x0F);LCD1602_Write_Add(0xCd);break;
case 3:LCD1602_Write_Add(0x0F);LCD1602_Write_Add(0xC7);break;
case 4:LCD1602_Write_Add(0x0F);LCD1602_Write_Add(0xC4);break;
case 5:LCD1602_Write_Add(0x0F);LCD1602_Write_Add(0xC1);break;
case 6:LCD1602_Write_Add(0x0F);LCD1602_Write_Add(0xCf);break;
case 7:LCD1602_Write_Add(0x0F);LCD1602_Write_Add(0x89);break;
case 8:LCD1602_Write_Add(0x0F);LCD1602_Write_Add(0x86);break;
case 9:LCD1602_Write_Add(0x0F);LCD1602_Write_Add(0x83);break;
}
}
一、以上代码,主函数大循环前面初始化P4IO口为准双向口
二、主函数大循环前面需要初始化LCD1602_Init();
三、我们是使用595转换给LCD的D0~D7。你们可以直接用P2口赋值给LCD。
四、主函数每500ms 调用LCD1602_Display_Ser()函数。实现数据每半秒刷新一次即可。省掉读忙的过程。
五、两个LCD1602_Write_Buffer[];数组,分别是上下两行的显存。其他地方有需要,就往里面丢ASCII值就可以了。比如0x30+5.液晶显示数字5
六、以上代码由《人人学会单片机》视频教程原创书写。其他地方引用请注明出处!
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』