原创 独立键盘程序

2011-9-16 14:54 2085 4 4 分类: MCU/ 嵌入式
说一下思路,这个键盘是独立键盘,平时不按下的时候cpu(stm32)相应管脚为高电平。按下为低电平。
每隔一定的时间进入一次按键扫描程序。检测相应按键是否被按下。
void TIM2_IRQHandler ( void )
{    
      if(Key_Wait_Counter)    Key_Wait_Counter--;
      if(Key_Repeat_Counter)  Key_Repeat_Counter--;
      KeyCode=KeyScan();
      if(KeyCode !=0) Key_Buffer = KeyCode;
 }


/*******************************************************************************
* 函数名:KeyScan    说明:读取按键  返回:按键扫描码,KeyBuff=按键码
*******************************************************************************/
char KeyScan(void)
{
    u16 Key_Status_Now=0, KeyCode=0;

    //检测当前是否有按键被按下。
    if((~GPIOC_IDR) & GPIO_Pin_4) Key_Status_Now |= 0x01;&nbs    if((~GPIOE_IDR) & GPIO_Pin_5) Key_Status_Now |= 0x04;
    if((~GPIOE_IDR) & GPIO_Pin_6) Key_Status_Now |= 0x08; 
    if((~GPIOE_IDR) & GPIO_Pin_3) Key_Status_Now |= 0x10; 
    if((~GPIOE_IDR) & GPIO_Pin_1) Key_Status_Now |= 0x20;
    if((~GPIOE_IDR) & GPIO_Pin_4) Key_Status_Now |= 0x40;  
    if((~GPIOA_IDR) & GPIO_Pin_7) Key_Status_Now |= 0x80;   
    if((~GPIOB_IDR) & GPIO_Pin_9) Key_Status_Now |= 0x100;
    if((~GPIOD_IDR) & GPIO_Pin_2) Key_Status_Now |= 0x200;
    if(((~GPIOB_IDR) & GPIO_Pin_6)&&((~GPIOE_IDR) & GPIO_Pin_3)) Key_Status_Now |= 0x400;//KEYCODE_PWOFF;
    if((~GPIOC_IDR) & GPIO_Pin_5) Key_Status_Now |= 0x800;
    if(((~GPIOE_IDR) & GPIO_Pin_0)&&((~GPIOE_IDR) & GPIO_Pin_3)) Key_Status_Now |= 0x1000;//KEYCODE_ALLDEL
    if(((~GPIOC_IDR) & GPIO_Pin_4)&&((~GPIOE_IDR) & GPIO_Pin_4)) Key_Status_Now |= 0x2000;//KEYCODE_ADJUST
    if(((~GPIOE_IDR) & GPIO_Pin_3)&&((~GPIOE_IDR) & GPIO_Pin_1)) Key_Status_Now |= 0x4000;//KEYCODE_TIME
    
    
    if(Key_Status_Now &(~Key_Status_Last))//某一个按键是第一次按下。
    {

        Key_Wait_Counter=25;        /*持续按键500mS内,不启动自动重复功能*/

        if(Key_Status_Now & 0x01)  KeyCode=KEYCODE_ESC; 
        if(Key_Status_Now & 0x02)  KeyCode=KEYCODE_BACKSPACE; 
        if(Key_Status_Now & 0x04)  KeyCode=KEYCODE_UP;  
        if(Key_Status_Now & 0x08)  KeyCode=KEYCODE_DOWN; 
        if(Key_Status_Now & 0x10)  KeyCode=KEYCODE_LEFT; 
        if(Key_Status_Now & 0x20)  KeyCode=KEYCODE_RIGHT;
        if(Key_Status_Now & 0x40)  KeyCode=KEYCODE_FN;
        if(Key_Status_Now & 0x80)  KeyCode=KEYCODE_SAVE;
        if(Key_Status_Now & 0x100)  KeyCode=KEYCODE_ENTER;
        if(Key_Status_Now & 0x200)  KeyCode=KEYCODE_HOLD;
        if(Key_Status_Now & 0x400)  KeyCode=KEYCODE_PWOFF;
        if(Key_Status_Now & 0x800)  KeyCode=KEYCODE_VIEW;
        if(Key_Status_Now & 0x1000)  KeyCode=KEYCODE_ALLDEL;
        if(Key_Status_Now & 0x2000)  KeyCode=KEYCODE_ADJUST;
        if(Key_Status_Now & 0x4000)  KeyCode=KEYCODE_TIME;
    }
    else
    {

        if(Key_Status_Now & Key_Status_Last)//某一个按键是在持续的按键的过程中。
        {
            if((Key_Wait_Counter | Key_Repeat_Counter)==0)
            {

                if(Key_Status_Now & 0x01)  KeyCode=KEYCODE_ESC; 
                if(Key_Status_Now & 0x02)  KeyCode=KEYCODE_BACKSPACE; 
                if(Key_Status_Now & 0x04)  KeyCode=KEYCODE_UP;   
                if(Key_Status_Now & 0x08)  KeyCode=KEYCODE_DOWN; 
                if(Key_Status_Now & 0x10)  KeyCode=KEYCODE_LEFT;
                if(Key_Status_Now & 0x20)  KeyCode=KEYCODE_RIGHT;
                if(Key_Status_Now & 0x40)  KeyCode=KEYCODE_FN;
                if(Key_Status_Now & 0x80)  KeyCode=KEYCODE_SAVE;
                if(Key_Status_Now & 0x100)  KeyCode=KEYCODE_ENTER;
                if(Key_Status_Now & 0x200)  KeyCode=KEYCODE_HOLD;
                if(Key_Status_Now & 0x400)  KeyCode=KEYCODE_PWOFF;
                if(Key_Status_Now & 0x800)  KeyCode=KEYCODE_VIEW;
                if(Key_Status_Now & 0x1000)  KeyCode=KEYCODE_ALLDEL;
                if(Key_Status_Now & 0x2000)  KeyCode=KEYCODE_ADJUST;
                if(Key_Status_Now & 0x4000)  KeyCode=KEYCODE_TIME;
                Key_Repeat_Counter = 3; //每60mS自动重复一次
            }
        }
        else Key_Wait_Counter=25;       //持续按键500mS内,不启动自动重复功能//什么按键都没有按下
    }
    Key_Status_Last = Key_Status_Now;
    return KeyCode;
}


文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /2 下一条