c382671878 发表于 2013-4-30 13:19:22

请教马老师,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]
查看完整版本: 请教马老师,6个io口控制20按键的扫描程序,希望老师指点...