|
想嘗試做一個(gè)簡(jiǎn)單帶有鬧鐘功能的時(shí)鐘,結(jié)果在按鈕檢測(cè)方面遇到了一些問(wèn)題。在這里放上我寫的按鍵代碼:(我遇到的問(wèn)題是:在判斷不同按鍵按下,我使用了if...esle if...。結(jié)果只能執(zhí)行else if后面的語(yǔ)句,不執(zhí)行 if 語(yǔ)句。)
////////////////////////////////////////////////////////////////////////////////////////
單片機(jī) avr 16
時(shí)鐘頻率 8M
///////////////////////////////////////////////////////////////////////////////////////
#include<iom16v.h>
#define uchar unsigned char
char time_10ms_ok;//10ms按鍵掃描標(biāo)志
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取一次反。本是打算這樣設(shè)計(jì)的。結(jié)果仿真的時(shí)候。只執(zhí)行else if這一語(yǔ)句
}
}
}
#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)//若有按鍵按下,則進(jìn)入確認(rèn)狀態(tài)
{
key_state = key_state1;
}
break;
}
case key_state1:
{
if(~key_press)//確認(rèn)有按鍵按下,開(kāi)始識(shí)別按鍵按下位置
{
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;//若按鍵抬起則回到初始狀態(tài)
break;
}
case key_state2:
{
if(key_press == 0XFF)//若按鍵抬起則回到初始狀態(tài)
{
key_state = key_state0;
}
break;
}
}
return key_return;
}
|
|