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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4079|回復(fù): 3
收起左側(cè)

單片機(jī)按鍵按不動(dòng),沒反應(yīng)是咋回事誰能幫我看一下?

[復(fù)制鏈接]
ID:942830 發(fā)表于 2021-11-28 19:56 | 顯示全部樓層 |閱讀模式
仿真截圖.png

單片機(jī)源程序如下:
  1. // 按鍵掃描
  2. /*********************************************************/
  3. void KeyScanf()
  4. {
  5.         if(KeySet_P==0)                // 判斷設(shè)置按鍵是否被按下
  6.         {
  7.                 EA=0;
  8.                
  9.                 /*將液晶顯示改為設(shè)置溫度的頁面****************************************************/
  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);                                                 // 光標(biāo)定位到第1行第5列
  22.                 LcdWriteCmd(0x0f);                                // 光標(biāo)閃爍
  23.                
  24.                 DelayMs(10);                                                  // 去除按鍵按下的抖動(dòng)
  25.                 while(!KeySet_P);                                         // 等待按鍵釋放
  26.                 DelayMs(10);                                                  // 去除按鍵松開的抖動(dòng)


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


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


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


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


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


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


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


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


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


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




  191. /*********************************************************/
  192. // 報(bào)警判斷
  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個(gè)報(bào)警燈亮,蜂鳴器就報(bào)警
  240.                 Buzzer_P=0;
  241.         else      
  242.                 Buzzer_P=1;
  243. }




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




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


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


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




  304. /*********************************************************/
  305. // 串口中斷服務(wù)程序
  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);                        // 校驗(yàn)位
  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. }
復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2021-11-29 19:40 | 顯示全部樓層
新手不要試圖一下子就能完成多項(xiàng)功能。應(yīng)當(dāng)循序漸進(jìn)逐項(xiàng)的實(shí)現(xiàn),再逐項(xiàng)組合。就算有大佬閑得dan疼幫你改好代碼你也看不懂,也就沒有多少實(shí)際意義。
回復(fù)

使用道具 舉報(bào)

ID:311846 發(fā)表于 2021-11-30 16:53 | 顯示全部樓層
上拉IO電平,不知道你什么單片機(jī),內(nèi)部上拉或者外部上拉,限流,主循環(huán)屏蔽其他功能,單獨(dú)調(diào)試按鍵,調(diào)好后加入程序中,不想看你程序,僅提供方法
回復(fù)

使用道具 舉報(bào)

ID:976767 發(fā)表于 2021-11-30 19:55 | 顯示全部樓層
先單獨(dú)調(diào)試按鍵程序試試,然后再加其他
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美三级在线 | 国产福利视频导航 | 欧美中文字幕一区二区 | 少妇一级淫片aaaaaaaaa | 国产精品成人在线播放 | 国产亚洲精品精品国产亚洲综合 | 亚洲乱码一区二区三区在线观看 | 成人精品一区二区三区中文字幕 | 成年人在线 | 国产亚洲精品美女久久久久久久久久 | 天天综合久久 | 91pron在线 | 99精品视频免费在线观看 | 成人精品一区二区三区中文字幕 | 日本三级全黄三级三级三级口周 | 久久一区二区三区四区五区 | 日韩一区二区久久 | 北条麻妃一区二区三区在线观看 | 午夜国产一级片 | 免费毛片在线 | 精久久久| 在线视频日韩 | 国产中文原创 | 久久久久久久久久久蜜桃 | 欧美激情综合色综合啪啪五月 | 99一级毛片 | 日韩1区 | 狠狠操网站 | 亚洲欧美一区二区三区国产精品 | 欧美一区二区在线免费观看 | 国产成人免费视频网站高清观看视频 | 日韩中文在线视频 | 99久久精品免费看国产四区 | 日日草天天干 | av夜夜操| 国产高清精品在线 | 91精品中文字幕一区二区三区 | 中文字幕国产日韩 | 欧美日韩在线播放 | 国产精品久久久久久久久免费樱桃 | 国产一区91精品张津瑜 |