久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2333|回復: 3
收起左側

LCD1602實時顯示AD(PCF8591)采樣不顯示電壓問題,求各位大神幫忙分析下,萬分感謝

[復制鏈接]
ID:970242 發表于 2021-10-23 09:54 | 顯示全部樓層 |閱讀模式
**************************************************************************************
*                              LCD1602液晶顯示實驗                                                                                                  *
實現現象:        結果只顯示"Voltage: .    V"并且伴隨閃爍,請問是什么原因?

想要的結果:如          Voltage: .    V
                                 3.254        (電壓值實時采集)                                                                                                                                          
***************************************************************************************/
  1. #include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器
  2. #include "lcd.h"
  3. #include "IIC.h"

  4. typedef unsigned int u16;          //對數據類型進行聲明定義
  5. typedef unsigned char u8;
  6. char num=0;
  7. u8 disp[4];
  8. unsigned char table[]="Voltage: .    V";

  9. void delay(u16 i)
  10. {
  11. while(i--);
  12. }


  13. /*******************************************************************************
  14. * 函 數 名         : main
  15. *******************************************************************************/
  16. void main(void)
  17. {
  18.         u8 i;
  19.         u16 Voltage;
  20.         LcdInit();
  21.                  LcdWriteCom(0x80+0x01);
  22.         for(i=0;i<15;i++)
  23.         {
  24.                
  25.                 LcdWriteData(table[i]);        
  26.                 delay(20);
  27.         }
  28.         Voltage=AD_Read(0x00)*4.9/256*1000;  //(int)(num*4.9/255*100+0.5);
  29.                         disp[0]=Voltage/1000+0x30
  30.                         disp[1]=Voltage%1000/100+0x30;
  31.                         disp[2]=Voltage%1000%100/10+0x30;
  32.                         disp[3]=Voltage%1000%100%10+0x30;//Voltage%1000%100%10
  33.            
  34.         
  35.            LcdWriteCom(0x80+0x40);
  36.            LcdWriteData( disp[0]);
  37.         
  38.             LcdWriteCom(0x80+0x41);
  39.            LcdWriteData(0x2e);
  40.         
  41.            LcdWriteCom(0x80+0x42);
  42.            LcdWriteData( disp[1]);
  43.         
  44.            LcdWriteCom(0x80+0x43);
  45.            LcdWriteData( disp[2]);
  46.         
  47.                  LcdWriteCom(0x80+0x44);
  48.            LcdWriteData( disp[3]);
  49.         
  50.         while(1);                                
  51. }

  52. /*******************************************************************************
  53. * 函 數 名         : IIC.h
  54. *******************************************************************************/

  55. #include "IIC.h"

  56. void delay10us(void)   //誤差 0us
  57. {
  58.     unsigned char a,b;
  59.     for(b=1;b>0;b--)
  60.         for(a=2;a>0;a--);
  61. }

  62. void I2cStart()
  63. {
  64.   SDA=1;
  65.         delay10us();
  66.         SCL=1;
  67.         delay10us();
  68.         SDA=0;
  69.         delay10us();
  70.         SCL=0;
  71.         delay10us();
  72. }

  73. void I2cStop()
  74. {
  75.   SDA=0;
  76.         delay10us();
  77.         SCL=1;
  78.         delay10us();
  79.         SDA=1;
  80.         delay10us();
  81. }
  82.         
  83. unsigned char  I2cSendByte(unsigned char dat)
  84. {
  85.         unsigned char a=0,b;
  86. for(a=0;a<8;a++)
  87. {
  88.   SDA=dat>>7;
  89.         dat=dat<<1;
  90.         delay10us();
  91.         SCL=1;
  92.         delay10us();
  93.         SCL=0;
  94.         delay10us();
  95. }
  96.   SDA=1;
  97.   delay10us();
  98.   SCL=1;
  99. while(SDA)
  100. {
  101.   b++;
  102.         if(b>200)
  103.         {
  104.           SCL=0;
  105.                 delay10us();
  106.                 return 0;
  107.         }
  108. }
  109.   SCL=0;
  110.         delay10us();
  111.         return 1;
  112. }

  113. unsigned char I2cReadByte()
  114.   {
  115.                 unsigned char a=0,dat=0;
  116.                 SDA=1;
  117.                 delay10us();
  118.     for(a=0;a<8;a++)
  119.                 {
  120.                   SCL=1;
  121.                   delay10us();
  122.                   dat<<=1;
  123.                   dat|=SDA;
  124.                         SCL=0;
  125.                         delay10us();
  126.                         
  127.                 }
  128.     return dat;

  129.   }
  130.         
  131.         
  132. void DA_Volgate(unsigned char addr,unsigned char dat)
  133.   {
  134.           I2cStart();
  135.                 I2cSendByte(0x90);
  136.                 I2cSendByte(addr);
  137.                 I2cSendByte(dat);
  138.                 I2cStop();
  139.                 }
  140.         
  141.                
  142. unsigned char AD_Read(unsigned char addr)
  143.   {
  144.                 unsigned char num;
  145.           I2cStart();
  146.                 I2cSendByte(0x90);
  147.                 I2cSendByte(addr);
  148.                 I2cStart();
  149.                 I2cSendByte(0x91);
  150.                 num=I2cReadByte();
  151.                 I2cStop();
  152.           return num;
  153.         
  154.         
  155.         }


  156. /*******************************************************************************
  157. * 函 數 名         : lcd.h
  158. *******************************************************************************/

  159. #include "lcd.h"
  160. typedef unsigned char u8;
  161. /*******************************************************************************
  162. * 函 數 名         : Lcd1602_Delay1ms
  163. * 函數功能                   : 延時函數,延時1ms
  164. * 輸    入         : c
  165. * 輸    出         : 無
  166. * 說    名         : 該函數是在12MHZ晶振下,12分頻單片機的延時。
  167. *******************************************************************************/

  168. void Lcd1602_Delay1ms(uint c)   //誤差 0us
  169. {
  170.     uchar a,b;
  171.         for (; c>0; c--)
  172.         {
  173.                  for (b=199;b>0;b--)
  174.                  {
  175.                           for(a=1;a>0;a--);
  176.                  }      
  177.         }
  178.             
  179. }

  180. /*******************************************************************************
  181. * 函 數 名         : LcdWriteCom
  182. * 函數功能                   : 向LCD寫入一個字節的命令
  183. * 輸    入         : com
  184. * 輸    出         : 無
  185. *******************************************************************************/
  186. #ifndef         LCD1602_4PINS         //當沒有定義這個LCD1602_4PINS時
  187. void LcdWriteCom(uchar com)          //寫入命令
  188. {
  189.         LCD1602_E = 0;     //使能
  190.         LCD1602_RS = 0;           //選擇發送命令
  191.         LCD1602_RW = 0;           //選擇寫入
  192.         
  193.         LCD1602_DATAPINS = com;     //放入命令
  194.         Lcd1602_Delay1ms(1);                //等待數據穩定

  195.         LCD1602_E = 1;                  //寫入時序
  196.         Lcd1602_Delay1ms(5);          //保持時間
  197.         LCD1602_E = 0;
  198. }
  199. #else
  200. void LcdWriteCom(uchar com)          //寫入命令
  201. {
  202.         LCD1602_E = 0;         //使能清零
  203.         LCD1602_RS = 0;         //選擇寫入命令
  204.         LCD1602_RW = 0;         //選擇寫入

  205.         LCD1602_DATAPINS = com;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  206.         Lcd1602_Delay1ms(1);

  207.         LCD1602_E = 1;         //寫入時序
  208.         Lcd1602_Delay1ms(5);
  209.         LCD1602_E = 0;

  210.         LCD1602_DATAPINS = com << 4; //發送低四位
  211.         Lcd1602_Delay1ms(1);

  212.         LCD1602_E = 1;         //寫入時序
  213.         Lcd1602_Delay1ms(5);
  214.         LCD1602_E = 0;
  215. }
  216. #endif
  217. /*******************************************************************************
  218. * 函 數 名         : LcdWriteData
  219. * 函數功能                   : 向LCD寫入一個字節的數據
  220. * 輸    入         : dat
  221. * 輸    出         : 無
  222. *******************************************************************************/                  
  223. #ifndef         LCD1602_4PINS                  
  224. void LcdWriteData(uchar dat)                        //寫入數據
  225. {
  226.         LCD1602_E = 0;        //使能清零
  227.         LCD1602_RS = 1;        //選擇輸入數據
  228.         LCD1602_RW = 0;        //選擇寫入

  229.         LCD1602_DATAPINS = dat; //寫入數據
  230.         Lcd1602_Delay1ms(1);

  231.         LCD1602_E = 1;   //寫入時序
  232.         Lcd1602_Delay1ms(5);   //保持時間
  233.         LCD1602_E = 0;
  234. }
  235. #else
  236. void LcdWriteData(uchar dat)                        //寫入數據
  237. {
  238.         LCD1602_E = 0;          //使能清零
  239.         LCD1602_RS = 1;          //選擇寫入數據
  240.         LCD1602_RW = 0;          //選擇寫入

  241.         LCD1602_DATAPINS = dat;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  242.         Lcd1602_Delay1ms(1);

  243.         LCD1602_E = 1;          //寫入時序
  244.         Lcd1602_Delay1ms(5);
  245.         LCD1602_E = 0;

  246.         LCD1602_DATAPINS = dat << 4; //寫入低四位
  247.         Lcd1602_Delay1ms(1);

  248.         LCD1602_E = 1;          //寫入時序
  249.         Lcd1602_Delay1ms(5);
  250.         LCD1602_E = 0;
  251. }
  252. #endif
  253. /*******************************************************************************
  254. * 函 數 名       : LcdInit()
  255. * 函數功能                 : 初始化LCD屏
  256. * 輸    入       : 無
  257. * 輸    出       : 無
  258. *******************************************************************************/                  
  259. #ifndef                LCD1602_4PINS
  260. void LcdInit()                                                  //LCD初始化子程序
  261. {
  262.          LcdWriteCom(0x38);  //開顯示
  263.         LcdWriteCom(0x0c);  //開顯示不顯示光標
  264.         LcdWriteCom(0x06);  //寫一個指針加1
  265.         LcdWriteCom(0x01);  //清屏
  266. //        LcdWriteCom(0x80);  //設置數據指針起點
  267. }
  268. #else
  269. void LcdInit()                                                  //LCD初始化子程序
  270. {
  271.         LcdWriteCom(0x32);         //將8位總線轉為4位總線
  272.         LcdWriteCom(0x28);         //在四位線下的初始化
  273.         LcdWriteCom(0x0c);  //開顯示不顯示光標
  274.         LcdWriteCom(0x06);  //寫一個指針加1
  275.         LcdWriteCom(0x01);  //清屏
  276. //        LcdWriteCom(0x80);  //設置數據指針起點
  277. }
  278. #endif
復制代碼
回復

使用道具 舉報

ID:958524 發表于 2021-10-23 18:28 來自手機 | 顯示全部樓層
顯示的程序是不是得寫到while(1)循環里
回復

使用道具 舉報

ID:970242 發表于 2021-10-28 09:58 | 顯示全部樓層
liuxiaolin20000 發表于 2021-10-23 18:28
顯示的程序是不是得寫到while(1)循環里

自己找資料搗鼓出來了,while是一個原因,還有一個是LCD顯示地址有問題,改了之后就正常了
回復

使用道具 舉報

ID:584814 發表于 2021-10-29 20:16 | 顯示全部樓層
能正常顯示出字符什么的就表示與1602無關,你要找程序中的其他問題
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 人人干人人草 | 亚洲视频在线观看 | 国产精品久久久久久久久久久久午夜片 | 国产日产精品一区二区三区四区 | 国产一区二区三区不卡av | 亚洲伊人精品酒店 | 亚洲电影免费 | 四虎永久影院 | 91综合网 | 国产中文字幕在线观看 | 欧美一级欧美一级在线播放 | 2018天天干天天操 | 亚洲国产精品一区二区第一页 | 琪琪午夜伦伦电影福利片 | 日韩欧美在线免费观看 | 97国产精品视频人人做人人爱 | 国产精品久久av | 中文字幕亚洲一区二区三区 | 日韩在线精品视频 | www.毛片| 久久久精品亚洲 | 欧美成人第一页 | 亚洲三区视频 | 久久精品一区二区三区四区 | 亚洲福利在线视频 | 色黄爽| 国产欧美久久一区二区三区 | 风间由美一区二区三区在线观看 | 日韩av电影在线观看 | 天天拍天天插 | 精品久久久久国产 | 中文日韩字幕 | 久久综合一区 | 欧美日韩久久久 | 亚洲一区二区不卡在线观看 | 福利精品在线观看 | 日韩在线三级 | 91性高湖久久久久久久久_久久99 | 人操人人| 91精品久久久久久久久久小网站 | 久久成人综合 |