这是我写的LCD1602程序,帮帮忙为什么只显示一排方块

2019-07-16 00:28发布

程序在proteus仿真是正确的,但是烧到单片机上只显示一排方块,第二行连方块也不显示。请问是什么问题?初步判断不是电路问题。
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define DATE_IO P0//P0口并行传输数据
  5. sbit  EOCADC=P2^1;
  6. sbit  ALEADC=P3^5;
  7. sbit  ENADC=P2^2;
  8. sbit  STARTADC=P2^0;//START与ALE相连
  9. sbit  CLKADC=P2^4;
  10. sbit  RSLCD=P2^5;
  11. sbit  RWLCD=P2^3;
  12. sbit  ENLCD=P2^6;
  13. sbit  SGBJING=P2^7;

  14. uchar getdata=0;//转换后得到数据
  15. uchar qian,bai,shi,ge;
  16. uchar code table1[]="0123456789CO:ppm ";        //0123456789CO:ppm
  17. uchar code table2[]="TEL:15226195907";
  18. void adc0809();
  19. void chufa();
  20. void inityejing();
  21. void write_command(uchar come);
  22. void write_date(uchar date);
  23. void delay(uint z);
  24. void delayus(unsigned int n);
  25. void delayms(uint i);
  26. void SPEAK();
  27. void alARM(uchar t);
  28. void initdingshi();
  29. void CHUANKOU(uchar);
  30. void main()
  31. {

  32.         uchar t=0,ZJ=1,num;
  33.         delayms(10);
  34.         inityejing();//调用液晶初始化函数
  35.         delayms(10);
  36.         write_command(0x80+0x40);
  37.         for(num=0;num<=14;num++)
  38.         {
  39.             write_date(table2[num]);
  40.     }
  41.         delayms(5);
  42.         initdingshi();
  43.         while(1)
  44.         {
  45.                 delayms(20);
  46.                 adc0809();//启动0809转换,并得到转换后的结果
  47.                 delayms(50);

  48.                 chufa();
  49.                 delayms(20);
  50.                 if(getdata>=35)
  51.                 {
  52.                         delayms(1000);
  53.                         t=t+1;
  54.                         if(t>=20)
  55.                         {
  56.                                 SPEAK();
  57.                         }       
  58.                 }

  59.                 else
  60.                 t=0;
  61.         }
  62. }
  63. //lcd初始化
  64. void inityejing()                  //液晶初始化函数
  65. {       
  66.         RWLCD=0;                       //低电平时进行写操作(高电平时进行读操作)
  67.         ENLCD=0;
  68.         write_command(0x38);              //设置LCD两行显示,一个数据由5*7点阵表示,数据由8根线传输
  69.         delayms(5);
  70.         write_command(0x01);               //清除屏幕显示
  71.         delayms(5);
  72.         write_command(0x06);                  //设定输入方式,增量不移位
  73.         delayms(5);
  74.          write_command(0x0c);                  //开整体显示,关光标,不闪烁
  75.         delayms(5);
  76. }
  77. // ADC0809

  78. void adc0809()                          //启动0809转换,并得到转换后的结果
  79. {
  80.   ALEADC=0;
  81.   ALEADC=1;
  82.   STARTADC=0;                                //以下三表达式表示启动A/D转换
  83.   STARTADC=1;
  84.   STARTADC=0;
  85.   while(!EOCADC);                               //等待转换结束
  86.   ENADC=1;                               //为高电平时,转换的数据输送个单片机
  87.   getdata=P1;                          //从P1引脚读转换后的信息
  88.   ENADC=0;

  89. }
  90. //数字拆开
  91. void chufa()                           //将各位数字拆开函数
  92. {

  93.   bai=(getdata*2)/100;                   //求百位数字
  94.   shi=(getdata*2)%100/10;                      //求十位数字
  95.   ge=(getdata*2)%10;                           //求各位数字
  96.   write_command(0x80);                          //设置显示地址为LCD第一行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移  
  97.   write_date(table1[16]);
  98.   write_date(table1[16]);
  99.   write_date(table1[16]);
  100.   write_date(table1[10]);              // 第一位显示C
  101.   write_date(table1[11]);               // 第二位显示O
  102.   write_date(table1[12]);                // 第三位显示:
  103.   write_date(table1[bai]);                  //第四位显示百位
  104.   write_date(table1[shi]);                   //第五位显示十
  105.   write_date(table1[ge]);                      //第六位显示个
  106.   write_date(table1[13]);                     //第七位显示p
  107.   write_date(table1[14]);                    //显示p
  108.   write_date(table1[15]);                  //第七位显示m
  109.   delayms(80);                                      //改变数值可以修改数字滚动的速度
  110. }

  111. //控制LCD1602的函数
  112. void write_command(uchar come)//写指令函数
  113. {
  114.         RSLCD=0;                       //选择指令寄存器
  115.         ENLCD=1;                    //由高电平跳变成低电平时,液晶执行命令
  116.         DATE_IO=come;
  117.         delayms(111);
  118.         ENLCD=0;       
  119.         RSLCD=1;
  120. }

  121. void write_date(uchar date)       //写数据函数
  122. {       
  123.   RSLCD=1;                           //选择数据寄存器       
  124.   ENLCD=1;                      //由高电平跳变成低电平时,液晶执行命令       
  125.   DATE_IO=date;       
  126.   delayus(5);
  127.   ENLCD=0;
  128.   RSLCD=0;
  129. }
  130. //延时

  131. void delayus(unsigned int n)
  132.   {
  133.         if(n==0)
  134.            return ;           
  135.         while(--n);
  136.   }

  137. void delayms(uint ms)
  138. {
  139.         unsigned char a,b;
  140.         for (a=ms;a>0;a--)
  141.                  for(b=110;b>0;b--);             
  142. }
  143. //声光报警       
  144. void SPEAK()
  145. {       
  146.         uchar t;
  147.         delayms(50);
  148.                 SGBJING=0;       
  149.                   for(t=50;t>24;t--)
  150.                   {
  151.                           alarm(30);
  152.                           delayms(t*90);
  153.                   }
  154.                   while(1)
  155.                 {
  156.                 alarm(30);
  157.                 delayms(200);       
  158.                 }
  159. }
  160. void alarm(uchar t) //产生50个周期为2t的波形
  161. {
  162.         uchar i,j;
  163.         for(i=0;i<50;i++)
  164.         {
  165.                 SGBJING=~SGBJING;
  166.                 for(j=0;j<t;j++)
  167.                 ;
  168.         }
  169. }
  170. void initdingshi()//初始化定时器0模式2(主要是为了给0809提供时钟)
  171. {
  172.   TMOD=0x02;//定时器0的模式2
  173.   TH0=0xfb;//定时5us
  174.   TL0=0xfb;
  175.   TR0=1;//启动定时器0
  176.   ET0=1;//开定时器0中断控制位
  177.   EA=1;//开总中断

  178. }
  179. void time0() interrupt 1//定时器0中断
  180. {
  181. CLKADC=~CLKADC;
  182. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。