项目需要:
做了一个电子秤的项目,只有两个按键;要实现 :重量归零;关机;计时开始、暂停;计时归零;切换单位 这五个的功能。
于是我对其中一个按键的使用方法是:
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;
}
}