找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 423|回复: 2
收起左侧

求助,单片机程序为什么会显示乱码?

[复制链接]
ID:1100311 发表于 2023-11-20 23:08 | 显示全部楼层 |阅读模式
51hei图片_20231120230518.png

  1. #include <reg51.h>   
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define delay4us() {_nop_();_nop_();_nop_();_nop_();}

  6. sbit RS = P2^0;
  7. sbit RW = P2^1;
  8. sbit E  = P2^2;
  9. sbit CS  = P1^0;
  10. sbit CLK = P1^1;
  11. sbit DIO = P1^2;

  12. uchar Display_Buffer[] = "0.00V";
  13. uchar code Line1[] = "Current Voltage:";
  14. void DelayMS(uint ms)  {
  15.          uchar i;
  16.         while(ms--)             {
  17.                      for(i=0;i<120;i++);
  18.         }
  19. }

  20. bit LCD_Busy_Check()  {
  21.          bit result;
  22.         RS = 0;
  23.         RW = 1;
  24.         E  = 1;
  25.         delay4us();
  26.         result =     (bit)(P0&0x80);
  27.         E  = 0;
  28.         return result;
  29. }
  30. void LCD_Write_Command(uchar cmd)  {
  31.          while(LCD_Busy_Check());
  32.         RS = 0;
  33.         RW = 0;
  34.         E  = 0;
  35.         _nop_();
  36.         _nop_();
  37.         P0 = cmd;
  38.         delay4us();
  39.         E = 1;
  40.         delay4us();
  41.         E = 0;
  42. }
  43. void Set_Disp_Pos(uchar pos)  {
  44.          LCD_Write_Command(pos |     0x80);
  45. }
  46. void LCD_Write_Data(uchar dat)   {
  47.          while(LCD_Busy_Check());
  48.         RS = 1;
  49.         RW = 0;
  50.         E  = 0;
  51.         P0 = dat;
  52.         delay4us();
  53.         E = 1;
  54.         delay4us();
  55.         E = 0;
  56. }

  57. void LCD_Initialise()  {
  58.         LCD_Write_Command(0x38);     DelayMS(1);
  59.         LCD_Write_Command(0x0c);     DelayMS(1);
  60.         LCD_Write_Command(0x06);     DelayMS(1);
  61.         LCD_Write_Command(0x01);     DelayMS(1);
  62. }

  63. uchar Get_AD_Result() {
  64.          uchar i,dat1=0,dat2=0;
  65.         CS  = 0;
  66.         CLK = 0;
  67.         DIO = 1; _nop_();     _nop_();
  68.         CLK = 1; _nop_();     _nop_();
  69.         CLK = 0;DIO = 1; _nop_();     _nop_();
  70.         CLK = 1; _nop_();     _nop_();
  71.         CLK = 0;DIO = 1; _nop_();     _nop_();
  72.         CLK = 1;DIO = 1; _nop_();     _nop_();
  73.         CLK = 0;DIO = 1; _nop_();     _nop_();
  74.         for(i=0;i<8;i++)             {
  75.                      CLK = 1; _nop_(); _nop_();
  76.                     CLK = 0; _nop_(); _nop_();
  77.                     dat1 = dat1 << 1 | DIO;        
  78.         }
  79.         for(i=0;i<8;i++)             {
  80.                      dat2 = dat2 << ((uchar)(DIO)<<i);
  81.                     CLK = 1; _nop_(); _nop_();
  82.                     CLK = 0; _nop_(); _nop_();
  83.         }
  84.         CS = 1;
  85.         return (dat1 == dat2) ?     dat1:0;
  86. }

  87. void main()  {
  88.          uchar i;
  89.         uint d;
  90.         LCD_Initialise();
  91.         DelayMS(10);
  92.         while(1)
  93.         {
  94.                      d = Get_AD_Result()*500.0/255;
  95.                     Display_Buffer[0]=d/100+'0';
  96.                     Display_Buffer[2]=d/10%10+'0';
  97.                     Display_Buffer[3]=d%10+'0';
  98.                     Set_Disp_Pos(0x01);
  99.                     i = 0;
  100.                     while(Line1[ i]!='\0')  {
  101.                                  LCD_Write_Data(Line1[i+1]);        
  102.                     }
  103.                     Set_Disp_Pos(0x46);
  104.                     i = 0;
  105.                     while(Display_Buffer!='\0')
  106.                     {
  107.                                  LCD_Write_Data(Display_Buffer[i+1]);        
  108.                     }
  109.         }
  110. }
复制代码


回复

使用道具 举报

ID:235200 发表于 2023-11-22 00:33 | 显示全部楼层
造成乱码的原因是从AD转换器中读出的数据不正确,程序只判断了正确的数据转换为ASCII码显示,而未去判断不正确数据的处理
回复

使用道具 举报

ID:275826 发表于 2023-11-22 14:26 | 显示全部楼层
while(Display_Buffer!='\0')错误
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表