请教马老师,6个io口控制20按键的扫描程序,希望老师指点...
这个程序是大三的时候写的了,现在都有1年了。今天看到马老师的关于按键,状态机的帖子,吧自己的程序拿出来。和大家讨论。硬件是http://www.amobbs.com/forum.php?mod=viewthread&tid=854599&highlight=%E5%A0%AA%E7%A7%B0%E4%B8%80%E7%BB%9D 根据这个帖子设计的。
程序是一段时间,具体忘记了进入定时器中断,改变state这个变量
unsigned char get_key( void)
{
static unsigned char key_count=0,i,key_value=0;
unsigned char j,key_value2=0;
if(state==1)
{
state=0;
if(key_value==0)
{
for(i=0;i<5;i++)
{
KEY_DDR=keynum;
KEY_PORT=~keynum;
if(KEY_PIN!=(KEY_PIN|(~keynum& 0x1F)))
{
key_value= (~( (i+1) <<5) ) &(~( (~(KEY_PIN | keynum))& 0x1F )) ;
break;
}
}
}
else
{
key_value2=key_value;
key_value= (~( (i+1) <<5) ) &(~( (~(KEY_PIN | keynum))& 0x1F )) ;
if(key_value==key_value2)
{
if(key_count>=10)
{
key_count=0;
key_value=0;
return key_value2;
}
key_count++;
}//4if
else
key_value=0;
return 1;
}
}
return 0;
}
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
static unsigned char count=0;
count++;
TCNT0 = 0xD6; //reload counter value
if(doorstate==0)
{
if (!check())
{
doorclose();
mode=0;
}
}
if(count>=250)
{
second=1;
count=0;
}
else
{
second=0;
state=1;
}
}
页:
[1]