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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機按鍵按不動,沒反應是咋回事誰能幫我看一下?

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


單片機源程序如下:
  1. // 按鍵掃描
  2. /*********************************************************/
  3. void KeyScanf()
  4. {
  5.         if(KeySet_P==0)                // 判斷設置按鍵是否被按下
  6.         {
  7.                 EA=0;
  8.                
  9.                 /*將液晶顯示改為設置溫度的頁面****************************************************/
  10.                 LcdWriteCmd(0x01);                                         
  11.                 LcdGotoXY(0,0);
  12.                 LcdPrintStr("Temperature Set ");
  13.                 LcdGotoXY(1,0);
  14.                 LcdPrintStr("      -    C    ");
  15.                 LcdGotoXY(1,10);                                                
  16.                 LcdWriteData(0xdf);                       


  17.                 LcdGotoXY(1,4);                                                 // 在液晶上填充溫度的下限值      
  18.                 LcdPrintNum2(AlarmTL);      
  19.                 LcdGotoXY(1,7);                                                 // 在液晶上填充溫度的上限值
  20.                 LcdPrintNum2(AlarmTH);


  21.                 LcdGotoXY(1,5);                                                 // 光標定位到第1行第5列
  22.                 LcdWriteCmd(0x0f);                                // 光標閃爍
  23.                
  24.                 DelayMs(10);                                                  // 去除按鍵按下的抖動
  25.                 while(!KeySet_P);                                         // 等待按鍵釋放
  26.                 DelayMs(10);                                                  // 去除按鍵松開的抖動


  27.                 /*設置溫度的下限值****************************************************************/
  28.                 while(KeySet_P)                                                // “設置鍵”沒有被按下,則一直處于溫度下限的設置
  29.                 {
  30.                         if(KeyDown_P==0)                                // 判斷 “減按鍵“ 是否被按下               
  31.                         {
  32.                                 if(AlarmTL>0)                                        // 只有當溫度下限值大于0時,才能減1
  33.                                         AlarmTL--;
  34.                                 LcdGotoXY(1,4);                                 // 重新刷新顯示更改后的溫度下限值      
  35.                                 LcdPrintNum2(AlarmTL);                 
  36.                                 LcdGotoXY(1,5);                                // 重新定位閃爍的光標位置
  37.                                 DelayMs(350);                                        // 延時
  38.                         }
  39.                         if(KeyUp_P==0)                                  // 判斷 “加按鍵“ 是否被按下
  40.                         {
  41.                                 if(AlarmTL<99)                           // 只有當溫度下限值小于99時,才能加1
  42.                                         AlarmTL++;
  43.                                 LcdGotoXY(1,4);                                  // 重新刷新顯示更改后的溫度下限值
  44.                                 LcdPrintNum2(AlarmTL);
  45.                                 LcdGotoXY(1,5);                                // 重新定位閃爍的光標位置
  46.                                 DelayMs(350);                                        // 延時
  47.                         }      
  48.                 }


  49.                 LcdGotoXY(1,8);
  50.                 DelayMs(10);                                                  // 去除按鍵按下的抖動
  51.                 while(!KeySet_P);                                         // 等待按鍵釋放
  52.                 DelayMs(10);                                                  // 去除按鍵松開的抖動


  53.                 /*設置溫度的上限值****************************************************************/      
  54.                 while(KeySet_P)                                          // “設置鍵”沒有被按下,則一直處于溫度上限的設置
  55.                 {
  56.                         if(KeyDown_P==0)                                // 判斷 “減按鍵“ 是否被按下
  57.                         {
  58.                                 if(AlarmTH>0)                                  // 只有當溫度上限值大于0時,才能減1                       
  59.                                         AlarmTH--;
  60.                                 LcdGotoXY(1,7);                           // 重新刷新顯示更改后的溫度上限值
  61.                                 LcdPrintNum2(AlarmTH);
  62.                                 LcdGotoXY(1,8);                                // 重新定位閃爍的光標位置
  63.                                 DelayMs(350);                                        // 延時
  64.                         }
  65.                         if(KeyUp_P==0)                                   // 判斷 “加按鍵“ 是否被按下
  66.                         {
  67.                                 if(AlarmTH<99)                                 // 只有當溫度上限值小于99時,才能加1
  68.                                         AlarmTH++;
  69.                                 LcdGotoXY(1,7);                                // 重新刷新顯示更改后的溫度上限值        
  70.                                 LcdPrintNum2(AlarmTH);
  71.                                 LcdGotoXY(1,8);                                // 重新定位閃爍的光標位置
  72.                                 DelayMs(350);                                        // 延時
  73.                         }                                                                 
  74.                 }


  75.                 /*將液晶顯示改為設置濕度的頁面****************************************************/
  76.                 LcdWriteCmd(0x01);                                         
  77.                 LcdGotoXY(0,0);
  78.                 LcdPrintStr("  Humidity Set  ");
  79.                 LcdGotoXY(1,0);
  80.                 LcdPrintStr("      -   %RH   ");               


  81.                 LcdGotoXY(1,4);                                                 // 在液晶上填充濕度的下限值      
  82.                 LcdPrintNum2(AlarmHL);      
  83.                 LcdGotoXY(1,7);                                                 // 在液晶上填充濕度的上限值
  84.                 LcdPrintNum2(AlarmHH);


  85.                 LcdGotoXY(1,5);                                                 // 光標定位到第1行第5列
  86.                
  87.                 DelayMs(10);                                                  // 去除按鍵按下的抖動
  88.                 while(!KeySet_P);                                         // 等待按鍵釋放
  89.                 DelayMs(10);
  90.                
  91.                 /*設置濕度的下限值****************************************************************/
  92.                 while(KeySet_P)                                                 // “設置鍵”沒有被按下,則一直處于濕度下限的設置
  93.                 {
  94.                         if(KeyDown_P==0)                                // 判斷 “減按鍵“ 是否被按下
  95.                         {
  96.                                 if(AlarmHL>0)                                         // 只有當濕度下限值大于0時,才能減1
  97.                                         AlarmHL--;
  98.                                 LcdGotoXY(1,4);                                // 重新刷新顯示更改后的濕度下限值        
  99.                                 LcdPrintNum2(AlarmHL);
  100.                                 LcdGotoXY(1,5);                                // 重新定位閃爍的光標位置
  101.                                 DelayMs(350);
  102.                         }
  103.                         if(KeyUp_P==0)                                  // 判斷 “加按鍵“ 是否被按下
  104.                         {
  105.                                 if(AlarmHL<99)                          // 只有當濕度下限值小于99時,才能加1
  106.                                         AlarmHL++;
  107.                                 LcdGotoXY(1,4);                                  // 重新刷新顯示更改后的濕度下限值
  108.                                 LcdPrintNum2(AlarmHL);
  109.                                 LcdGotoXY(1,5);                          // 重新定位閃爍的光標位置
  110.                                 DelayMs(350);                                        // 延時
  111.                         }      
  112.                 }


  113.                 LcdGotoXY(1,8);
  114.                 DelayMs(10);                                                  // 去除按鍵按下的抖動
  115.                 while(!KeySet_P);                                         // 等待按鍵釋放
  116.                 DelayMs(10);                                                  // 去除按鍵松開的抖動
  117.                
  118.                 /*設置濕度的上限值****************************************************************/
  119.                 while(KeySet_P)                                           // “設置鍵”沒有被按下,則一直處于濕度上限的設置
  120.                 {
  121.                         if(KeyDown_P==0)                                 // 判斷 “減按鍵“ 是否被按下
  122.                         {
  123.                                 if(AlarmHH>0)                                  // 只有當濕度上限值大于0時,才能減1
  124.                                         AlarmHH--;
  125.                                 LcdGotoXY(1,7);                                  // 重新刷新顯示更改后的濕度上限值
  126.                                 LcdPrintNum2(AlarmHH);
  127.                                 LcdGotoXY(1,8);                           // 重新定位閃爍的光標位置
  128.                                 DelayMs(350);
  129.                         }
  130.                         if(KeyUp_P==0)                                         // 判斷 “加按鍵“ 是否被按下
  131.                         {
  132.                                 if(AlarmHH<99)                                // 只有當濕度上限值小于99時,才能加1
  133.                                         AlarmHH++;
  134.                                 LcdGotoXY(1,7);                                 // 重新刷新顯示更改后的濕度上限值      
  135.                                 LcdPrintNum2(AlarmHH);
  136.                                 LcdGotoXY(1,8);                                 // 重新定位閃爍的光標位置
  137.                                 DelayMs(350);                                        // 延時
  138.                         }      
  139.                 }


  140.                 /*將液晶顯示改為設置煙霧的頁面****************************************************/
  141.                 LcdWriteCmd(0x01);                                          // 設置界面的顯示框架
  142.                 LcdGotoXY(0,0);
  143.                 LcdPrintStr("   YanWu Set    ");
  144.                 LcdGotoXY(1,0);
  145.                 LcdPrintStr("        %   ");
  146.                 LcdGotoXY(1,4);                                                                // 顯示當前的報警值
  147.                 LcdPrintNum1(AlarmLG);                              


  148.                 LcdGotoXY(1,6);                                                                 // 光標定位到第1行第6列
  149.                 DelayMs(10);                                                                  // 去除按鍵按下的抖動
  150.                 while(!KeySet_P);                                                         // 等待按鍵釋放
  151.                 DelayMs(10);
  152.                
  153.                 while(KeySet_P)                                                                 // “設置鍵”沒有被按下,則一直處于光強下限的設置
  154.                 {
  155.                         if(KeyDown_P==0)                                                // 判斷 “減按鍵“ 是否被按下
  156.                         {
  157.                                 if(AlarmLG>1)                                                        // 只有gAlarmLG大于1才能減1                                                               
  158.                                         AlarmLG--;                              
  159.                                 LcdGotoXY(1,4);                                                // 液晶光標定位
  160.                                 LcdPrintNum1(AlarmLG);                // 刷新改變后的報警值
  161.                                 LcdGotoXY(1,6);
  162.                                 DelayMs(200);                                                        // 延時一下
  163.                         }
  164.                         if(KeyUp_P==0)                                                  // 判斷 “加按鍵“ 是否被按下
  165.                         {
  166.                         if(AlarmLG<99)                                                        // 只有gAlarmLG小于99才能加1
  167.                                         AlarmLG++;                              
  168.                                 LcdGotoXY(1,4);                                                // 液晶光標定位
  169.                                 LcdPrintNum1(AlarmLG);                // 刷新改變后的報警值
  170.                                 LcdGotoXY(1,6);
  171.                                 DelayMs(200);                                                        // 延時一下
  172.                         }      
  173.                 }


  174.                 /*完成設置,退出前的處理**********************************************************/
  175.                 LcdWriteCmd(0x0C);                                                          // 取消光標閃爍
  176.                 LcdShowInit();                                                                                // 液晶顯示為檢測界面的


  177.                 DelayMs(10);                                                                                  // 去除按鍵按下的抖動
  178.                 while(!KeySet_P);                                                                         // 等待按鍵釋放
  179.                 DelayMs(10);                                                                                  // 去除按鍵松開的抖動


  180.                 Sector_Erase(0x2000);                                                         // 存儲之前必須先擦除
  181.                 EEPROM_Write(0x2000,AlarmTL);                        // 把溫度下限存入到EEPROM的0x2000這個地址
  182.                 EEPROM_Write(0x2001,AlarmTH);                        // 把溫度上限存入到EEPROM的0x2001這個地址
  183.                 EEPROM_Write(0x2002,AlarmHL);                        // 把濕度下限存入到EEPROM的0x2002這個地址
  184.                 EEPROM_Write(0x2003,AlarmHH);                        // 把濕度上限存入到EEPROM的0x2003這個地址
  185.                 EEPROM_Write(0x2004,AlarmLG/10);        // 把煙霧報警值存入到EEPROM的0x2004和0x2005這兩個地址
  186.                 EEPROM_Write(0x2005,AlarmLG%10);
  187.                
  188.                 EA=1;
  189.         }      
  190. }




  191. /*********************************************************/
  192. // 報警判斷
  193. /*********************************************************/
  194. void AlarmJudge(void)
  195. {
  196.         /*溫度*/
  197.         if(temp>AlarmTH)                                // 溫度是否過高
  198.         {
  199.                 LedTH_P=0;
  200.                 LedTL_P=1;
  201.         }
  202.         else if(temp<AlarmTL)                // 溫度是否過低
  203.         {
  204.                 LedTL_P=0;
  205.                 LedTH_P=1;
  206.         }
  207.         else                                                                                // 溫度正常
  208.         {
  209.                 LedTH_P=1;
  210.                 LedTL_P=1;
  211.         }


  212.         /*濕度*/
  213.         if(humi>AlarmHH)                           // 濕度是否過高
  214.         {
  215.                 LedHH_P=0;
  216.           LedHL_P=1;
  217.         }
  218.         else if(humi<AlarmHL)                // 濕度是否過低
  219.         {
  220.                 LedHL_P=0;
  221.                 LedHH_P=1;
  222.         }
  223.         else                                                                           // 濕度正常
  224.         {
  225.                 LedHH_P=1;
  226.                 LedHL_P=1;
  227.         }
  228.       
  229.         /*煙霧*/
  230.         if(light>AlarmLG)
  231.         {
  232.                 LedLG_P=0;
  233.         }
  234.         else
  235.         {
  236.                 LedLG_P=1;
  237.         }


  238.         /*蜂鳴器*/
  239.         if((LedHH_P==0)||(LedHL_P==0)||(LedTH_P==0)||(LedTL_P==0)||(LedLG_P==0))         // 蜂鳴器判斷,只要至少1個報警燈亮,蜂鳴器就報警
  240.                 Buzzer_P=0;
  241.         else      
  242.                 Buzzer_P=1;
  243. }




  244. /*********************************************************/
  245. // 報警值初始化
  246. /*********************************************************/
  247. void AlarmInit(void)
  248. {
  249.         AlarmTL=EEPROM_Read(0x2000);        // 從EEPROM的0x2000這個地址讀取溫度的報警下限
  250.         AlarmTH=EEPROM_Read(0x2001);        // 從EEPROM的0x2001這個地址讀取溫度的報警上限
  251.         AlarmHL=EEPROM_Read(0x2002);        // 從EEPROM的0x2002這個地址讀取濕度的報警下限      
  252.         AlarmHH=EEPROM_Read(0x2003);        // 從EEPROM的0x2003這個地址讀取濕度的報警上限
  253.         AlarmLG=EEPROM_Read(0x2004)*100+EEPROM_Read(0x2005);                // 讀取煙霧報警值
  254.       
  255.         if((AlarmTL==0)||(AlarmTL>100))        // 如果溫度下限報警值讀出來異常(等于0或大于100),則重新賦值
  256.                 AlarmTL=20;
  257.         if((AlarmTH==0)||(AlarmTH>100))        // 如果溫度上限報警值讀出來異常(等于0或大于100),則重新賦值
  258.                 AlarmTH=35;
  259.         if((AlarmHL==0)||(AlarmHL>100))        // 如果溫度下限報警值讀出來異常(等于0或大于100),則重新賦值
  260.                 AlarmHL=40;
  261.         if((AlarmHH==0)||(AlarmHH>100))        // 如果溫度上限報警值讀出來異常(等于0或大于100),則重新賦值
  262.                 AlarmHH=85;
  263.         if((AlarmLG==0)||(AlarmLG>100))        // 如果讀取到的報警值異常,則重新賦值
  264.                 AlarmLG=60;
  265. }




  266. /*********************************************************/
  267. // 主函數
  268. /*********************************************************/
  269. void main(void)
  270. {
  271.         uchar i;                                // 循環變量


  272.         LcdInit();                                            // 液晶功能初始化
  273.         LcdShowInit();                                        // 液晶顯示初始化
  274.         AlarmInit();                                                // 報警值初始化


  275.         while(1)
  276.         {
  277.                 light=Get_ADC0832();                        // 讀取煙霧強度
  278.                 light=light/2.5;                                        // 縮小煙霧檢測結果(在0-99)
  279.                 if(light>99)                                                        // 如果大于99
  280.                         light=99;                                                                // 則依然保持99
  281.                 LcdGotoXY(0,9);                                                        // 液晶定位到第0行第6列
  282.                 LcdPrintNum1(light);                                                // 顯示測量結果
  283.                
  284.                 /*溫濕度讀取*/
  285.                 EA=0;
  286.                 ReadDhtData();                                                         // 檢測溫濕度數據;
  287.                 EA=1;
  288.                 LcdGotoXY(1,2);                                                         // 定位到要顯示溫度的地方
  289.                 LcdPrintNum2(temp);                                        // 顯示溫度值
  290.                 LcdGotoXY(1,11);                                                // 定位到要顯示濕度的地方
  291.                 LcdPrintNum2(humi);                                        // 顯示濕度值
  292.                
  293.                 // 報警判斷
  294.                 AlarmJudge();                                               
  295.                
  296.                 /*按鍵掃描和延時*/
  297.                 for(i=0;i<30;i++)
  298.                 {
  299.                         KeyScanf();                                                                // 按鍵判斷
  300.                         DelayMs(10);
  301.                 }
  302.         }
  303. }




  304. /*********************************************************/
  305. // 串口中斷服務程序
  306. /*********************************************************/
  307. void UartInt(void) interrupt 4
  308. {
  309.         uchar VoutH,VoutL;
  310.       
  311.         if(RI==1)
  312.         {
  313.         ES=0;
  314.                 RI=0;
  315.                 if(SBUF==0xAA)                // 起始位
  316.                 {
  317.                         while(!RI);
  318.                         VoutH=SBUF;                        // Vout(H)
  319.                         RI=0;
  320.                         while(!RI);
  321.                         VoutL=SBUF;                        // Vout(L)
  322.                         RI=0;
  323.                         while(!RI);                        // Vref(H)
  324.                         RI=0;
  325.                         while(!RI);                        // Vref(L)
  326.                         RI=0;
  327.                         while(!RI);                        // 校驗位
  328.                         RI=0;
  329.                         while(!RI);                        // 停止位
  330.                         RI=0;
  331.                        
  332.                         Value[gIndex]=VoutH*256+VoutL;
  333.                        
  334.                         gIndex++;
  335.                         if(gIndex==20)
  336.                                 gIndex=0;
  337.                 }
  338.                 EA=1;
  339.         }
  340. }
復制代碼


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

使用道具 舉報

沙發
ID:213173 發表于 2021-11-29 19:40 | 只看該作者
新手不要試圖一下子就能完成多項功能。應當循序漸進逐項的實現,再逐項組合。就算有大佬閑得dan疼幫你改好代碼你也看不懂,也就沒有多少實際意義。
回復

使用道具 舉報

板凳
ID:311846 發表于 2021-11-30 16:53 | 只看該作者
上拉IO電平,不知道你什么單片機,內部上拉或者外部上拉,限流,主循環屏蔽其他功能,單獨調試按鍵,調好后加入程序中,不想看你程序,僅提供方法
回復

使用道具 舉報

地板
ID:976767 發表于 2021-11-30 19:55 | 只看該作者
先單獨調試按鍵程序試試,然后再加其他
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区不卡 | 欧美激情综合 | 国产一区二区三区 | 在线日韩av电影 | 免费国产视频 | 国产精品海角社区在线观看 | 精品国产一区二区三区免费 | 视频一区在线 | 日韩成人精品在线观看 | 国产精品久久久久久福利一牛影视 | 午夜资源 | 亚洲天堂成人在线视频 | 日韩综合 | 天天弄天天操 | 日本一本视频 | 欧美午夜精品 | 亚洲一区 中文字幕 | 福利视频亚洲 | 一区二区三区高清 | jav成人av免费播放 | 免费v片| 国产综合久久 | 欧美国产精品 | 久艹av| 日一区二区 | 久久国产精品视频 | 一区二区免费在线观看 | 日本三级在线网站 | 亚洲精品久久久久久国产精华液 | 免费观看www7722午夜电影 | 国产精品精品视频一区二区三区 | 欧美一区二区三区在线看 | 可以免费观看的av | 欧美a区| 中文字字幕一区二区三区四区五区 | www.久久 | 亚洲久久 | 成人久久18免费网站 | 久久综合伊人 | 久久国产成人精品国产成人亚洲 | 精品成人在线视频 |