標(biāo)題: 求助,單片機程序為什么會顯示亂碼? [打印本頁]

作者: 蕁柯z    時間: 2023-11-20 23:08
標(biāo)題: 求助,單片機程序為什么會顯示亂碼?


  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. }
復(fù)制代碼



作者: csmyldl    時間: 2023-11-22 00:33
造成亂碼的原因是從AD轉(zhuǎn)換器中讀出的數(shù)據(jù)不正確,程序只判斷了正確的數(shù)據(jù)轉(zhuǎn)換為ASCII碼顯示,而未去判斷不正確數(shù)據(jù)的處理
作者: tyrl800    時間: 2023-11-22 14:26
while(Display_Buffer!='\0')錯誤




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1