void display(void) {
write_12864com(0x80);// RAM区首地址,第一行首地址 write_12864dat(0xb0);// “ ” write_12864dat(0xa0); delay2(20);
write_12864dat(0xb3);// “锄” write_12864dat(0xfa); delay2(20);
write_12864dat(0xba);// “禾” write_12864dat(0xcc); delay2(20);
write_12864dat(0xc8);// “日” write_12864dat(0xd5); delay2(20);
write_12864dat(0xb5);// “当” write_12864dat(0xb1); delay2(20);
write_12864dat(0xce);// “午” write_12864dat(0xe7); delay2(20);
write_12864dat(0x2c);// “,” delay2(40);
write_12864com(0x90);//第二行首地址 write_12864dat(0xb0);// “ ” write_12864dat(0xa0); delay2(20);
write_12864dat(0xba);// “汗” write_12864dat(0xba); delay2(20);
21
write_12864dat(0xb5);// “滴” write_12864dat(0xce); delay2(20);
write_12864dat(0xba);// “禾” write_12864dat(0xcc); delay2(30);
write_12864dat(0xcf);// “下” write_12864dat(0xc2); delay2(20);
write_12864dat(0xcd);// “土” write_12864dat(0xc1); delay2(20);
write_12864dat(0x2e);// “。” delay2(40);
write_12864com(0x88);//第三行首地址 write_12864dat(0xb0);// “ ” write_12864dat(0xa0); delay2(20);
write_12864dat(0xcb);// “谁” write_12864dat(0xad); delay2(20);
write_12864dat(0xd6);// “知” write_12864dat(0xaa); delay2(20);
write_12864dat(0xc5);// “盘” write_12864dat(0xcc); delay2(20);
write_12864dat(0xd6);// “中” write_12864dat(0xd0); delay2(20);
22
write_12864dat(0xb2);// “餐” write_12864dat(0xcd); delay2(20);
write_12864dat(0x2c);// “,” delay2(40);
write_12864com(0x98);//第四行首地址 write_12864dat(0xb0);// “ ” write_12864dat(0xa0); delay2(20);
write_12864dat(0xc1);// “粒” write_12864dat(0xa3); delay2(20);
write_12864dat(0xc1);// “粒” write_12864dat(0xa3); delay2(20);
write_12864dat(0xbd);// “皆” write_12864dat(0xd4); delay2(20);
write_12864dat(0xd0);// “辛” write_12864dat(0xc1); delay2(20);
write_12864dat(0xbf);// “苦” write_12864dat(0xe0); delay2(20);
write_12864dat(0x2e);// “。” delay2(40); }
5.3程序调试中的注意问题
1、数据类型要正确,头文件要包含iom8v.h和macros.h。
23
2、延时函数的使用。在初始化及显示函数中,延时时间要适当长些,以正常稳定地显示汉字。所以,在编写程序时,我编写了两个延时函数,以供不同延时时间的需要。同时,在进行LCD显示时,我发现每个汉字显示时,同样要较长时间的延时间隔,以达到观察清晰的效果。
3、PORTB和PORTC均为输出,所以应将DDRX相应位设为1,即打开PORTB和PORTC端口。
4、逻辑运算符号不能出错,‘&’表示按位与的运算,‘&&’表示和运算。我在编写程序时,将write函数中的‘&’写成了‘&&’,导致程序编译时正确,但将程序写入芯片时,LCD却不能显示汉字。
5、值得提出的是,当硬件焊接完成,程序编写完成后,将程序下载到单片机上时,LCD并没有出现预期的结果,即并没有显示汉字。这时,当初步检查了程序和硬件焊接均无误后,继续下载程序,但仍然不显示汉字。所以,就用了一个测试函数来测试该单片机是否焊接正确。该函数为:
Void test (void) {
DDRB=0XFF; DDRC=0XFF;
PORTC|=0x08;//0000,1000 PC3=1 //PORTC&=0xf7;//1111,0111 PC3=0 PORTC|=0x10;//0001,0000 PC4=1 //PORTC&=0xef;//1110,1111 PC4=0 PORTC|=0x20;//0010,0000 PC5=1 //PORTC&=0xdf;//1101,1111 PC5=0 PORTB|=0x01;//0000,0001 PB0=1 //PORTB&=0xfe;//1111,1110 PB0=0 PORTB|=0x02;//0000,0010 PB1=1 //PORTB&=0xfd;//1111,1101 PB1=0 PORTB|=0x04;//0000,0100 PB2=1 //PORTB&=0xfb;//1111,1011 PB2=0 PORTB|=0x08;//0000,1000 PB3=1 //PORTB&=0xf7;//1011,1111 PB3=0 PORTB|=0x10;//0001,0000 PB4=1 //PORTB&=0xef;//1110,1111 PB4=0 }
执行该函数后,用万用表分别测试ATMEGA8的PC3、PC4、PC5、PB0、PB1、PB2、
24
PB3、PB4是否均为高电平;之后再修改上述函数将相应端口的位置为0,再用万用表分别测试ATMEGA8的PC3、PC4、PC5、PB0、PB1、PB2、PB3、PB4是否均为低电平。
通过测试,发现将ATMEGA8的第23引脚和第24引脚相连了,经过拨离后,执行该函数,并进行硬件检测,得出结果ATMEGA8焊接最终正常。
再次进行下载程序,但LCD仍然没有显示汉字。之后,又进行了对RS,RW,E引脚的检测。检测函数为:
Void test2(void)
{
DDRB=0XFF; DDRC=0XFF;
PORTC|=0x01;//0000,0001 rs=1 PC0=1 PORTC&=0xfd;//1111,1101 rw=0 PC1=0 PORTC&=0xfb;//1111,1011 e=0 PC2=0 PORTC&=0xfe;//1111,1110 rs=0 PC0=0 PORTC|=0x02;//0000,0010 rw=1 PC1=0 PORTC|=0x04;//0000,0100 e=1 PC2=1 }
检测方法同上,检测结果为焊接正确。
鉴于以上检测,则对initial函数进行检测。由于initial函数中先执行延时函数,之后执行了write_12864com函数,则进入write_12864com函数检测,而该函数在执行了RS=0,RW=0和E=0后,又执行了延时函数,上面已检测过RS、RW、E均无焊接错误,且延时函数无误,接着,执行write函数。于是进行write函数检测,检测函数为:
Void test3(void) {
DDRB=0XFF; DDRC=0XFF; Write_12864com(0x30); }
void write_12864com(unsigned char b) {
PORTC&=0xfe;//1111,1110 rs=0 PC0=0 PORTC&=0xfd;//1111,1101 rw=0 PC1=0 PORTC&=0xfb;//1111,1011 e=0 PC2=0
25