完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
要实现在第一行显示字符后清屏 再在第二行显示 这样循环。但是循环多次后,就会乱码?实在不解,个人觉得是延时的问题。但调来挑去还不行?希望大侠们给看看,还有一个问题就是1602初始化顺序,各个初始化命令的前后顺序也会影响程序的在单片机上的运行,这又是为什么呢???实在不解??望大神们指点。! #include #include #define uint unsigned int #define uchar unsigned char ***it lcdEP=P2^7; ***it lcdRS=P2^6; ***it lcdRW=P2^5; uchar code str[]={"shan bo ke ji"}; void delay(uchar ms { uchar j; while(ms--) { for(j=249;j>0;j--) { _nop_(); _nop_();//250us*4=1ms _nop_(); _nop_(); } } } /****侧忙****/ bit lcd_testb() { bit result; lcdEP=1; lcdRS=0; lcdRW=1; _nop_(); _nop_(); _nop_(); _nop_(); result=(bit)(P0 & 0x80); lcdEP=0;//使能置回低电平 return result; } /*****写命令****/ void lcd_wcmd(uchar cmd) { // while(result);// while(lcd_testb()); lcdEP=0; lcdRS=0; lcdRW=0; _nop_(); //这里初始化需要一些延时 _nop_(); _nop_(); P0=cmd; _nop_();//这里还没有写数据不用延时。 _nop_(); _nop_(); lcdEP=1; _nop_(); _nop_(); _nop_(); _nop_(); lcdEP=0; } /*****设置显示位置**/ void lcd_pos(uchar x,uchar y)//好好理解这样写的原因 { //uchar pos; if(y==0) lcd_wcmd(x+0x80); else lcd_wcmd(x+0xc0); } /******写数据*****/ void lcd_wdat(uchar dat) { lcdEP=0; lcdRS=1; lcdRW=0; _nop_(); _nop_(); _nop_(); P0=dat; _nop_();//这里还没有写数据不用延时。 _nop_(); _nop_(); lcdEP=1; _nop_(); _nop_(); _nop_(); lcdEP=0; } /****初始化***/ lcd_init() { //LCD初始化设定 lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据 delay(1); lcd_wcmd(0x0c); //显示开,关光标 delay(1); lcd_wcmd(0x06); //移动光标 delay(1); lcd_wcmd(0x01); //清除LCD的显示内容 delay(1); } void main() //慎用while(1)一个主函数中只能用一个 否则函数必定会出现问题。 { uchar i; lcd_init(); delay(10); while(1) { i=0; lcd_pos(0,0); delay(50); while(str !=' |