时序图
仿真效果
#include"AT89X51.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define lcd1602_DB P3
sbit RS=P2^5;
sbit RW=P2^6;
sbit E=P2^7;
u8 temp_buf[5]={0};
u16 temp_value;
float temp;
void delay_us(u16 us)
{
while(us--);
}
void lcd1602_wrire_cmd(u8 cmd)//写指令
{
RS=0;
RW=0;
E=0;
lcd1602_DB=cmd;
delay_us(1000);
E=1;
delay_us(1000);
E=0;
}
void lcd1602_init(void)//初始化
{
lcd1602_wrire_cmd(0x38);//数据总线 8 位,显示 2 行,5*7 点阵/字符
lcd1602_wrire_cmd(0x0c);//显示功能开,无光标,光标闪烁
lcd1602_wrire_cmd(0x06);//写入新数据后光标右移,显示屏不移动
lcd1602_wrire_cmd(0x02);
lcd1602_wrire_cmd(0x01);//清屏
}
void lcd1602_wrire_date(u8 dat)//写数据
{
RS=1;
RW=0;
E=0;
lcd1602_DB=dat;
delay_us(1000);
E=1;
delay_us(1000);
E=0;
}
void lcd1602_clear()
{
lcd1602_wrire_cmd(0x01);
}
void lcd1602_display(u8 x,u8 y,u8 *str)//x=0~15(位) y=0~1(行)
{
u8 i=0;//i是判断有没有超过第一行的,当i在循环内一直加1,显示地址也一直加1,指针逐个加1扫描且当“\0”的时候停止循环
if(x>15||y>1) return;
if(y<1)//第一行
{
while(*str!='\0')
{
if(i<16-x)//如果字符长度超过第一行显示范围,则在第二行继续显示
{
lcd1602_wrire_cmd(0x80+i+x);//第一行显示地址设置
}
else
{
lcd1602_wrire_cmd(0x40+0x80+i+x-16);//第二行显示地址设置,i+x-16是上一行未显示的数据
}
lcd1602_wrire_date(*str);
str++;
i++;
}
}
else
{
while(*str!='\0')
{
if(i<16-x)//如果字符长度超过第二行显示范围,则在第一行继续显示
{
lcd1602_wrire_cmd(0x40+0x80+i+x);
}
else
{
lcd1602_wrire_cmd(0x80+i+x-16);
}
lcd1602_wrire_date(*str);
str++;
i++;
}
}
}
void main()
{
lcd1602_init();
temp=38.6; //温度通常为浮点数类型,我们通常用数组来转换显示(+0x30)
temp_value=temp*10;
temp_buf[0]=temp_value/100+0x30;//百位
temp_buf[1]=temp_value%100/10+0x30;//个位
temp_buf[2]='.';
temp_buf[3]=temp_value%100%10+0x30;//小数第一位
temp_buf[4]='\0';
lcd1602_display(0,0,temp_buf);
lcd1602_display(0,1,"Hell0 Word!");//第二行数据显示
while(1)
{
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)