1602显示异常,字符歪了?

2019-07-18 12:03发布

1602显示异常,字符歪了,自上而下滚动,求指点,附上程序
显示.JPG

程序:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define lcd_data  P0
  6. sbit    rs=P1^2;  //加上拉
  7. sbit    rw=P1^1;  //加上拉
  8. sbit    e =P1^0;  //加上拉
  9. sbit key1=P3^3;
  10. sbit key2=P3^4;
  11. sbit key3=P3^5
  12. sbit led=P2^0;
  13. sbit in=P3^2;
  14. sbit beer=P3^7;
  15. uchar table[]="0123456789" ;
  16. uchar i,a,shuzhi,kaiji,show,save;
  17. uint num,mun,num1,num2,num3,num4,numall;
  18. bit fleg;
  19. void init()
  20. {
  21. fleg=1;
  22. beer=0;
  23. key1=1;
  24. key2=1;
  25. key3=1;
  26. in=1;
  27. EA=1;
  28. EX0=1;
  29. IT0=1;
  30. }
  31. void delayms(uchar aa)
  32. {
  33. for(i=aa;i>0;i--)
  34. {
  35. _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  36. }        
  37. }
  38. void delay(uchar z)
  39. {
  40. uchar x,y;
  41. {
  42. for(x=z;x>0;x--)
  43. for(y=110;y>0;y--);
  44. }
  45. }
  46. //1602LCD写地址函数
  47. void adr_write(unsigned char adr)
  48. {
  49. delay(20);
  50. e=0;
  51.              rs=0;
  52.              rw=0;
  53.              e=1;
  54.              lcd_data=adr;
  55.              e=0;
  56.            }
  57. void lcd_init(void)
  58.           {
  59.                    e=0;        
  60.                    adr_write(0x38); //两行显示,5*7模式
  61.                adr_write(0x01);//清显示
  62.            adr_write(0x0c); //整体显示打开,不显示光标
  63.            adr_write(0x06);
  64.            adr_write(0x80);//从第一行的第一个位置开始显示
  65.           }
  66. void ddr_write(unsigned char ddr)
  67.           {
  68. //                        adr_write(0x06);
  69.                         delay(20);
  70.             e=0;
  71.             rs=1;
  72.             rw=0;
  73.             e=1;
  74.             lcd_data=ddr;
  75.             e=0;
  76.           }
  77. void str_write(unsigned char *str)
  78.                   {
  79. //                                 adr_write(0x07);
  80.                                 while(*str!='')
  81.                                 {
  82.                                         ddr_write(*str);
  83. //                                        delay_1602(200);
  84.                                         str++;
  85.                                 }        
  86.         }
  87. void set_point(unsigned char x,y)
  88.           {
  89.                         if(!x)
  90.                                 adr_write(0x80+y);
  91.                         else
  92.                                 adr_write(0x80+0x40+y);
  93.           }
  94. void display_init()
  95. {
  96.     set_point(0,0) ;
  97.         str_write("Please Power On!");
  98.         set_point(1,0) ;
  99.         str_write("                ");
  100. }
  101. void display_on()
  102. {
  103.     set_point(0,0) ;
  104.         str_write("Has Boot!       ");
  105.         set_point(1,0) ;
  106.         str_write("Think You!      ");
  107. }
  108. void dis_play()
  109. {
  110.     set_point(0,0) ;
  111.         str_write("DianDuShuZhi:");
  112.         ddr_write(table[numall/100]);
  113.         ddr_write(table[numall/10%10]);
  114.         ddr_write(table[numall%10]);
  115.         set_point(1,0) ;
  116.         str_write("                ");
  117. }
  118. void dis_play_all()
  119. {
  120.     set_point(0,0) ;
  121.         str_write("DS1:");
  122.         ddr_write(table[num1/100]);
  123.         ddr_write(table[num1/10%10]);
  124.         ddr_write(table[num1%10]);
  125.         str_write("  ");
  126.         str_write("DS2:");
  127.         ddr_write(table[num2/100]);
  128.         ddr_write(table[num2/10%10]);
  129.         ddr_write(table[num2%10]);
  130.         set_point(1,0) ;
  131.         str_write("DS3:");
  132.         ddr_write(table[num3/100]);
  133.         ddr_write(table[num3/10%10]);
  134.         ddr_write(table[num3%10]);
  135.         str_write("  ");
  136.         str_write("DS4:");
  137.         ddr_write(table[num4/100]);
  138.         ddr_write(table[num4/10%10]);
  139.         ddr_write(table[num4%10]);        
  140. }
  141. void key_scan()
  142. {
  143.   if(key1==0)
  144.   {
  145.       delay(10);
  146.           if(key1==0)
  147.           {
  148.                while(!key1);
  149.                    kaiji=1;
  150.                    led=0;
  151.                    beer=1;
  152.                    delay(100);
  153. beer=0;
  154.                    display_on();
  155.           }
  156.   }
  157.   if(kaiji==1&&key2==0)
  158.   {
  159.      delay(10);
  160.          if(key2==0)
  161.          {
  162.              while(!key2);
  163.                  beer=1;
  164.                  delay(100);
  165.                  beer=0;
  166.                  shuzhi++;
  167.                  if(shuzhi==4) shuzhi=0;
  168.                  if(shuzhi==0)
  169.                  {
  170.                      num1=mun;
  171.                          numall=num1;
  172.                          dis_play();
  173.                  }
  174.                  if(shuzhi==1)
  175.                  {
  176.                      num2=mun;
  177.                          numall=num2;
  178.                          dis_play();
  179.                  }
  180.                  if(shuzhi==2)
  181.                  {
  182.                      num3=mun;
  183.                          numall=num3;
  184.                          dis_play();
  185.                  }
  186.                  if(shuzhi==3)
  187.                  {
  188. num4=mun;
  189.                          numall=num4;
  190.                          dis_play();
  191.                  }                 
  192.          }
  193.   }
  194.   if(kaiji==1&&key3==0)
  195.   {
  196.       delay(10);
  197.           if(key3==0)
  198.           {
  199.                while(!key3);
  200.                    beer=1;
  201.                    delay(100);
  202.                    beer=0;
  203.                    dis_play_all();
  204.           }
  205.   }
  206. }
  207. void main()
  208. {
  209.         init();
  210.         lcd_init();
  211.         display_init();
  212.         //delayms(45);//0.642ms
  213.         //delayms(35);//0.502ms
  214.         //delayms(115);//1.623ms
  215.         //delayms(72);//1.02ms
  216.         //delayms(84);//1.188ms
  217.         //delayms(31);//0.446ms
  218.         while(1)
  219.         {
  220.         key_scan();
  221.         }
  222. }
  223. void sieasdf() interrupt 0
  224. {
  225.         EX0=0;
  226.         for(a=5;a>0;a--)
  227.         {
  228.                 delayms(35);//延时0.5ms 判断5次  5*0.5=2.5ms
  229.                 if(in)fleg=0;
  230.         }
  231.         if(fleg)
  232.         {
  233.                 delayms(72);//延时1ms  判断是不是高电平了
  234.                 if(in)
  235.                 {
  236.                         delayms(115);//延时让它超过2ms; 2.5+1+1.623=5.123ms  开始读数据
  237.                         for(a=10;a>0;a--)
  238.                         {
  239.                                 while(!in);
  240.                                 delayms(86);
  241.                                 num=num>>1;
  242.                                 if(in)
  243.                                         {
  244.                                                 num=num|0x200;
  245.                                                 delayms(31);//延时0.6ms 因为上面延时1.2ms+0.6 刚好跳过1.5ms
  246.                                         }
  247.                         }        
  248.                         mun=num;
  249.                 }
  250.         }
  251.         fleg=1;
  252.         EX0=1;}
复制代码


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
武力戡乱
1楼-- · 2019-07-18 14:38
你把显示屏幕放正了!这个算一个bug!
xianyoudian
2楼-- · 2019-07-18 15:20
武力戡乱 发表于 2015-5-31 20:58
你把显示屏幕放正了!这个算一个bug!

放正,字符还是从上往下移动,我要从左往右移动
武力戡乱
3楼-- · 2019-07-18 16:32
 精彩回答 2  元偷偷看……

一周热门 更多>