找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2664|回复: 11
打印 上一主题 下一主题
收起左侧

C语言编程 如何实现按键按下不影响程序执行?

  [复制链接]
跳转到指定楼层
楼主
单片机如何实现按键按下不影响程序正常执行
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:57657 发表于 2022-2-9 21:30 | 只看该作者
你这样肯定是程序逻辑有问题,都用定时器中断处理的。
回复

使用道具 举报

板凳
ID:624769 发表于 2022-2-9 22:35 | 只看该作者
你按键程序里面只要没有 delay 或者 while 就不会影响程序运行。
回复

使用道具 举报

地板
ID:514254 发表于 2022-2-10 00:18 | 只看该作者
按键用中断实现或者具体的事务由定时器实现
回复

使用道具 举报

5#
ID:161164 发表于 2022-2-10 01:40 | 只看该作者
不要用delay()!不要用delay()!不要用delay()!

给个栗子
  1. #include <reg52.h>

  2. typedef         unsigned char        u8;  //0 to 255
  3. typedef         unsigned int        u16;  //0 to 65535

  4. sbit KEY_XX = P3^5;
  5. u8 mode = 3;
  6. u8 i = 0;
  7. void disp()
  8. {
  9.     switch (mode)
  10.     {
  11.     case 0:
  12.         P1 = ~(0x01 << i);
  13.         break;
  14.     case 1:
  15.         P1 = ~(0x80 >> i);
  16.         break;
  17.     case 2:
  18.         P1 <<= 1;
  19.         if(P1 & 0x80)
  20.         {
  21.             P1 &= 0xFE;
  22.         } else {
  23.             P1 |= 0x01;
  24.         }
  25.         break;
  26.     case 3:
  27.         P1 >>= 1;
  28.         if(P1 & 0x01)
  29.         {
  30.             P1 &= 0x7F;
  31.         } else {
  32.             P1 |= 0x80;
  33.         }
  34.         break;
  35.     default:
  36.         break;
  37.     }
  38.     i = ++i %8;
  39. }
  40. void key_Proc()//单键短按
  41. {
  42.     static u16 Delay_XD=0;                        //消抖计数
  43.     if(!KEY_XX)
  44.     {
  45.         if(Delay_XD<0xFFFF)Delay_XD++;
  46.         //else Delay_XD = 0;                //连按功能
  47.         if(Delay_XD==0xFF)                        //消抖
  48.         {
  49.             mode = ++mode % 4;
  50.             i = 0;
  51.             P1 = 0xFF;
  52.         }
  53.     }
  54.     else                                                        //按键抬起
  55.         Delay_XD=0;                                        //Delay_XD清0
  56. }
  57. void main()
  58. {   u16 ScanCNT = 0;
  59.     while(1)
  60.     {
  61.         if(ScanCNT++ > 2000)
  62.         {
  63.             ScanCNT = 0;
  64.             disp();
  65.         }
  66.         key_Proc();
  67.     }
  68. }
复制代码



回复

使用道具 举报

6#
ID:592807 发表于 2022-2-10 09:22 | 只看该作者
定时器中断检测按键状态
回复

使用道具 举报

7#
ID:136119 发表于 2022-2-10 09:29 | 只看该作者
这个思路 是否适合你

BaiduShurufa_2022-2-10_9-28-39.png (71.14 KB, 下载次数: 25)

BaiduShurufa_2022-2-10_9-28-39.png
回复

使用道具 举报

8#
ID:415064 发表于 2022-2-10 11:14 | 只看该作者
不要用死循环,每隔10ms读一次io电平,多看下状态机
回复

使用道具 举报

9#
ID:313048 发表于 2022-2-10 11:21 | 只看该作者
用状态机就可以了。
回复

使用道具 举报

10#
ID:807651 发表于 2022-2-10 13:41 | 只看该作者
if(Time_2ms == 1)//定时器中断每2ms检测按键一次
{
  Time_2ms = 0;
   if(KEY == 0)//按键按下 低有效
   {
      b_key_10 +=1;
      b_key_11 = 0;
      if(b_key_10 > 24)//消抖50ms
     {
        b_key_10 = 0;
        if( f_key_ok == 0 )//
        {
            f_key_ok = 1;//已经按下
            //切换模式
        }
     }
   }
   else
   {
       b_key_10 = 0;
       b_key_11 += 1;
       if(b_key_11 > 24)//松键消抖50ms
       {
           b_key_11 = 0;
           f_key_ok = 0;//松开
       }
   }
}
回复

使用道具 举报

11#
ID:382454 发表于 2022-2-10 21:00 | 只看该作者
不要有死循环,要有超时代码自动跳出函数,就可以。
回复

使用道具 举报

12#
ID:1003226 发表于 2022-2-23 10:25 | 只看该作者
中断处理
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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