AVR 矩阵键盘程序源代码2(有连续按键功能)(原创)

ExpandedBlockStart.gif Keyboard.h
/* ********* AVR 矩阵键盘扫描程序 *********
* 版本.........: 2.0
* 作者.........: 陈利栋
* 目标.........: AVR
* 文件名.......: Keyboard.h
* 编译器.......: AVR GCC 20100110
* 开发环境.....: AVR Studio V4.18
* 创建时间.....: 2010.09.12
* 最后修改.....: 2010.09.29
****************************************
*/
#ifndef __KEYBOARD_H__
#define  __KEYBOARD_H__

#include 
< avr / io.h >
#include 
< util / delay.h >

#define  KEYBOARD_PORT                 PORTA
#define  KEYBOARD_DDR                  DDRA
#define  KEYBOARD_PIN                  PINA

#define  KEY_NULL                      0xff
#define  KEY_READY_COUNT               100        //  此值在不同环境下应适当调整(1 - 65535),值越小,灵敏度越高

#define  KEY_CONTINUE_START_COUNT      20000      //  检测连续按键开始需要的次数,需要适当调整
#define  KEY_CONTINUE_RUNNING_COUNT    1000       //  连续按键间隔需要的次数,需要适当调整

extern  unsigned  char  key_continue_flag;          //  连续按键标记
extern  unsigned  char  GetKeyValue( void );

#endif  /* __KEYBOARD_H__ */

 

 

 

 

 

ExpandedBlockStart.gif Keyboard.c
/* ********* AVR 矩阵键盘扫描程序 *********
* 版本.........: 2.0
* 作者.........: 陈利栋
* 目标.........: AVR
* 文件名.......: Keyboard.c
* 编译器.......: AVR GCC 20100110
* 开发环境.....: AVR Studio V4.18
* 创建时间.....: 2010.09.12
* 最后修改.....: 2010.09.29
****************************************
*/
#include 
" Keyboard.h "

unsigned 
char  _key_last  =  KEY_NULL;
unsigned 
int   _key_count  =   0 ;

unsigned 
int   _key_continue_count  =   0 ;
unsigned 
char  key_continue_flag  =   0 ;

unsigned 
char  KeyScan( void )
{
    unsigned 
char  temp  =   0 ;

    KEYBOARD_DDR 
=   0x0f ;
    KEYBOARD_PORT 
=   0xf0 ;
    _delay_us(
10 );
    temp 
=  KEYBOARD_PIN;

    KEYBOARD_DDR 
=   0xf0 ;
    KEYBOARD_PORT 
=   0x0f ;
    _delay_us(
10 );
    temp 
|=  KEYBOARD_PIN;

    
if  (temp  !=  _key_last)
    {
        _key_count
++ ;
        
if  (_key_count  >=  KEY_READY_COUNT)
        {
            _key_last 
=  temp;
            _key_count 
=   0 ;
            
return  _key_last;
        }
        key_continue_flag 
=   0 ;
    }
    
else
    {
        
if  (temp  !=   0xff )
        {
            _key_continue_count
++ ;
            
if  (key_continue_flag  ==   0 )
            {
                
if  (_key_continue_count  >=  KEY_CONTINUE_START_COUNT)
                {
                    key_continue_flag 
=   1 ;
                    _key_continue_count 
=   0 ;
                    
return  temp;
                }
            }
            
else
            {
                
if  (_key_continue_count  >=  KEY_CONTINUE_RUNNING_COUNT)
                {
                    _key_continue_count 
=   0 ;
                    
return  temp;
                }
            }
        }
        _key_count 
=   0 ;
    }

    
return  KEY_NULL;
}

unsigned 
char  GetKeyValue( void )
{
    
switch  (KeyScan())
    {    
        
case  KEY_NULL:  return  KEY_NULL;
        
case   0x77 return   ' 1 ' ;
        
case   0x7B return   ' 2 ' ;
        
case   0x7D return   ' 3 ' ;
        
case   0x7E return   ' A ' ;
        
case   0xB7 return   ' 4 ' ;
        
case   0xBB return   ' 5 ' ;
        
case   0xBD return   ' 6 ' ;
        
case   0xBE return   ' B ' ;
        
case   0xD7 return   ' 7 ' ;
        
case   0xDB return   ' 8 ' ;
        
case   0xDD return   ' 9 ' ;
        
case   0xDE return   ' C ' ;
        
case   0xE7 return   ' * ' ;
        
case   0xEB return   ' 0 ' ;
        
case   0xED return   ' # ' ;
        
case   0xEE return   ' D ' ;
        
default   :  return  KEY_NULL;
    }
}

 

 

转载于:https://www.cnblogs.com/chenlidong/articles/1838368.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值