標(biāo)題: 關(guān)于按鍵的單擊和長(zhǎng)按程序的問(wèn)題 [打印本頁(yè)]

作者: 231244234    時(shí)間: 2023-5-17 09:26
標(biāo)題: 關(guān)于按鍵的單擊和長(zhǎng)按程序的問(wèn)題
  1. #include <stc8h.h>

  2. #define BUTTON1_PIN P00
  3. #define BUTTON2_PIN P01

  4. #define LONG_PRESS_THRESHOLD 500 // 長(zhǎng)按閾值,單位為毫秒

  5. // 假設(shè)按鍵狀態(tài)的枚舉類(lèi)型為 ButtonState
  6. typedef enum {
  7.   IDLE,
  8.   PRESS,
  9.   RELEASE,
  10.   LONG_PRESS
  11. } ButtonState;

  12. // 按鍵狀態(tài)變量
  13. ButtonState button1State = IDLE;
  14. ButtonState button2State = IDLE;

  15. // 處理按鍵1的單擊操作
  16. void handleButton1Click() {
  17.   // 處理按鍵1的單擊操作
  18.         COM4_DA_L= 0xff;

  19.   // ...
  20. }

  21. // 處理按鍵2的單擊操作
  22. void handleButton2Click() {
  23.   // 處理按鍵2的單擊操作
  24.           COM5_DA_L= 0xff;

  25.   // ...
  26. }

  27. // 處理按鍵1的長(zhǎng)按操作
  28. void handleButton1LongPress() {
  29.   // 處理按鍵1的長(zhǎng)按操作
  30.   // ...
  31. }

  32. // 處理按鍵2的長(zhǎng)按操作
  33. void handleButton2LongPress() {
  34.   // 處理按鍵2的長(zhǎng)按操作
  35.   // ...
  36. }

  37. void delayMs(unsigned int ms) {
  38.   unsigned int i, j;
  39.   for (i = ms; i > 0; i--) {
  40.     for (j = 110; j > 0; j--);
  41.   }
  42. }

  43. void main(void) {
  44.   // 初始化按鍵引腳設(shè)置
  45.       TSCHEN1 = 0xff;
  46.     TSCHEN2 = 0xff;
  47.     TSCFG1  = (7<<4) + 6;        //開(kāi)關(guān)電容工作頻率 = fosc/(2*(TSCFG1[6:4]+1))
  48.         TSCFG2  = 1;
  49.     TSCTRL = 0x80;//使能觸摸按鍵功能、自動(dòng)重復(fù)掃描按鍵、不等待標(biāo)志清零、使用內(nèi)部32K晶振、不使能16位比較器、不使能低功耗喚醒、單次掃描1次
  50.             P_SW2 |= 0x80; //開(kāi)啟控制寄存器
  51.         P0M1 = 0x00;   P0M0 = 0x00;   //設(shè)置為準(zhǔn)雙向口
  52.         P1M1 = 0x00;   P1M0 = 0x00;   //設(shè)置為準(zhǔn)雙向口
  53.         P2M1 = 0x00;   P2M0 = 0x00;   //設(shè)置為準(zhǔn)雙向口
  54.         P3M1 = 0x00;   P3M0 = 0x00;   //設(shè)置為準(zhǔn)雙向口
  55.         P4M1 = 0x00;   P4M0 = 0x00;   //設(shè)置為準(zhǔn)雙向口
  56.         P5M1 = 0x00;   P5M0 = 0x00;   //設(shè)置為準(zhǔn)雙向口
  57.         P6M1 = 0x00;   P6M0 = 0x00;   //設(shè)置為準(zhǔn)雙向口
  58.         P7M1 = 0x00;   P7M0 = 0x00;   //設(shè)置為準(zhǔn)雙向口  

  59.         COMEN = 0xff; //使能 COM0~COM7
  60.         SEGENL = 0xff; //使能 SEG0~SEG7
  61.         SEGENH = 0xff; //使能 SEG8~SEG15

  62.         LEDCTRL = 0x20; //LED 驅(qū)動(dòng)共陰/共陽(yáng)模式
  63.         LEDCKS = 7; //設(shè)置 LED 刷新頻率
  64.         LEDCTRL |= 0x80; //LED啟動(dòng)
  65.   
  66.   while (1) {
  67.     // 檢測(cè)按鍵1狀態(tài)
  68.     if (BUTTON1_PIN == 0) {
  69.       delayMs(5); // 延時(shí)去抖動(dòng)
  70.       if (BUTTON1_PIN == 0) {
  71.         // 按鍵1被按下
  72.         button1State = PRESS;
  73.         
  74.         // 延時(shí)一段時(shí)間,并檢測(cè)是否達(dá)到長(zhǎng)按閾值
  75.         delayMs(LONG_PRESS_THRESHOLD);
  76.         if (BUTTON1_PIN == 0) {
  77.           // 達(dá)到長(zhǎng)按閾值
  78.           button1State = LONG_PRESS;
  79.           handleButton1LongPress();
  80.         } else {
  81.           // 沒(méi)有達(dá)到長(zhǎng)按閾值,執(zhí)行單擊操作
  82.           button1State = RELEASE;
  83.           handleButton1Click();
  84.         }
  85.         
  86.         // 等待按鍵釋放
  87.         while (BUTTON1_PIN == 0);
  88.         button1State = IDLE;
  89.       }
  90.     }
  91.    
  92.     // 檢測(cè)按鍵2狀態(tài)
  93.     if (BUTTON2_PIN == 0) {
  94.       delayMs(5); // 延時(shí)去抖動(dòng)
  95.       if (BUTTON2_PIN == 0) {
  96.         // 按鍵2被按下
  97.         button2State = PRESS;
  98.         
  99.         // 延時(shí)一段時(shí)間,并檢測(cè)是否達(dá)到長(zhǎng)按閾值
  100.         delayMs(LONG_PRESS_THRESHOLD);
  101.         if (BUTTON2_PIN == 0) {
  102.           // 達(dá)到長(zhǎng)按閾值
  103.             button2State = LONG_PRESS;
  104.             handleButton2LongPress();
  105.         } else {
  106. // 沒(méi)有達(dá)到長(zhǎng)按閾值,執(zhí)行單擊操作
  107.             button2State = RELEASE;
  108.             handleButton2Click();
  109. }
  110.     // 等待按鍵釋放
  111.     while (BUTTON2_PIN == 0);
  112.     button2State = IDLE;
  113.   }
  114. }
  115.   }
  116. }

  117. // 執(zhí)行其他代碼邏輯

  118.          
復(fù)制代碼
為啥我按鍵沒(méi)按他就已經(jīng)亮了

作者: wulin    時(shí)間: 2023-5-17 21:00
STC8H觸摸鍵功能做長(zhǎng)按有點(diǎn)難度。
Desktop.rar (1.26 MB, 下載次數(shù): 10)


作者: lids    時(shí)間: 2023-5-18 08:43
按鍵消抖不要用延時(shí)




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1