找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 876|回复: 3
收起左侧

基于单片机计时器实现的按键长按功能无法正常使用

[复制链接]
ID:1104689 发表于 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.         }
复制代码

按键接线

按键接线
回复

使用道具 举报

ID:275826 发表于 2024-2-20 17:11 | 显示全部楼层
键盘接口电路先画出来才能检查程序
回复

使用道具 举报

ID:213173 发表于 2024-2-20 19:17 | 显示全部楼层
这个示例里有你想要的内容
4位冒号数码管时钟 单键调时 仿真.rar (128.22 KB, 下载次数: 19)
回复

使用道具 举报

ID:1104689 发表于 2024-2-20 20:41 | 显示全部楼层
tyrl800 发表于 2024-2-20 17:11
键盘接口电路先画出来才能检查程序

补上了,谢谢提醒了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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