为什么lcd1602第一行有第二行的

2024-12-12 10:52:59
推荐回答(1个)
回答1:

#include
#define uchar unsigned char
#define uint unsigned int
uchar table1[]=" hello!HELLO"; //显示的第一段内容
uchar table2[]="leeeeeee"; //显示的第二段内容
void init();
void write_com(uchar com);
void write_date(uchar dat);
sbit Rs=P2^0;
sbit Rw=P2^1;
sbit E=P2^2;
void delay(uchar time)
{
uchar i,j;
for(i=time;i>0;i--)
{
for(j=125;j>0;j--);
}
}

void init()
{
write_com(0x01);
write_com(0x06);
write_com(0x0c);
write_com(0x14);
write_com(0x38);
delay(5);
}

void write_com(uchar com)
{
delay(1);
Rs=0; //允许写指令
Rw=0; //允许写
E=0 ;
P0=com; //写指令
delay(1);
E=1; //把指令传出去
delay(1);
E=0;
}

void write_date(uchar dat)
{
delay(1);
E=0;
Rs=1; //允许写数据
Rw=0;
P0=dat; //写数据
delay(3);
E=1;
delay(3);
E=0;
}

void main()
{
uint m;
init();

write_com(0x80);

//这里的table1数组越界了
//因为table1包括结尾字符一共才14个字节的长度
//而table1和table2连续存储,所以就会接着引用
//table2的两个字符,所以最好按照数组的实际长度写
//for(m =0; m<13;m++)
for(m=0;m<16;m++)
{
write_date(table1[m]);
delay(1);
}

delay(5);
write_com(0x80+0x40);
//这里也是一样的
//for(m=0;m<8;m++)
for(m=0;m<16;m++)
{
write_date(table2[m]);
delay(1);
}
while(1);
}