单片机学习小组
直播中

王燕

7年用户 1679经验值
私信 关注

合泰单片机按键有哪几种使用方法?

合泰单片机按键有哪几种使用方法?

回帖(1)

李燕梅

2022-1-27 10:58:33
项目需要:
做了一个电子秤的项目,只有两个按键;要实现 :重量归零;关机;计时开始、暂停;计时归零;切换单位 这五个的功能。
于是我对其中一个按键的使用方法是:
1.短按清零(使用get_tare()函数)
2.长按关机
3.双击切换单位


话不多说,直接上代码(注意代码是在主循环里面的,我没有写出主循环)
// on_off_key_pin  代表单片机的pa6引脚,这里贴出代码               
#define                on_off_key_pin                        _pa6
1
2
        if(on_off_key_pin==0)//右键按下,on_off_key_pin为0,因为接地
                {
                        on_off_key_flag=1;
                       
                        on_off_count++;

                        if(on_off_count>30)//按下这个按键,每次进入循环on_off_count会+1;on_off_count>30次,则表示长按
                        {
                                on_off_count=30;
                                on_off_long_edge=1;//长按标志位置1
                                sleep_f=1;//表示要关机(我要求的长按关机)
                                on_off_key_flag=0;
                        }
                }
                else
                {
                        on_off_count=0;
                        if(on_off_key_flag==1)//如果之前按下过,on_off_key_flag会置1,再抬起到这里
                        {       
                                        on_off_key_edge=1;//右键抬起,短按标志位置1
                                        //--------------下面是双击的代码---------
                                        key_press_loop++;


                                //-----------下面是双击的程序-------------
                                /*
                                双击的思路就是:第一次按下后,开始利用中断计数,在规定的时间内 再按下一次  表明双击;
                                如果在按下一次后,规定的时间内没有再次按下,表明单次短按
                                */
                                        if(first_flag==0)//第一次按下的标志位
                                        {
                                                first_flag=1;
                                                key_flash_loop=0;//规定时间的计数器
                                                key_press_loop++;//按下的次数
                                        }
                                        else
                                        {                                       
                                                if(key_flash_loop<8)        //如果在规定时间内
                                                {
                                                        if(key_press_loop>1)//按下2次
                                                        {
                                                                Double_click_edge=1;//双击的标志位
                                                                first_flag=0;
                                                                key_press_loop=0;
                                                                key_flash_loop=0;
                                                        }
                                                       
                                                }
                                                else//这里可以去掉
                                                {
                                                       
                                                }


                                        }
               
                                        on_off_key_flag=0;
                                }                       
         }


再在下面贴出计时器的初始化以及中断函数,可以看我上一面博文
以BH67F52 5060/70 为例子(其实都是相通的)
TM初始化
        void time_init()//计时器初始化
{  
       
        _stmrp=4;

        _stmc0=0b00110000;        // Fh/64= 4Mhz/64=62.5Khz=16us
        _stmc1=0b11000001;        // TimeCnt Mode
        _stmal=6250%256;         //;6250/62.5Khz=0.10s=100ms
        _stmah=6250/256;
        _ston=1;
        _stmae=1;
        _mf0e=1;
}


TM中断
void        __attribute((interrupt(0x10)))        isr_time0(void)        //这里是100ms进入一次该中断
{       


        _stmaf=0;
//-----------------------------         
        if(first_flag)
        {
                key_flash_loop++;
                if(key_flash_loop>8)
                {
                        first_flag=0;
                        single_click_flag=1;//规定的时间到了,表明单击的标志位置1
                }
        }
       
}


最后再贴出部分使用 双击、单击 标志位的代码
                                if(on_off_key_edge  && single_click_flag)//单击
                                           {
                                                    
                                                    get_tare();//清零重量的函数
                                                    single_click_flag=0;
                                           }
//*******************************************************
                                   if(Double_click_edge)//双击
                                           {
                                                   unit++;//切换单位
                                                   Double_click_edge=0;
                                                   if(unit>1)
                                                   {
                                                           unit=0;
                                                   }
                                           }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分