按键模块程序

3428阅读 0评论2012-06-18 songtao0728
分类:C/C++

 
 
 
header file source code:
 
#ifnede __KEY_H__
#define __KEY_H__
 
extern void Key_Init(void);
extern unsigned char Get_Key(void);
extern unsigned char Read_Key(void);
 
#endif
 
source code for AVR:
 
#include"key.h"
 
/*--------------------------------------------------------------------
函数名称:KEY_Init
函数功能:KEY初始化
注意事项:(须根据具体情况设置)
提示说明:在此举例PC0~PC5接六外独立按键
输    入:
返    回:
--------------------------------------------------------------------*/
void KEY_Init(void){
    DDRC  &= ~( (1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<4) | (1<<5) );
    PORTC |=  ( (1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<4) | (1<<5) );
}
/*--------------------------------------------------------------------
函数名称:Get_Key
函数功能:获取按下的Key的值
注意事项:(须根据具体情况设置)
提示说明:
输    入:
返    回:0~5相应的按键端口号,0xff无键按下
--------------------------------------------------------------------*/
//获得相应的按下的按键值
unsigned char Get_Key(void){
   
    if( (PINC&(1<<0))==0 ){
        return 0;
    }
    else if( (PINC&(1<<1))==0 ){
        return 1;   
    }
    else if( (PINC&(1<<2))==0 ){
        return 2;
    }
    else if( (PINC&(1<<3))==0 ){
        return 3;   
    }
    else if( (PINC&(1<<4))==0 ){
        return 4;
    }
    else if( (PINC&(1<<5))==0 ){
        return 5;   
    }
    else{
        return 0xff;
    }
}
/*--------------------------------------------------------------------
函数名称:Read_key
函数功能:读取按键值
注意事项:(须根据具体情况设置)
提示说明:
输    入:
返    回:返回按下的键相对应的健值
--------------------------------------------------------------------*/
unsigned char Read_key(void){
    //该子程序在死循环的前后台模式下扫描按键并执行相应任务时使用权
    static unsigned char last_key = 0xff;  //初次调用认为上一次没有按键按下
    static unsigned int key_count = 0;     //每检测有对应按键按下,则该计数器加1,用于去抖动和等待按键抬起
    //循环执行该函数次数的3个常数,要根据具体系统略加调整
    #define c_wobble_time    (120)          //去按键抖动时间
    #define c_keyover_time   (1000)        //等待按键进入连击的时间,该常数在设计时要比按键按下的常规时间长一点,防止非目的性进入连击模式
    #define c_keyquick_time  (400)         //等待按键抬起的连击时间
    static unsigned int keyover_time = c_keyover_time;
    unsigned char nc;
    nc = Get_Key();  //读按键,获取相应的返回值
    if(nc==0xff){
        key_count = 0;
        keyover_time = c_keyover_time;
        return 0;   //无按键按下,返回0
    }
    else{
        if(nc==last_key){
            if(++key_count==c_wobble_time){
                return nc;  //去抖动结束,返回按键值            
            }
            else{
                if(key_count>keyover_time){    //等待按键抬起时间结束并进入连击模式
                    key_count = 0;
                    keyover_time = c_keyquick_time; //将处于连击模式
                }
                return 0;
            }     
        }
        else{
            last_key = nc;
            key_count = 0;
            keyover_time = c_keyover_time;
            return 0;
        }
    }
}
 
source code for 51 core:
 
#include"key.h"
 
/*--------------------------------------------------------------------
函数名称:KEY_Init
函数功能:KEY初始化
注意事项:(须根据具体情况设置)
提示说明:在此举例P1.0~P1.5接六外独立按键
输    入:
返    回:
--------------------------------------------------------------------*/
void KEY_Init(void){
}
/*--------------------------------------------------------------------
函数名称:Get_Key
函数功能:获取按下的Key的值
注意事项:(须根据具体情况设置)
提示说明:
输    入:
返    回:0~5相应的按键端口号,0xff无键按下
--------------------------------------------------------------------*/
//获得相应的按下的按键值
unsigned char Get_Key(void){
   
    if( (P1&(1<<0))==0 ){
        return 0;
    }
    else if( (P1&(1<<1))==0 ){
        return 1;   
    }
    else if( (P1&(1<<2))==0 ){
        return 2;
    }
    else if( (P1&(1<<3))==0 ){
        return 3;   
    }
    else if( (P1&(1<<4))==0 ){
        return 4;
    }
    else if( (P1&(1<<5))==0 ){
        return 5;   
    }
    else{
        return 0xff;
    }
}
/*--------------------------------------------------------------------
函数名称:Read_key
函数功能:读取按键值
注意事项:(须根据具体情况设置)
提示说明:
输    入:
返    回:返回按下的键相对应的健值
--------------------------------------------------------------------*/
unsigned char Read_key(void){
    //该子程序在死循环的前后台模式下扫描按键并执行相应任务时使用权
    static unsigned char last_key = 0xff;  //初次调用认为上一次没有按键按下
    static unsigned int key_count = 0;     //每检测有对应按键按下,则该计数器加1,用于去抖动和等待按键抬起
    //循环执行该函数次数的3个常数,要根据具体系统略加调整
    #define c_wobble_time    (120)          //去按键抖动时间
    #define c_keyover_time   (1000)        //等待按键进入连击的时间,该常数在设计时要比按键按下的常规时间长一点,防止非目的性进入连击模式
    #define c_keyquick_time  (400)         //等待按键抬起的连击时间
    static unsigned int keyover_time = c_keyover_time;
    unsigned char nc;
    nc = Get_Key();  //读按键,获取相应的返回值
    if(nc==0xff){
        key_count = 0;
        keyover_time = c_keyover_time;
        return 0;   //无按键按下,返回0
    }
    else{
        if(nc==last_key){
            if(++key_count==c_wobble_time){
                return nc;  //去抖动结束,返回按键值            
            }
            else{
                if(key_count>keyover_time){    //等待按键抬起时间结束并进入连击模式
                    key_count = 0;
                    keyover_time = c_keyquick_time; //将处于连击模式
                }
                return 0;
            }     
        }
        else{
            last_key = nc;
            key_count = 0;
            keyover_time = c_keyover_time;
            return 0;
        }
    }
}
 
 
上一篇:计算2000年以后的日期对应的星期子程序
下一篇:以太网控制器ENC28J60编程要点