|
看了您的学习资料第九章的关于按键消抖的程序块,通过每个固定时间段的定时器中断判断一次按键状态,比如5ms判断读取一次按键的状态,最后函数的返回值为1时为判断一次按键结束的标志。如果我想在判断一次按键动作完成后,使得用于计数的变量cnt自增1,达到记录按键成功按下的次数的记录。中断函数怎么写才正确呢?我写了一个觉得有问题又不知怎么改起,想请教您分析一下。谢谢了!如果有其他学长愿意帮忙也很好啊~~
#define key1_input PIND &(1<<2) // 按键输入口
#define key1_state_0 0
#define key1_state_1 1
#define key1_state_2 2
char time_counter,key_stime_counter; // 时间计数单元,
char key_stime_ok;
void init_key()
{
SREG = 0x00;//关闭中断
DDRD = 0xf3;//11110011,即PIN 2 & PIN 3设置为输入,因为用到PD2,PD3口
PORTD = 0xff;//PD口接全输出
//**********************************t/c2_init starts*************************
TCCR2 = 0x00;//stop
TCNT2 = 0xB9;//5ms为一个中断周期
TCCR2|= (1<<CS22) | (1<<CS21) | (1<<CS20);//拉高3个引脚,选择1024分频
TIMSK |= (1<<TOIE2);//拉高bit6,toie2置1,使能t/c2溢出中断
SREG = 0x80;//使能总中断
}
char read_key1(void)
{
static char key1_state = 0;
char key1_press, key1_return = 0;
key1_press = key1_input; // 读pinD.2按键I/O电平,keypress保存刚检测的按键值
switch (key1_state)
{
case key1_state_0: // 按键初始态
if (!key1_press) key1_state = key1_state_1; // 键被按下,状态转换到键确认态
break;
case key1_state_1: // 按键确认态
if (!key1_press)
{
key1_return = 1; // 按键仍按下,按键确认输出为"1"
key1_state = key1_state_2; // 状态转换到键释放态
}
else
key1_state = key1_state_0; // 按键已抬起,转换到按键初始态
break;
case key1_state_2:
if (key1_press) key1_state = key1_state_0; //按键已释放,转换到按键初始态
break;
}
return key1_return;//初始化为0.在状态1中置一,确定输出值
ISR (TIMER2_OVF_vect)
{
TIFR = 0x40;//tov2重写
TCNT2 = 0xB9;//5ms
if (++key_stime_counter >=4)
{
key_stime_counter = 0;
key_stime_ok = 1;
// 20ms到
}
if (key_stime_ok) // 20ms到,键处理
{
key_stime_ok = 0;
if (read_key1()) // 调用按键接口程序,如果确认按键按下了
{
if(cnt<5)
cnt++;
else
cnt=0;
}
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。
|