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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2193|回復: 1
打印 上一主題 下一主題
收起左側

想請教一下各位大佬,為什么LCD1602顯示屏上一直顯示0?

[復制鏈接]
跳轉到指定樓層
樓主

  1. /************************************
  2. *********STC89C52**********
  3. **********12MHz晶振*********/

  4. #include "reg51.h"
  5. #include<stdio.h>
  6. #include<intrins.h>
  7. #define uint8 unsigned char
  8. #define uint16 unsigned int
  9. #define uchar unsigned char
  10. #define uint unsigned int





  11. uint16 cnt2ms;        //10ms計時器
  12. uint8 cnt1s;        //1秒計數器

  13. //電阻--------------------------------
  14. #define        Z1 13700053.00
  15. #define        Z2 3685279.00


  16. float RZ=0;
  17. unsigned long   RX=0;
  18. unsigned long   RX2=0;
  19. unsigned long   RX3=0;
  20. unsigned long   RX4=0;
  21. unsigned long   RX5=0;
  22. unsigned long   RX6=0;
  23. unsigned long   RX7=0;
  24. unsigned long   RX8=0;
  25. unsigned long   RX9=0;



  26. //電感--------------------------------
  27. float LZ=0;
  28. #define        C1 0.1461

  29. //電容--------------------------------
  30. float CZ=0;
  31. float CX=0;
  32. #define        R1 42874

  33. uint8 KL=0;        //
  34. unsigned int Pulsecnt=0;        //脈沖個數
  35. unsigned int Pulsenum;        //脈沖個數
  36. uint8 start=0;        //
  37. uint16 PulseTime;        //10ms計數器
  38. uint16 Pulse;        //10ms計數器
  39. bit flag=0;
  40. uint8 CH=0;        //
  41. unsigned long x;
  42. void Init_Extint(void);
  43. void TimerInitProc();

  44. void Init_System(void);
  45. void Display(uint8 chose_dat, uint8 dat);
  46. void ShowDisp(uint8 tPulsenum, uint8 tPulsecnt, uint8 tcnt1s);
  47. void DelayMs(uint8 Ms);
  48. uint8 Pulse_FLAG=0;
  49. uint8 Pulse_5=0;
  50. /********************************按鍵*****************************************/
  51. sbit    K1=P1^3;
  52. sbit    K2=P1^4;
  53. sbit    K3=P1^5;

  54. sbit    A0=P2^1;
  55. sbit    A1=P2^0;

  56. sbit    RED=P3^6;
  57. sbit    YEW=P3^4;
  58. sbit    GRE=P3^3;
  59. /********************************LCD液晶**************************************/
  60. #define LCD_Data P0           //LCD的數據口
  61. sbit    LCD_BF=LCD_Data^7;    //LCD的忙信號位
  62. sbit    LCD_RS=P1^0;
  63. sbit    LCD_RW=P1^1;
  64. sbit    LCD_EN=P1^2;



  65. #define LCD_GO_HOME               0x02         //AC=0,光標、畫面回HOME位

  66. //輸入方式設置
  67. #define LCD_AC_AUTO_INCREMENT     0x06         //數據讀、寫操作后,AC自動增一
  68. #define LCD_AC_AUTO_DECREASE      0x04         //數據讀、寫操作后,AC自動減一
  69. #define LCD_MOVE_ENABLE           0x05         //數據讀、寫操作,畫面平移
  70. #define LCD_MOVE_DISENABLE        0x04         //數據讀、寫操作,畫面不動

  71. //設置顯示、光標及閃爍開、關
  72. #define LCD_DISPLAY_ON            0x0C         //顯示開
  73. #define LCD_DISPLAY_OFF           0x08         //顯示關
  74. #define LCD_CURSOR_ON             0x0A         //光標顯示
  75. #define LCD_CURSOR_OFF            0x08         //光標不顯示
  76. #define LCD_CURSOR_BLINK_ON       0x09         //光標閃爍
  77. #define LCD_CURSOR_BLINK_OFF      0x08         //光標不閃爍

  78. //光標、畫面移動,不影響DDRAM
  79. #define LCD_LEFT_MOVE             0x18         //LCD顯示左移一位
  80. #define LCD_RIGHT_MOVE            0x1C         //LCD顯示右移一位
  81. #define LCD_CURSOR_LEFT_MOVE      0x10         //光標左移一位
  82. #define LCD_CURSOR_RIGHT_MOVE     0x14         //光標右移一位

  83. //工作方式設置
  84. #define LCD_DISPLAY_DOUBLE_LINE   0x38         //兩行顯示
  85. #define LCD_DISPLAY_SINGLE_LINE   0x30         //單行顯示
  86. /*定義子程序*/
  87. void LCD_ClrAll(void);              //清屏
  88. void Judge_LCD_busy(void);           //檢測是否忙碌
  89. void LCD_Write(uchar WriteData);     //寫控制字
  90. void LCD_write_data(uchar LCD_data); //寫數據顯示
  91. void LCD_cursor(uchar x);    //光標起始地址
  92. void LCD_printc(unsigned char lcd_data) ;  //輸出一個字符
  93. void LCD_prints(unsigned char *lcd_string);//輸出一個字符串



  94. /*LCD1602忙碌判斷子程序*/
  95. void Judge_LCD_busy(void)   //判斷LCD1602是否忙狀態
  96. {
  97. while(1)
  98.   {
  99.    LCD_EN=0;
  100.    LCD_RS=0;
  101.    LCD_RW=1;
  102.    LCD_Data=0xff;
  103.    LCD_EN=1;   //EN 是1-0 使能
  104.    if(!LCD_BF)break; //LCD_BF=1表示忙碌,需要等待
  105.   }
  106.    LCD_EN=0;
  107. }
  108. /******LCD清屏***************/
  109. void LCD_ClrAll(void)
  110. {

  111. Judge_LCD_busy();   //判斷是否忙碌
  112. LCD_RS=0;
  113. LCD_RW=0;
  114. LCD_Data=0x01;
  115. LCD_EN=1;
  116. LCD_EN=0;

  117. }
  118. /*******LCD寫數據定義各種模式*********/
  119. void LCD_Write(uchar WriteData)   //寫指令到LCD
  120. {
  121. Judge_LCD_busy();
  122. LCD_RS=0;
  123. LCD_RW=0;

  124. P0=WriteData; //把WriteDate的數據送到數據口
  125. LCD_EN=1;
  126. LCD_EN=0;
  127. }
  128. /********LCD顯示數據***********/
  129. void LCD_write_data(uchar LCD_data)      //輸入一個字節數據到LCD
  130. {
  131. Judge_LCD_busy();
  132. LCD_RS=1;
  133. LCD_RW=0;

  134. P0=LCD_data;
  135. LCD_EN=1;
  136. LCD_EN=0;
  137. }
  138. /****光標位置的確定***/
  139. void LCD_cursor(uchar x)            //LCD光標定位到x處
  140. {
  141. LCD_Write(0x80+x);                       //第一行地址是0x80

  142. }
  143. /*輸入一個字符*/
  144. void LCD_printc(unsigned char lcd_data)
  145. {
  146. LCD_write_data(lcd_data);
  147. }

  148. /*輸出字符串*/
  149. void LCD_prints(unsigned char *lcd_string)
  150. {
  151. unsigned char i=0;
  152. while(lcd_string[i]!=0x00)
  153.   {
  154.    LCD_write_data(lcd_string[i]);
  155.    i++;
  156.   }
  157. }

  158. /*初始化程序*/
  159. void LCD_initial(void)                        //初始化LCD
  160. {
  161. LCD_Write(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
  162. LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
  163. LCD_Write(LCD_DISPLAY_DOUBLE_LINE);
  164. LCD_ClrAll();

  165. }

  166. /****延時******/
  167. void delay_1ms(uint x)
  168. {
  169. uint j;
  170. uchar i;
  171. for(j=0;j<x;j++)
  172. {
  173. for(i=0;i<120;i++);
  174. }
  175. }
  176. void Key_SM(void){

  177.         if(K3==0){
  178.              delay_1ms(5);
  179.             if(K3==0){
  180.                 YEW=1;RED=0;
  181.                 GRE=1;                  
  182.                 LCD_cursor(0x00);
  183.                 LCD_prints("   MEASURE Lx   ");  
  184.                 //----電感檔-------
  185.                 A0=0;
  186.                 A1=1;
  187.                 CH=2;//電感檔

  188.                 while(K3==0){}
  189.                      
  190.                  }
  191.             }

  192.         if(K2==0){
  193.              delay_1ms(5);
  194.             if(K2==0){
  195.                 GRE=1;YEW=0;
  196.                 RED=1;                  
  197.                 LCD_cursor(0x00);            
  198.                 LCD_prints("   MEASURE Rx   ");  
  199.                //----電阻檔-------
  200.                 A0=1;
  201.                 A1=0;
  202.                 CH=1;//電阻檔   
  203.                  
  204.                 while(K2==0){}
  205.                      }

  206.                 }
  207.        if(K1==0){
  208.              delay_1ms(5);
  209.             if(K1==0){
  210.                YEW=1;GRE=0;RED=1;
  211.                LCD_cursor(0x00);
  212.                LCD_prints("   MEASURE Cx   ");  
  213.                //----電容檔-------
  214.                 A0=0;
  215.                 A1=0;
  216.                 CH=3;//電容檔                     
  217.                while(K1==0){}
  218.                        }

  219.                 }


  220. }

  221. void  Value_to_ASCII(unsigned long value,uchar add)
  222. {
  223.     unsigned char temp[] = "0000.000K ";
  224.     temp[0] = value/1000000 + 0x30;//數值改成字符,液晶顯示需要ASCII碼
  225.     value = value%1000000;
  226.     temp[1] = value/100000 + 0x30;
  227.     value = value%100000;
  228.     temp[2] = value/10000 + 0x30;
  229.     value = value%10000;
  230.     temp[3] = value/1000 + 0x30;
  231.     value = value%1000;
  232.     temp[5] = value/100 + 0x30;
  233.     value = value%100;
  234.     temp[6] = value/10 + 0x30;
  235.     value = value%10;
  236.     temp[7] = value + 0x30;  
  237.    
  238. LCD_cursor(add);   //光標起始地址,第一行地址是0x00~0x0F,第二行地址是0x40~0x4f
  239. LCD_prints(temp);
  240. }

  241. void  Value_to_ASCIIL(unsigned long value,uchar add)
  242. {
  243.     unsigned char temp[] = "000000uH ";
  244.     temp[0] = value/100000 + 0x30;
  245.     value = value%100000;
  246.     temp[1] = value/10000 + 0x30;
  247.     value = value%10000;
  248.     temp[2] = value/1000 + 0x30;
  249.     value = value%1000;
  250.     temp[3] = value/100 + 0x30;
  251.     value = value%100;
  252.     temp[4] = value/10 + 0x30;
  253.     value = value%10;
  254.     temp[5] = value + 0x30;  
  255.    
  256. LCD_cursor(add);   //光標起始地址,第一行地址是0x00~0x0F,第二行地址是0x40~0x4f
  257. LCD_prints(temp);
  258. }
  259. void  Value_to_ASCIIC(unsigned long value,uchar add)
  260. {
  261.     unsigned char temp[] = "00000.0pF ";
  262.     temp[0] = value/100000 + 0x30;
  263.     value = value%100000;
  264.     temp[1] = value/10000 + 0x30;
  265.     value = value%10000;
  266.     temp[2] = value/1000 + 0x30;
  267.     value = value%1000;
  268.     temp[3] = value/100 + 0x30;
  269.     value = value%100;
  270.     temp[4] = value/10 + 0x30;
  271.     value = value%10;
  272.     temp[6] = value + 0x30;  
  273.    
  274. LCD_cursor(add);   //光標起始地址,第一行地址是0x00~0x0F,第二行地址是0x40~0x4f
  275. LCD_prints(temp);
  276. }
  277. //--------------------主程序--------------------------------
  278. void main()
  279. {
  280.    
  281.       TMOD=0x51;                 //設置定時器0,方式1::1位定時器
  282.       TH1=0;
  283.       TL1=0;
  284.       TH0=(65536-2100)/256; //設定定時周期
  285.       TL0=(65536-2100)%256;
  286.       TR0=1;
  287.       TR1=1;
  288.       ET1=1;
  289.       ET0=1;
  290.       EA=1;
  291. //----電阻檔-------
  292.       A0=1;
  293.       A1=0;
  294.     LCD_initial();
  295.           delay_1ms(50);
  296.     LCD_initial();
  297.           delay_1ms(50);
  298.     LCD_cursor(0x00);
  299.                
  300.     LCD_prints("   MEASURE Rx   ");
  301.     GRE=1;
  302.         YEW=0;
  303.           RED=1;
  304.     LCD_cursor(0x45);
  305.     CH=1;
  306.    
  307.         while(1)
  308.         {

  309.      Key_SM();
  310.     if(flag==1){

  311.         flag=0;

  312.         x=Pulsenum*65536+TL1;//計算1s內的脈沖個數,頻率=脈沖個數
  313. if(CH==1){

  314.         RZ=(Z1/x);//測量100到1000
  315.         RX=RZ-1000;
  316.         RX=RX>>1;

  317. if(RX>=100){
  318.         RX=RX+100;
  319.     }else{RX=0;}

  320.     if(x==0){RX=0;RX2=0;RX3=0;RX4=0;RX5=0;RX6=0;RX7=0;RX8=0;RX9=0;}
  321.   if(RX>1000000){RX=1000000; }
  322.             
  323.               RX2=(RX+RX3+RX4+RX5+RX6+RX7+RX8+RX9)>>3;//求平均提高精度

  324. RX9=RX8;RX8=RX7;RX7=RX6;RX6=RX5;RX5=RX4;RX4=RX3;RX3=RX;
  325.               //保存上一次的阻值
  326.             
  327.          Value_to_ASCII(RX2,0x44);//更新阻值顯示



  328. }
  329. if(CH==2){

  330.       
  331.         LZ=(x*39*C1)/100000;
  332.         LZ=LZ*x;
  333.         LZ=1000000/LZ;
  334.     if(x==0)LZ=0;
  335.   if(LZ>999999)LZ=999999; //限制最高值
  336.          Value_to_ASCIIL(LZ,0x44);//更新電感值顯示
  337. }
  338. if(CH==3){

  339.        CZ=660000/x;
  340.     if(x==0||x>30500)CZ=0;
  341.   if(CZ>999999)CZ=999999;  //限制最高值
  342.          Value_to_ASCIIC(CZ,0x44);//更新電容值顯示
  343. }
  344.          cnt2ms=0;
  345.          Pulsenum=0;
  346.          TH1=0;
  347.          TL1=0;
  348.          TR1=1;
  349.         
  350.     }
  351.         
  352.         }
  353. }
  354. /*******************************************************************************
  355. * 函數名:Extio interrupt
  356. * 函數功能:/TO引腳下降沿進入中斷
  357. * 入口參數:無
  358. * 返    回:無
  359. *******************************************************************************/
  360. void T1_interrupt(void) interrupt 3 using 0
  361. {
  362.    
  363.   Pulsenum++;        //保存測得脈沖值  
  364.         
  365. }
  366. /********************************************************************
  367. 函數功能:定時器/計時器1中斷處理
  368. 入口參數:null
  369. 返    回:null
  370. 備    注:null
  371. ********************************************************************/
  372. void Timer0IntProc() interrupt 1 using 0 //2ms
  373. {
  374.   TH0=(65536-2000)/256;
  375.   TL0=(65536-2000)%256;
  376.     cnt2ms++;

  377.         if(cnt2ms==500)        //1s計時到
  378.         {              
  379.                 cnt2ms = 0;
  380.             
  381.         flag=1;
  382.         }

  383. }
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1047409 發表于 2022-11-14 22:23 | 只看該作者
就是P2^4和P2^3對調一下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品欧美一区二区三区不卡 | 99reav | 国产成人精品网站 | 久久精品国产免费 | 日韩成人免费视频 | 91精品国产乱码久久久久久久久 | 欧美在线国产精品 | 日韩视频一区二区 | 在线小视频 | 亚洲成人午夜在线 | 免费国产一区 | 男女羞羞免费视频 | 国产高清性xxxxxxxx | 精品视频一区二区三区 | 久久久久国产精品 | 久久日本 | www.国产精品 | 一区二区亚洲 | 国产乱码精品1区2区3区 | 亚洲成人av| 中文在线а√在线8 | 羞羞视频在线观免费观看 | 日韩视频91| 久久精品亚洲精品国产欧美 | 亚洲狠狠 | 亚洲国产aⅴ成人精品无吗 亚洲精品久久久一区二区三区 | 亚洲欧美日韩精品久久亚洲区 | 99久久久久久 | 毛片一级电影 | 久久久夜| 日韩在线视频免费观看 | 国产伦精品一区二区三区精品视频 | 奇米在线| 精品国产精品三级精品av网址 | 欧美一区二区三区在线观看 | 欧美精品一二三区 | 亚洲视频在线看 | 国产97人人超碰caoprom | 精品久久久久久18免费网站 | 精品一区二区在线观看 | 日韩欧美在线观看 |