微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > 硬件电路设计讨论 > 以下是LCD1602的显示程序,能够显示字符,但是显示不出串口获取的数据,求指正!

以下是LCD1602的显示程序,能够显示字符,但是显示不出串口获取的数据,求指正!

时间:10-02 整理:3721RD 点击:

  1. //  GY-MCU90615
  2. //  使用单片机:STC89C52
  3. //  晶振:  11.0592 M(一定是11.0592m的)
  4. //  注意:需要先用串口助手或者软件修改 GY-MCU90615串口波特率为9600
  5. //  接线
  6. //GY-MCU90615 51MCU
  7. //   VCC-------5V
  8. //   GND-------GND
  9. //   TX--------RX(P3.0  PIN10)
  10. //   RX--------TX(P3.1  PIN11)
  11. //   LCD1602引脚请根据下面定义修改
  12. //  功能:GY-MCU90615跟89c52 串口通信,lcd1602显示
  13. #include<REG52.H>        
  14. #include<math.h>       //Keil library  
  15. #include<stdio.h>      //Keil library        
  16. #include<INTRINS.H>
  17. #define uchar unsigned char
  18. #define uint  unsigned int        

  19. //   LCD1602引脚请根据下面定义修改
  20. #define DataPort P0           //LCD1602 数据端口        
  21. sbit    LCM_RS=P2^6;   //LCD1602 控制端口               
  22. sbit    LCM_RW=P2^5;   //LCD1602 控制端口        
  23. sbit    LCM_EN=P2^7;   //LCD1602 控制端口
  24.         
  25. //********定义函数*****************************
  26. void    delay(unsigned int k);
  27. void    InitLcd();
  28. void    WriteDataLCM(uchar dataW);
  29. void    WriteCommandLCM(uchar CMD,uchar Attribc);
  30. void    DisplayOneChar(uchar X,uchar Y,uchar DData);
  31. void    SeriPushSend(uchar send_data);
  32. //********定义变量*****************************
  33. uchar   BUF[15];          //数据缓存区
  34. uchar   cnt;           //接收数据的累计值
  35. uchar   sign=0;
  36. int YPR[3];
  37. //********定义函数*****************************
  38. void    delay(unsigned int k);
  39. void    SeriPushSend(uchar send_data);
  40. void           display(void);
  41. //*********************************************
  42. //串口中断
  43. void serial_serve(void) interrupt 4        
  44. {
  45.   //ES=0;
  46.   if(RI==1)
  47.   {         //中断标志
  48.     RI=0;
  49.     BUF[cnt]=SBUF;        
  50.           cnt++;        //接收计数
  51.     if(cnt==9)                //
  52.     {   
  53.        cnt=0;                 //
  54.        sign=1;
  55.     }
  56.         RI=0;
  57.   }
  58.   //ES=1;        
  59. }
  60. //*********************************************
  61. //串口初始化
  62. //9600 bps @ 11.059 MHz
  63. void init_uart()
  64. {

  65.         TMOD=0x21;                                
  66.         TH1=0xfd;                                
  67.         TL1=0xfd;                                
  68.         SCON=0x50;
  69.         PS=1;      //串口中断设为高优先级别
  70.         TR0=1;           //启动定时器                        
  71.         TR1=1;
  72.         ET0=1;     //打开定时器0中断                        
  73.         ES=1;

  74. //        SCON = 0x50;                //8位数据,可变波特率
  75. //        AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
  76. //        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  77. //        TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
  78. //        TL1 = 0xE0;                //设定定时初值
  79. //        TH1 = 0xFE;                //设定定时初值
  80. //        ET1 = 0;                //禁止定时器1中断
  81. //        TR1 = 1;                //启动定时器1
  82.         
  83. }

  84. //**********延时函数***************
  85. void delay(unsigned int k)        
  86. {                                                
  87.         unsigned int i,j;                                
  88.         for(i=0;i<k;i++)
  89.         {                        
  90.         for(j=0;j<121;j++)                        
  91.         {;}
  92.         }                                                
  93. }                                                            
  94. //*********串口数据发送******************
  95. void  SeriPushSend(uchar send_data)
  96. {
  97.     SBUF=send_data;  
  98.         while(!TI);                                  //等待发送结束
  99.         TI=0;                                            //软件清零
  100. }

  101. //*********LCD1602初始化**********************
  102. void InitLcd()                                
  103. {                        
  104.         WriteCommandLCM(0x38,1);        
  105.         WriteCommandLCM(0x08,1);        
  106.         WriteCommandLCM(0x01,1);
  107.         WriteCommandLCM(0x06,1);        
  108.         WriteCommandLCM(0x0c,1);         //大板
  109.         
  110.         
  111. //        WriteCommandLCM(0x38,1);    //打开,5*8,8位数据
  112. //    WriteCommandLCM(0x0c,1);
  113. //    WriteCommandLCM(0x06,1);
  114. //    WriteCommandLCM(0x01,1);    //清屏
  115. }
  116. //**********检测忙信号************************
  117. void WaitForEnable(void)        
  118. {                                       
  119. //        unsigned char sta;
  120.         DataPort=0xff;               
  121.         LCM_RS=0;LCM_RW=1;_nop_();
  122.         LCM_EN=1;_nop_();_nop_();
  123.         while(DataPort&0x80);        
  124.         LCM_EN=0;

  125. }                                       
  126. //**********写命令至LCD***********************
  127. void WriteCommandLCM(uchar CMD,uchar Attribc)
  128. {                                       
  129.         if(Attribc)WaitForEnable();        
  130.         LCM_RS=0;LCM_RW=0;LCM_EN=0;_nop_();
  131.         DataPort=CMD;_nop_();        
  132.         LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  133. }                                       
  134. //**********写数据至LCD************************
  135. void WriteDataLCM(uchar dataW)
  136. {                                       
  137.         WaitForEnable();               
  138.         LCM_RS=1;LCM_RW=0;LCM_EN=0;_nop_();
  139.         DataPort=dataW;_nop_();        
  140.         LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  141. }                                       
  142. //*********写一个字符数据到指定的目标***********
  143. void DisplayOneChar(uchar X,uchar Y,uchar DData)
  144. {                                                
  145.         Y&=1;                                                
  146.         X&=15;                                                
  147.         if(Y)X|=0x40;                                       
  148.         X|=0x80;                        
  149.         WriteCommandLCM(X,0);               
  150.         WriteDataLCM(DData);

  151.         
  152. }
  153.                                                             
  154. //******************************************************
  155. //*************************************
  156. void dis_play(uchar A,uchar B,int num)        
  157. {
  158.         if(num<0)
  159.         {
  160.                 num=-num;
  161.                 DisplayOneChar(A,B,('-'));          //显示负号
  162.         }
  163.         else
  164.             DisplayOneChar(A,B,('+'));          //显示正号

  165.     DisplayOneChar(++A,B,(0x30|(num/10000)));        
  166.         DisplayOneChar(++A,B,(0x30|(num%10000/1000)));
  167.         DisplayOneChar(++A,B,(0x30|(num%1000/100)));
  168.         DisplayOneChar(++A,B,(0x2e));
  169.         DisplayOneChar(++A,B,(0x30|(num%100/10)));
  170.         DisplayOneChar(++A,B,(0x30|(num%10)));   //小数点后2位
  171. }

  172. //*******************数据接收并显示**********************
  173. void display(void)
  174. {
  175.   int YPR[3];
  176.   if(sign)
  177.   {
  178.        sign=0;                 
  179.                         
  180.             if(BUF[0]==0X5A&&BUF[1]==0X5A)                //帧头判断
  181.                 {                           
  182.                                  
  183.           YPR[0]=(BUF[4]<<8|BUF[5]);  
  184.           YPR[1]=(BUF[6]<<8|BUF[7]);
  185.          
  186.                
  187.                      dis_play(2,1,YPR[0]);
  188.                      dis_play(2,0,YPR[1]);                                   
  189.         }
  190.    }  
  191. }
  192. //*******************数据接收并显示**********************

  193. //***************************************
  194. //主程序
  195. void main()
  196. {
  197.    delay(1000);                                                      //延时               
  198.    InitLcd();                                                 //初始化LCD
  199.    init_uart();                                               //初始化串口
  200.    EA=1;                                                      //开总中断
  201.    cnt=0;   
  202.    
  203.    DisplayOneChar(0,0,('A'));
  204.    DisplayOneChar(1,0,(':'));
  205.    DisplayOneChar(0,1,('O'));
  206.    DisplayOneChar(1,1,(':'));


  207.    SeriPushSend(0XA5);
  208.    SeriPushSend(0X45);                                
  209.    SeriPushSend(0XEA);    //发送1帧读取命令。 连续发送数据

  210. //   SeriPushSend(0XA5);
  211. //   SeriPushSend(0X15);                                
  212. //   SeriPushSend(0XBA);    //发送1帧读取命令。查询数据
  213.   
  214.    while(1)
  215.    {                                                   //循环                                               
  216.                    display();                                   
  217.    }                                                          //end while
  218. }

复制代码



已退回1积分

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top