|
想尝试做一个简单带有闹钟功能的时钟,结果在按钮检测方面遇到了一些问题。在这里放上我写的按键代码:(我遇到的问题是:在判断不同按键按下,我使用了if...esle if...。结果只能执行else if后面的语句,不执行 if 语句。)
////////////////////////////////////////////////////////////////////////////////////////
单片机 avr 16
时钟频率 8M
///////////////////////////////////////////////////////////////////////////////////////
#include<iom16v.h>
#define uchar unsigned char
char time_10ms_ok;//10ms按键扫描标志
void main(void);
void io_init(void);
void time_init(void);
void cpu_init(void);
void time_10ms(void);
char key_scan(void);
void io_init(void)
{
DDRB = 0X00;
PORTB = 0XFF;
DDRD = 0XFF;
PORTD = 0XFF;
}
void time_init(void)
{
TCCR1A = 0X00;
TCCR1B = (1<<WGM12)|(3<<CS10);//CTC,64分频
OCR1AH = 1250>>8;
OCR1AL = 1250;
TIMSK = 1<<OCIE1A;
SREG = 1<<7;
}
void cpu_init(void)
{
io_init();
time_init();
}
void main(void)
{
cpu_init();
while(1)
{
if(time_10ms_ok)
{
time_10ms_ok = 0;
if(key_scan() == 2) PORTD = ~PORTD; //每按下按键2,3,
else if(key_scan() == 3) PORTD = ~PORTD; //PORTD取一次反。本是打算这样设计的。结果仿真的时候。只执行else if这一语句
}
}
}
#pragma interrupt_handler time_10ms:7
void time_10ms(void)
{
time_10ms_ok = 1;
}
#define key_state0 0
#define key_state1 1
#define key_state2 2
谢谢。
char key_scan(void)
{
static char key_state = 0;
char key_press, key_return = 0;
key_press = PINB;
switch(key_state)
{
case key_state0:
{
if(~key_press)//若有按键按下,则进入确认状态
{
key_state = key_state1;
}
break;
}
case key_state1:
{
if(~key_press)//确认有按键按下,开始识别按键按下位置
{
if(!(key_press & (1<<PB0))) key_return = 1;//按键1被按下
else if(!(key_press & (1<<PB1))) key_return = 2;//按键2被按下
else if(!(key_press & (1<<PB2))) key_return = 3;//按键3被按下
key_state = key_state2;
}
else key_state = key_state0;//若按键抬起则回到初始状态
break;
}
case key_state2:
{
if(key_press == 0XFF)//若按键抬起则回到初始状态
{
key_state = key_state0;
}
break;
}
}
return key_return;
}
|
|