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

本文介绍了一种针对AVR微控制器的矩阵键盘扫描程序,包括Keyboard.h和Keyboard.c两个核心文件。该程序通过特定的扫描策略实现了键盘输入的识别,并提供了连续按键检测功能。文章详细展示了代码实现细节及参数配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ExpandedBlockStart.gifKeyboard.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.gifKeyboard.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 0x77return '1';
        
case 0x7Breturn '2';
        
case 0x7Dreturn '3';
        
case 0x7Ereturn 'A';
        
case 0xB7return '4';
        
case 0xBBreturn '5';
        
case 0xBDreturn '6';
        
case 0xBEreturn 'B';
        
case 0xD7return '7';
        
case 0xDBreturn '8';
        
case 0xDDreturn '9';
        
case 0xDEreturn 'C';
        
case 0xE7return '*';
        
case 0xEBreturn '0';
        
case 0xEDreturn '#';
        
case 0xEEreturn 'D';
        
default  : return KEY_NULL;
    }
}

 

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值