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__ */

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

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

  1. GPIO 按键及矩阵键盘程序------/* 自己实验确认并总结 */

    新型的按键扫描程序 不过入式处理器上面我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉.我非常坚信这种按键处理办法的便捷和高效,你可以移植 ...

  2. 矩阵键盘程序_独立按键与矩阵按键

    一.独立按键原理 按键在闭合和断开时,触点会存在抖动现象 硬件消抖电路 独立按键控制程 二.独立按键控制程序 #include "reg52.h" typedef unsigned ...

  3. 4x4矩阵键盘c语言,4X4键盘矩阵键盘程序

    #include//包含单片机内部资源预定义 __CONFIG(0x1832); //芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡 intresult; voidd ...

  4. 【按键】短按,长按,按键释放,三种模式的按键扫描程序(软件消抖动)--- 矩阵键盘

    请先阅读上篇: 短按,长按,按键释放,三种模式的按键扫描程序(软件消抖动) 上面的程序适用于单个按键,那是不是也可以适用于矩阵键盘呢? 答案是肯定的. 接下来在这里做一个简单的扩展,具体框架不用改变, ...

  5. 4*4按键扫描程序c语言,【资料】单片机4*4矩阵键盘扫描程序(c语言+汇编语言2个版本)...

    ;4X4矩阵键盘程序.主要原理为扫描键盘矩阵时,每次只有一行电平拉低.在逐次扫描拉低的这些行的同时,去读那些列的电平. ;被拉低的行上,按下的键对应的列的电平为0 ,其它为1. 用左移位的指令,在进位 ...

  6. LINUX矩阵键盘简单介绍,stm32矩阵键盘原理图及程序介绍

    描述 STM32F0 系列产品基于超低功耗的 ARM Cortex-M0 处理器内核,整合增强的技术和功能,瞄准超低成本预算的应用.该系列微控制器缩短了采用 8 位和 16 位微控制器的设备与采用 3 ...

  7. 4x4矩阵键盘扫描c语言程序,单片机4*4矩阵键盘扫描程序(c语言+汇编语言2个版本)...

    ;4X4矩阵键盘程序.主要原理为扫描键盘矩阵时,每次只有一行电平拉低.在逐次扫描拉低的这些行的同时,去读那些列的电平. ;被拉低的行上,按下的键对应的列的电平为0 ,其它为1. 用左移位的指令,在进位 ...

  8. 最易移植的I/O任意定义的矩阵键盘驱动

    网上的矩阵键盘代码非常非常多,但绝大部分都是要连续I/O口的,就比如PA0-PA7.PB3-PB10等等等,这些都要用到一排的连续的单片机引脚.用过STM32单片机的都知道,STM32单片机一排过去连 ...

  9. 【51单片机】七段数码管和矩阵键盘的综合实验——计算器(思路+仿真电路+源代码)

    系列文章目录 [51单片机]矩阵键盘逐行扫描法仿真实验+超详细Proteus仿真和Keil操作步骤 [51单片机]点阵LED的显示实验 [51单片机]七段数码管显示实验+详细讲解 [51单片机]矩阵键 ...

最新文章

  1. 张首晟生前重磅演讲:要用第一性原理的思维方式来理解今天的世界
  2. Android深度探索第四章
  3. ping 不通容器 宿主_Docker容器间通信
  4. 成功解决AttributeError: module tensorflow.image has no attribute resize
  5. mysqldumpslow mysql慢日志分析工具
  6. QT学习:多线程控制
  7. Git之如何解决sourceTree已经pull全部下来但是本地没有更新的问题
  8. Java:在Runnable中处理RuntimeException
  9. 分布式存储首选,浪潮商用机器FP5466G2服务器测评分析
  10. linux shell 函数 格式化,速查笔记(linux shell编程)
  11. 海洋cms简洁免费下载视频网站正版原创自适应挖片模板
  12. 小型电商平台系统需求分析文档
  13. 服务器无线网卡ap软件,无线网卡虚拟成无线AP工具(将无线网卡虚拟成无线AP软件) 2017最新版...
  14. cesium获取坐标及高程
  15. 软件测试面试题【变态逻辑题】,盘点那些大厂面试必出变态逻辑题
  16. python ppt 图片_利用Python将PPT转换为图片并合成长图
  17. 学写毛笔字前要了解的
  18. 送给程序员的话 - 大牛们的经典语录
  19. 期末作业C#实现学生宿舍管理系统
  20. eclipse是什么工具?

热门文章

  1. kubernetes之四:存储
  2. 句句真研—每日长难句打卡Day4
  3. JavaScript学习(十六)—实现购物车加减数量,计算总金额
  4. 做地推怎么跟人打招呼
  5. 没有逾期过借呗为什么被关了?
  6. 为什么现在很小的孩子都会玩游戏,他们真的看得懂吗?
  7. 在什么情况下自己应该辞职走人了,而不是等领导下“逐客令”?
  8. 商业认知,新的一年开始了
  9. 一种人是成功为了赚钱,一种人是赚钱为了成功
  10. 为什么有些人电脑,电视,家电坏了首先是换新的,而不是维修?