找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 747|回复: 2
收起左侧

关于按键的单击和长按程序的问题

[复制链接]
ID:1030798 发表于 2023-5-17 09:26 | 显示全部楼层 |阅读模式
  1. #include <stc8h.h>

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

  4. #define LONG_PRESS_THRESHOLD 500 // 长按阈值,单位为毫秒

  5. // 假设按键状态的枚举类型为 ButtonState
  6. typedef enum {
  7.   IDLE,
  8.   PRESS,
  9.   RELEASE,
  10.   LONG_PRESS
  11. } ButtonState;

  12. // 按键状态变量
  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的长按操作
  28. void handleButton1LongPress() {
  29.   // 处理按键1的长按操作
  30.   // ...
  31. }

  32. // 处理按键2的长按操作
  33. void handleButton2LongPress() {
  34.   // 处理按键2的长按操作
  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.   // 初始化按键引脚设置
  45.       TSCHEN1 = 0xff;
  46.     TSCHEN2 = 0xff;
  47.     TSCFG1  = (7<<4) + 6;        //开关电容工作频率 = fosc/(2*(TSCFG1[6:4]+1))
  48.         TSCFG2  = 1;
  49.     TSCTRL = 0x80;//使能触摸按键功能、自动重复扫描按键、不等待标志清零、使用内部32K晶振、不使能16位比较器、不使能低功耗唤醒、单次扫描1次
  50.             P_SW2 |= 0x80; //开启控制寄存器
  51.         P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  52.         P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
  53.         P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  54.         P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  55.         P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  56.         P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  57.         P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  58.         P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口  

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

  62.         LEDCTRL = 0x20; //LED 驱动共阴/共阳模式
  63.         LEDCKS = 7; //设置 LED 刷新频率
  64.         LEDCTRL |= 0x80; //LED启动
  65.   
  66.   while (1) {
  67.     // 检测按键1状态
  68.     if (BUTTON1_PIN == 0) {
  69.       delayMs(5); // 延时去抖动
  70.       if (BUTTON1_PIN == 0) {
  71.         // 按键1被按下
  72.         button1State = PRESS;
  73.         
  74.         // 延时一段时间,并检测是否达到长按阈值
  75.         delayMs(LONG_PRESS_THRESHOLD);
  76.         if (BUTTON1_PIN == 0) {
  77.           // 达到长按阈值
  78.           button1State = LONG_PRESS;
  79.           handleButton1LongPress();
  80.         } else {
  81.           // 没有达到长按阈值,执行单击操作
  82.           button1State = RELEASE;
  83.           handleButton1Click();
  84.         }
  85.         
  86.         // 等待按键释放
  87.         while (BUTTON1_PIN == 0);
  88.         button1State = IDLE;
  89.       }
  90.     }
  91.    
  92.     // 检测按键2状态
  93.     if (BUTTON2_PIN == 0) {
  94.       delayMs(5); // 延时去抖动
  95.       if (BUTTON2_PIN == 0) {
  96.         // 按键2被按下
  97.         button2State = PRESS;
  98.         
  99.         // 延时一段时间,并检测是否达到长按阈值
  100.         delayMs(LONG_PRESS_THRESHOLD);
  101.         if (BUTTON2_PIN == 0) {
  102.           // 达到长按阈值
  103.             button2State = LONG_PRESS;
  104.             handleButton2LongPress();
  105.         } else {
  106. // 没有达到长按阈值,执行单击操作
  107.             button2State = RELEASE;
  108.             handleButton2Click();
  109. }
  110.     // 等待按键释放
  111.     while (BUTTON2_PIN == 0);
  112.     button2State = IDLE;
  113.   }
  114. }
  115.   }
  116. }

  117. // 执行其他代码逻辑

  118.          
复制代码
为啥我按键没按他就已经亮了
回复

使用道具 举报

ID:213173 发表于 2023-5-17 21:00 | 显示全部楼层
STC8H触摸键功能做长按有点难度。
Desktop.rar (1.26 MB, 下载次数: 10)
回复

使用道具 举报

ID:140489 发表于 2023-5-18 08:43 | 显示全部楼层
按键消抖不要用延时
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表