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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

[已解決]STC12C5A60S2單片機掃描獨立按鍵反應不靈敏 附代碼

[復制鏈接]
ID:1041313 發表于 2022-10-28 15:52 | 顯示全部樓層 |閱讀模式
如題,先說明應用場景和問題工作流程如下:在循環中按下按鍵3,進入模式切換函數,在通過按鍵1和按鍵2選擇自動或手動然后不斷循環,判斷按鍵3是否按下,如無則進入之前選定的模式函數中。

自動模式里包含很多閾值判斷,這個沒有問題。問題出在手動模式中,
手動模式中包含了按鍵鍵值判斷,啟動手動模式后按鍵的反應并不靈敏,有時需要按兩三下才能正常工作,有時又一下就能工作

同時進入手動模式后,外面按鍵3判斷模式切換反應也遲鈍了,而在自動模式(自動模式不包含手動的按鍵判斷)中,模式切換反應很靈敏

在測試中,將手動模式中的按鍵判斷刪去后,按鍵3判斷模式反應也靈敏了。當然按鍵1、2此時是無反應的

下面貼出單片機代碼,求有大佬來看一眼指點迷津,感謝!

/***********************************************************************
感謝大佬的解惑,一眼就看出我代碼問題所在

按我的理解(不知道對不對哈):主要是Key()調用次數過多,變量使用過多,導致無法在按鍵按下時及時更新鍵值

解決方法是將ManControl()中的Key()調用刪去,改為使用主循環中的Mode_KeyNum變量進行判斷即可,
這樣就解決了按鍵按下有時有反應,有時沒有反應的問題了!

*************************************************************************/

定時器掃描的獨立按鍵Key函數
  1. #include <STC12C5A60S2.H>


  2. unsigned char Key_KeyNumber=0;

  3. unsigned char Key_GetState()
  4. {
  5.         unsigned char Keynum = 0;
  6.         
  7.         if(P40==0){Keynum=1;}
  8.         if(P41==0){Keynum=2;}
  9.         if(P44==0){Keynum=3;}
  10.         
  11.         return Keynum;
  12. }

  13. void Key_Loop(void)
  14. {
  15.         static unsigned char NowState,LastState;
  16.         LastState = NowState;
  17.         NowState = Key_GetState();
  18.         
  19.         if(LastState==1 && NowState==0){Key_KeyNumber = 1;}
  20.         if(LastState==2 && NowState==0){Key_KeyNumber = 2;}
  21.         if(LastState==3 && NowState==0){Key_KeyNumber = 3;}
  22. }

  23. unsigned char Key(void)
  24. {
  25.         unsigned char Temp=0;
  26.         Temp = Key_KeyNumber;
  27.         Key_KeyNumber = 0;
  28.         return Temp;
  29. }
復制代碼


自動模式的函數
  1. void AutoControl(void)
  2. {
  3.         TampData = Temp_RawData();
  4.         HumiData = Humi_RawData();
  5.         CO2DataBuffer  = CO2_RawData();
  6.         TVOCDataBuffer = TVOC_RawData();
  7.         TempArray = Temp_Data();
  8.         HumiArray = Humi_Data();

  9.         LCD12864_ShowString(0,0,"排氣");                //顯示正常狀態界面
  10.         LCD12864_ShowString(0,4,"加濕");
  11.         LCD12864_ShowString(1,0,"室內溫度:");
  12.         LCD12864_ShowString(2,0,"室內濕度:");
  13.         LCD12864_ShowString(1,7,"℃");
  14.         LCD12864_ShowString(2,7,"%");
  15.         LCD12864_ShowString(3,0,"室內空氣質量:");
  16.         LCD12864_ShowString(1,5,&TempArray[0]);        //溫濕度顯示
  17.         LCD12864_ShowString(2,5,&HumiArray[0]);
  18.         
  19.         if(TampData>=240 && TampData<300 && HumiData>500 && HumiData<800)                //夏季室內溫濕度判斷
  20.         {
  21.                 LCD12864_ShowString(0,6,":Off");                //加濕關
  22.                 Humidifier=1;
  23.                 HumiStatus[0]=0x30;
  24.         }
  25.         else if(TampData>240 && TampData<300 && HumiData<400)
  26.         {
  27.                 LCD12864_ShowString(0,6,":On");                        //加濕開
  28.                 Humidifier=0;
  29.                 HumiStatus[0]=0x31;
  30.         }
  31.         else
  32.         {
  33.                 LCD12864_ShowString(0,6,":Off");
  34.                 Humidifier=1;
  35.                 HumiStatus[0]=0x30;
  36.         }

  37.         if(TampData>160 && TampData<240 && HumiData>300 && HumiData<600)                //冬季室內溫濕度判斷
  38.         {
  39.                 LCD12864_ShowString(0,6,":Off");                //加濕關
  40.                 Humidifier=1;
  41.                 HumiStatus[0]=0x30;
  42.         }
  43.         else if(TampData>160 && TampData<240 && HumiData<300)
  44.         {
  45.                 LCD12864_ShowString(0,6,":On");                        //加濕開
  46.                 Humidifier=0;
  47.                 HumiStatus[0]=0x31;
  48.         }
  49.         else
  50.         {
  51.                 LCD12864_ShowString(0,6,":Off");
  52.                 Humidifier=1;
  53.                 HumiStatus[0]=0x30;
  54.         }

  55.         if(CO2DataBuffer < 650 && TVOCDataBuffer < 200)                //空氣質量判斷
  56.         {
  57.                 LCD12864_ShowString(3,7,"優");
  58.                 LCD12864_ShowString(0,2,":Off");
  59.                 ExhaustFan=1;
  60.                 FanStatus[0]=0x30;
  61.         }
  62.         else if(CO2DataBuffer >= 650 && CO2DataBuffer <1000 && TVOCDataBuffer >=200 && TVOCDataBuffer < 400)
  63.         {
  64.                 LCD12864_ShowString(3,7,"良");
  65.         }
  66.         else
  67.         {
  68.                 LCD12864_ShowString(3,7,"差");
  69.                 LCD12864_ShowString(0,2,":On ");
  70.                 ExhaustFan=0;
  71.                 FanStatus[0]=0x31;
  72.         }
  73. }
復制代碼

手動模式的函數
  1. void ManControl(void)
  2. {
  3.         TempArray1 = Temp_Data();
  4.         HumiArray1 = Humi_Data();
  5.         CO2DataBuffer1  = CO2_RawData();
  6.         TVOCDataBuffer1 = TVOC_RawData();
  7.       

  8.       
  9.         LCD12864_ShowString(0,0,"排氣");                //顯示正常狀態界面
  10.         LCD12864_ShowString(0,4,"加濕");
  11.         LCD12864_ShowString(1,0,"室內溫度:");
  12.         LCD12864_ShowString(2,0,"室內濕度:");
  13.         LCD12864_ShowString(1,7,"℃");
  14.         LCD12864_ShowString(2,7,"%");
  15.         LCD12864_ShowString(3,0,"室內空氣質量:");
  16.         LCD12864_ShowString(1,5,&TempArray1[0]);        //溫濕度顯示
  17.         LCD12864_ShowString(2,5,&HumiArray1[0]);
  18.       
  19.         KeyNum = Key();
  20.         switch(KeyNum)
  21.         {
  22.                 case 1: ExhaustFan =! ExhaustFan;
  23.                                 KeyNum=0;break;
  24.                 case 2: Humidifier =! Humidifier;
  25.                                 KeyNum=0;break;
  26.         }
  27.       
  28.         if(ExhaustFan==0)
  29.         {
  30.                 LCD12864_ShowString(0,2,":On ");
  31.                 FanStatus[0]=0x31;
  32.         }
  33.         else
  34.         {
  35.                 LCD12864_ShowString(0,2,":Off");
  36.                 FanStatus[0]=0x30;
  37.         }
  38.       
  39.         if(Humidifier==0)
  40.         {
  41.                 LCD12864_ShowString(0,6,":On ");
  42.                 HumiStatus[0]=0x31;
  43.         }
  44.         else
  45.         {
  46.                 LCD12864_ShowString(0,6,":Off");
  47.                 HumiStatus[0]=0x30;
  48.         }

  49.       
  50.         if(CO2DataBuffer1 < 650 && TVOCDataBuffer1 < 200)                //空氣質量判斷
  51.         {
  52.                 LCD12864_ShowString(3,7,"優");
  53.         }
  54.         else if(CO2DataBuffer1 >= 650 && CO2DataBuffer1 <1000 && TVOCDataBuffer1 >=200 && TVOCDataBuffer1 < 400)
  55.         {
  56.                 LCD12864_ShowString(3,7,"良");
  57.         }
  58.         else
  59.         {
  60.                 LCD12864_ShowString(3,7,"差");
  61.         }
  62. }
復制代碼




不斷循環的主函數

  1. Mode_KeyNum = Key();
  2.                         if(Mode_KeyNum==3)
  3.                         {
  4.                                 unsigned char SelectMode_Count=5;
  5.                                 Mode_KeyNum=0;
  6.                                 LCD12864_WriteCommand(0x01);
  7.                                 while(SelectMode_Count!=0)
  8.                                 {
  9.                                         if(Timer0_Flag==1)
  10.                                         {
  11.                                                 SelectMode_Count--;
  12.                                                 Timer0_Flag=0;
  13.                                         }
  14.                                         LCD12864_ShowString(1,0,"請選擇模式:");
  15.                                         LCD12864_ShowUnsignedInt(3,0,SelectMode_Count,3);
  16.                                        
  17.                                         SelectMode_KeyNum = Key();
  18.                                         switch(SelectMode_KeyNum)
  19.                                         {
  20.                                                 case 1: SelectMode_Flag=1;LCD12864_ShowString(2,0,"手動模式");DeviceModeStatus[0]=0x31;break;
  21.                                                 case 2: SelectMode_Flag=0;LCD12864_ShowString(2,0,"自動模式");DeviceModeStatus[0]=0x30;break;
  22.                                                 default:;
  23.                                         }
  24.                                 }
  25.                                 LCD12864_WriteCommand(0x01);
  26.                         }
  27.                        
  28.                         if(MQ9==1 && MQ2==1 && SelectMode_Flag==0)
  29.                         {
  30.                                 AutoControl();
  31.                         }
  32.                         else if(MQ9==1 && MQ2==1 && SelectMode_Flag==1)
  33.                         {
  34.                                 ManControl();
  35.                         }
復制代碼




定時器函數(此處僅貼出了和按鍵掃描相關的部分)

  1. void Timer0_Routine(void) interrupt 1
  2. {
  3.         static unsigned int Key_TimerCount,MQ_TimerCount;
  4. if(MQ_TimerCount>=100)
  5. {
  6.         MQ_TimerCount=0;
  7.         Timer0_Flag = !Timer0_Flag;
  8. }
  9.         if(Key_TimerCount>=2)
  10.         {
  11.                 Key_TimerCount=0;
  12.                 Key_Loop();
  13.         }
  14. }

  15. void Timer0_Init(void)        //定時器0 10毫秒中斷初始化函數@11.0592MHz
  16. {
  17.         AUXR &= 0x7F;                //定時器時鐘12T模
  18.         TMOD &= 0xF0;                //設置定時器模式
  19.         TL0 = 0x00;                //設置定時初始值
  20.         TH0 = 0xDC;                //設置定時初始值
  21.         TF0 = 0;                //清除TF0標志
  22.         TR0 = 1;                //定時器0開始計時
  23.       
  24.       
  25.         EA = 1;                                //總中斷允許
  26.         ET0 = 1;                        //中斷獨立開關
  27.         IPH = 0x02;
  28.         PT0=1;                                //中斷優先級
  29. }
復制代碼








回復

使用道具 舉報

ID:1041313 發表于 2022-10-28 19:32 | 顯示全部樓層
沒有大佬幫忙看看嗎代碼小白一個,知道肯定有很多不合理的錯誤寫代碼習慣,求大佬多來指點
回復

使用道具 舉報

ID:161164 發表于 2022-10-28 21:29 | 顯示全部樓層
Key()函數在運行手動模式時會運行三次
只有在主函數18行之后,ManControl()函數20行之前
有按鍵按下并且定時中斷運行更新Key_KeyNumber
才能生效
想也想到多么困難
感覺key()函數有點多余
直接用Key_KeyNumber不好嗎?
回復

使用道具 舉報

ID:1041313 發表于 2022-10-28 23:07 | 顯示全部樓層
lkc8210 發表于 2022-10-28 21:29
Key()函數在運行手動模式時會運行三次
只有在主函數18行之后,ManControl()函數20行之前
有按鍵按下并且 ...

原來是這樣!醍醐灌頂!謝謝大佬!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美激情一区二区三级高清视频 | 亚洲www. | 精品av天堂毛片久久久借种 | 欧美 视频 | 亚洲福利在线观看 | 极品电影院 | 日本三级全黄三级三级三级口周 | 日本人做爰大片免费观看一老师 | 午夜免费视频 | 欧美区日韩区 | 国产在线h | 国产成人网| 久久久国产精品 | 午夜免费影视 | 中文字幕亚洲视频 | 99免费视频 | 国产9 9在线 | 中文 | 91亚洲精品久久久电影 | 成人午夜视频在线观看 | 久久美女网 | 中文字幕一区在线观看视频 | 五月婷婷 六月丁香 | 狠狠干夜夜草 | 欧美激情网站 | 国产精品美女久久久久久免费 | 日本精品一区二区三区在线观看 | 日韩中文在线视频 | 一级毛片在线播放 | 国产欧美久久一区二区三区 | 国内自拍偷拍 | 91欧美 | 欧美综合一区二区三区 | 久久久婷 | 亚洲国产精品久久人人爱 | 国产精品久久久久久久久久久久午夜片 | 亚洲成人免费视频在线 | 欧美二区三区 | 日韩久久久久久久 | 亚洲精品久久久一区二区三区 | 超碰地址 | www.日韩 |