标题: 基于单片机计时器实现的按键长按功能无法正常使用 [打印本页]

作者: 李小虫    时间: 2024-2-20 14:07
标题: 基于单片机计时器实现的按键长按功能无法正常使用
我的设想是在按键按下时按键计时的标志量清零,然后一秒加一,按键抬起时记录时间数据判断,超过两秒即为长按,执行语句,但是代码写出来按按键没有用,下面是代码段这个是按键读取的单片机代码,按下按键flag_key置1,松手变成2
  1. unsigned char read_key()
  2. {
  3.         unsigned char line,row,key_value=0;
  4.         switch (key_sate)
  5.         {
  6.                 case 1:
  7.                 {
  8.                         P33=0;
  9.                         P32=0;
  10.                         P42=1;
  11.                         P44=1;
  12.                         if(P42==0||P44==0)
  13.                         {
  14.                         Delay_ms(5);
  15.                         if(P42==0||P44==0)
  16.                                 {
  17.                                 key_sate=2;
  18.                                 flag_key=1;
  19.                                 }
  20.                         }
  21.                 }
  22.                         break;
  23.                 case 2:
  24.                 {
  25.                         if(P44==0)
  26.                                 line=1;
  27.                         if(P42==0)
  28.                                 line=2;
  29.                         P33=1;
  30.                         P32=1;
  31.                         P42=0;
  32.                         P44=0;
  33.                         if(P33==0)
  34.                                 row=4;
  35.                         if(P32==0)
  36.                                 row=3;
  37.                         key_value=row*10+line;
  38.                         key_sate=3;
  39.                 }
  40.                         break;
  41.                 case 3:
  42.                 {
  43.                         if(P32==1&&P33==1&&P42==0&&P44==0)
  44.                         {
  45.                                         key_sate=1;
  46.                                         flag_key=2;
  47.                         }
  48.                 }
  49.                         break;
  50.         }
  51.         return key_value;
  52. }
复制代码
然后是定时器计时的代码,中间有几句是读取555频率的
  1. void timer1_ms() interrupt 3
  2. {
  3.         time_1ms++;
  4.         if(flag_key==1)
  5.         {
  6.                 key_time=0;
  7.                 key_time_1s=0;
  8.         }
  9.         if(time_1ms>=1000)
  10.         {
  11.                 frequency_ne555=count_ne555;
  12.                 count_ne555=0;
  13.                 time_1s++;
  14.                 key_time_1s++;
  15.                 time_1ms=0;
  16.         }
  17.         if(flag_key==2)
  18.         {
  19.                 key_time=key_time_1s;
  20.         }
  21. }
复制代码
最后就是判断长按的,然后执行的代码段
  1. void mod_re_time()
  2. {
  3.         unsigned char i,time_h_1,time_m_1,count_1;
  4.         time_h_1=time_h;
  5.         time_m_1=time_m;
  6.         count_1=count;
  7.         if(key==31)
  8.         {
  9.                 mod_re++;
  10.                 if(mod_re>=4)
  11.                         mod_re=1;
  12.         }
  13.         if(key==32)
  14.         {
  15.                 if(key_time>=2)
  16.                 {
  17.                 key=0;
  18.                 count=0;
  19.                 key_time=0;
  20.                 sum_tem=0;
  21.                 sum_hum=0;
  22.                 ave_tem=0;
  23.                 ave_hum=0;
  24.                 max_tem=0;
  25.                 max_hum=0;
  26.                 key_time_1s=0;
  27.                 }
  28.         }
复制代码

屏幕截图 2024-02-20 202359.png (39.87 KB, 下载次数: 94)

按键接线

按键接线

作者: tyrl800    时间: 2024-2-20 17:11
键盘接口电路先画出来才能检查程序
作者: wulin    时间: 2024-2-20 19:17
这个示例里有你想要的内容
4位冒号数码管时钟 单键调时 仿真.rar (128.22 KB, 下载次数: 19)


作者: 李小虫    时间: 2024-2-20 20:41
tyrl800 发表于 2024-2-20 17:11
键盘接口电路先画出来才能检查程序

补上了,谢谢提醒了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1