找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 613|回复: 1
收起左侧

单片机测电压 LCD1602上下读数一直一样?

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

  1. #include<reg51.h>   
  2. #include<intrins.h>  
  3. sbit CS=P1^0;      
  4. sbit CLK=P1^1;     
  5. sbit DIO=P1^2;      
  6. unsigned char code digit[10]={"0123456789"};   
  7. unsigned char code Str[]={"Volt="};            

  8. sbit RS=P2^0;           
  9. sbit RW=P2^1;           
  10. sbit E=P2^2;            
  11. sbit BF=P0^7;           

  12. void delay1ms()
  13. {
  14.    unsigned char i,j;      
  15.          for(i=0;i<10;i++)
  16.           for(j=0;j<33;j++)
  17.            ;                 
  18. }
  19. void delaynms(unsigned char n)
  20. {
  21.    unsigned char i;
  22.         for(i=0;i<n;i++)
  23.            delay1ms();
  24. }

  25. bit BusyTest(void)
  26.   {
  27.     bit result;
  28.         RS=0;      
  29.     RW=1;
  30.     E=1;        
  31.     _nop_();   
  32.     _nop_();
  33.     _nop_();
  34.     _nop_();   
  35.     result=BF;  
  36.    E=0;         
  37.    return result;
  38.   }

  39. void WriteInstruction (unsigned char dictate)
  40. {   
  41.     while(BusyTest()==1);   
  42.          RS=0;                  
  43.          RW=0;   
  44.          E=0;                  
  45.                            
  46.          _nop_();
  47.          _nop_();               
  48.          P0=dictate;            
  49.          _nop_();
  50.          _nop_();
  51.          _nop_();
  52.          _nop_();               
  53.          E=1;                  
  54.          _nop_();
  55.          _nop_();
  56.          _nop_();
  57.          _nop_();               
  58.           E=0;                  
  59. }

  60. void WriteAddress(unsigned char x)
  61. {
  62.      WriteInstruction(x|0x80);
  63. }

  64. void WriteData(unsigned char y)
  65. {
  66.     while(BusyTest()==1);  
  67.           RS=1;           
  68.           RW=0;
  69.           E=0;            
  70.                      
  71.           P0=y;           
  72.           _nop_();
  73.           _nop_();
  74.           _nop_();
  75.      _nop_();      
  76.           E=1;           
  77.           _nop_();
  78.           _nop_();
  79.           _nop_();
  80.          _nop_();        
  81.          E=0;            
  82. }

  83. void LcdInitiate(void)
  84. {
  85.     delaynms(15);               
  86.     WriteInstruction(0x38);     
  87.         delaynms(5);               
  88.     WriteInstruction(0x38);
  89.         delaynms(5);               
  90.         WriteInstruction(0x38);     
  91.         delaynms(5);               
  92.         WriteInstruction(0x0c);     
  93.         delaynms(5);               
  94.         WriteInstruction(0x06);     
  95.         delaynms(5);               
  96.         WriteInstruction(0x01);     
  97.         delaynms(5);            

  98. }

  99. void display_volt(void)
  100. {
  101.     unsigned char i;
  102.          WriteAddress(0x03);   
  103.          i = 0;               
  104.          while(Str[i] != '\0')  
  105.           {                                               
  106.                  WriteData(Str[ i]);   
  107.                  i++;                 
  108.                 }      
  109. }
  110. void display_volt2(void)
  111. {
  112.     unsigned char i;
  113.          WriteAddress(0x43);   
  114.          i = 0;               
  115.          while(Str[i] != '\0')  
  116.           {                                               
  117.                  WriteData(Str[i]);   
  118.                  i++;                 
  119.                 }      
  120. }


  121. void display_dot(void)
  122. {         
  123.          WriteAddress(0x09);         
  124.          WriteData('.');      
  125. }
  126. void display_dot2(void)
  127. {         
  128.          WriteAddress(0x49);         
  129.          WriteData('.');      
  130. }

  131. void  display_V(void)
  132. {
  133.     WriteAddress(0x0c);
  134.          WriteData('V');     
  135.                        
  136. }
  137. void  display_V2(void)
  138. {
  139.     WriteAddress(0x4c);
  140.          WriteData('V');     
  141.                        
  142. }

  143. void display1(unsigned char x)
  144. {

  145.         WriteAddress(0x08);   
  146.         WriteData(digit[x]);   
  147. }
  148. void display1_2(unsigned char x)
  149. {

  150.         WriteAddress(0x48);   
  151.         WriteData(digit[x]);   
  152. }

  153. void display2(unsigned char x)
  154. {
  155.         unsigned char i,j;
  156.         i=x/10;            
  157.         j=x%10;            
  158.    WriteAddress(0x0a);      
  159.         WriteData(digit[i]);     
  160.         WriteData(digit[j]);     
  161. }
  162. void display2_2(unsigned char x)
  163. {
  164.         unsigned char i,j;
  165.         i=x/10;            
  166.         j=x%10;            
  167.    WriteAddress(0x4a);      
  168.         WriteData(digit[i]);     
  169.         WriteData(digit[j]);     
  170. }

  171. unsigned char  A_D()
  172. {
  173.   unsigned char i,dat;
  174.    CS=1;   
  175.    CLK=0;  
  176.    CS=0;  

  177.    DIO=1;   
  178.    CLK=1;   
  179.    CLK=0;   
  180.    DIO=1;   
  181.    CLK=1;   
  182.    CLK=0;   
  183.    DIO=0;   
  184.    CLK=1;   
  185.    CLK=0;   
  186.    DIO=1;   
  187.    CLK=1;   
  188.    for(i=0;i<8;i++)  
  189.     {
  190.       CLK=1;         
  191.       CLK=0;
  192.       dat<<=1;      
  193.                 dat|=(unsigned char)DIO;         
  194.     }                                 
  195.     CS=1;         
  196.          return dat;         
  197.   }
  198. unsigned char  A_D2()
  199. {
  200.   unsigned char i,dat;
  201.    CS=1;   
  202.    CLK=0;  
  203.    CS=0;  

  204.    DIO=1;   
  205.    CLK=1;   
  206.    CLK=0;   
  207.    DIO=1;   
  208.    CLK=1;   
  209.    CLK=0;   
  210.    DIO=1;   
  211.    CLK=1;   
  212.    CLK=0;   
  213.    DIO=1;   
  214.    CLK=1;   
  215.    for(i=0;i<8;i++)  
  216.     {
  217.       CLK=1;         
  218.       CLK=0;
  219.       dat<<=1;      
  220.                 dat|=(unsigned char)DIO;         
  221.     }                                 
  222.     CS=1;         
  223.          return dat;         
  224.   }

  225. main(void)
  226. {
  227.   unsigned int AD_val,AD_val2;   
  228.   unsigned char Int,Dec,Int2,Dec2;   
  229.    LcdInitiate();         
  230.    delaynms(5);           
  231.    display_volt();        
  232.    display_volt2();
  233.    display_dot();         
  234.    display_V();           
  235.    display_dot2();         
  236.    display_V2();           
  237.    while(1)
  238.       {
  239.                   AD_val= A_D();   
  240.                   AD_val2=A_D2();
  241.                   Int=(AD_val)/51;  
  242.                   Dec=(AD_val%51)*100/51;   
  243.                   Int2=(AD_val2)/51;  
  244.                   Dec2=(AD_val2%51)*100/51;   
  245.           display1(Int);     
  246.                   display2(Dec);     
  247.                   display1_2(Int2);     
  248.                   display2_2(Dec2);     
  249.                   delaynms(250);     
  250.                 }
  251.                     
  252. }
复制代码


回复

使用道具 举报

ID:883242 发表于 2023-11-22 20:47 | 显示全部楼层
LCM的Datasheet贴出来,特别是关于0x43和0x03命令的区别。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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