记录C语言学习【单个按键之长按+短按】

最近学习C语言,偶然看到一句话很是赞同。

学会了的境界:

境界1是自己看会了;

境界2自己独立做出来了;

境界3自己可以独立做出来,并描述出来了;

境界4可以把别人教会了。

初学单片机C语言,本按键程序,自己一直在使用,特此分享,欢迎指正。
 

/***************** 按键函数的变量与位定义 *******************/

static  uint    data    r_key_t1 =0;   //长按时间变量1,静态变量

bit        F_key_1ms =0;          //1ms定时标志位  to 按键
bit        F_Key_state =0;        //按键状态标志位 1:有按键  0:无按键
bit        F_key_long =0;         //长按标志位
bit        F_key_long_on =0;      //长按进行中标志位
bit        F_key_short =0;            //短按标志位

标志位都要在 .h 文件中声明全局bit , 变量和标志位都要初始化,建议为0,
或者在程序0000H后初始化把RAM全部清0,不然在程序复位后,可能运行出错。
/************************************************************************
函       数:单个按键短按长按函数
操作步骤:
1、在key.h 文件中声明定义按键IO口,
2、在IO口初始化,默认输入带上拉,按键低有效,
3、定时器内定时 1ms置标志位F_key_1ms,1ms扫描一次按键,
*************************************************************************/
void    key_scan()
{
     if(F_key_1ms)            //每1ms 进来扫描一次按键
    {
        F_key_1ms = 0;      //标志位清0
        if(IO_key)          //按键低有效 P00口
        {
            key_release();  //按键释放
        }
        else    
        {
            key_press();     //按键按下
        }
      }    
}


void    key_press()         //按键按下子程序
{
    if(!F_Key_state)        //按键状态标志位=1,跳过消抖子程序
    {
//       if(++r_key_t1>50)      //递增后判断,消抖时间50ms
        if(++r_key_t1&0x40)     //进阶版,替换上一行
        {                       
            r_key_t1 = 0;      //消抖计数清0
            F_Key_state = 1;    //按键状态标志位=1
        }
        
    }

    // if(F_key_long_on)
    // {    
        // F_key_long = 1;                //一直长按,一直置1,无极调光时连续使用,
    // }
    
    if(!F_key_long_on)        // 不在长按状态
    {
//        if(++r_key_t1 >1000)        //长按时间1ms*1000
        if(++r_key_t1 & 0x400)    //进阶版,替换上一行 ,用逻辑与,在keil中比用>更省ROM空间      
        {
            r_key_t1 = 0;             //按键时间清0
            F_key_long = 1;     //长按标志位=1
            F_key_long_on = 1;  //长按进行中标志位=1                    
            
        }
    }
       
}

void    key_release()   //按键松开子程序
{
    r_key_t1 = 0;         //按键时间清0
    
    if(F_key_long_on)    //F_key_long_on=1时
    {
        F_Key_state = 0;    //按键状态标志位=0 ,避免长按后,识别到短按。
        F_key_long_on = 0;   //长按进行中标志位清0
    }
    
    if(F_Key_state)     //
    {
        F_key_short = 1;    //按键松开有效,短按标志位=1
    }
    
    F_Key_state = 0;    //按键状态标志位=0
}

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值