实验开发板为CT107D蓝桥官方板,编译环境为MDK5

 

目录

一、矩阵键盘

二、独立键盘


参考宋雪松老师的写法:

  1. 采用多个缓冲区
  2. 可以扩展至16个键码对应的指令

一、矩阵键盘

通过修改Key_OUT值的变化范围即可实现矩阵键盘向独立键盘的转换。

/***********************keyboard.h**********************/
#ifndef __KEYBOARD_H
#define __KEYBOARD_H#include "Sys.h"sbit Key_IN1 = P4^4;
sbit Key_IN2 = P4^2;
sbit Key_IN3 = P3^5;
sbit Key_IN4 = P3^4;sbit Key_OUT1 = P3^0;
sbit Key_OUT2 = P3^1;
sbit Key_OUT3 = P3^2;
sbit Key_OUT4 = P3^3;void KeyDrive();
void KeyScan();
void KeyAction(u8 cmd);extern u8 Key_Sta[4][4];
extern u8 Key_CodeMap[4][4];#endif/***********************keyboard.c**********************/#include "Sys.h"u8 Key_Sta[4][4] = {
{1 , 1 , 1 , 1},{1 , 1 , 1 , 1},
{1 , 1 , 1 , 1},{1 , 1 , 1 , 1}
};//按键当前状态u8 Key_CodeMap[4][4] = {{'A', 'B', 'C', 'D'},{'E', 'F', 'G', 'H'},{'I', 'J', 'K', 'L'},{'M', 'N', 'O', 'P'}};//键码表
/**************************************************************************
函数功能:键盘功能函数
入口参数:键码
返回值  :无
**************************************************************************/
void KeyAction(char cmd)            //按键功能函数
{if(cmd == 'A'){}else if(cmd == 'B'){}else if(cmd == 'C'){}else if(cmd == 'D'){}else if(cmd == 'E'){}else{_nop_();}
}
/**************************************************************************
函数功能:键盘功能函数执行函数
入口参数:无
返回值  :无
**************************************************************************/
void KeyDrive()
{u8 i, j;static u8 backup[4][4] = {{1 , 1 , 1 , 1},{1 , 1 , 1 , 1},{1 , 1 , 1 , 1},{1 , 1 , 1 , 1}};//按键状态对照码for(i = 0; i < 4; i ++){for(j = 0; j < 4; j ++){if(Key_Sta[i][j] != backup[i][j]){if(backup[i][j] != 0) //检测是否已经缓存按下指令{KeyAction(Key_CodeMap[i][j]);}backup[i][j] = Key_Sta[i][j];}}}
}
/**************************************************************************
函数功能:键盘扫描函数
入口参数:无
返回值  :无
**************************************************************************/
void KeyScan()
{u8 i;static u8 Key_OUT = 2;static u8 Key_Buff[4][4] = {{0xFF, 0xFF, 0xFF, 0xFF},  {0xFF, 0xFF, 0xFF, 0xFF},{0xFF, 0xFF, 0xFF, 0xFF},  {0xFF, 0xFF, 0xFF, 0xFF}};//缓冲区Key_Buff[Key_OUT][0] = (Key_Buff[Key_OUT][0] << 1) | Key_IN1;    //一则变零则不变Key_Buff[Key_OUT][1] = (Key_Buff[Key_OUT][1] << 1) | Key_IN2;Key_Buff[Key_OUT][2] = (Key_Buff[Key_OUT][2] << 1) | Key_IN3;Key_Buff[Key_OUT][3] = (Key_Buff[Key_OUT][3] << 1) | Key_IN4;   for(i = 0; i < 4; i ++){if((Key_Buff[Key_OUT][i] & 0x0F) == 0x0F){Key_Sta[Key_OUT][i] = 1;}else if((Key_Buff[Key_OUT][i] & 0x0F) == 0x00){Key_Sta[Key_OUT][i] = 0;}}Key_OUT ++;Key_OUT &= 0x03;switch(Key_OUT)//逐行扫描{case 0: Key_OUT1 = 0; Key_OUT4 = 1;Key_OUT3 = 1; Key_OUT2 = 1; break;case 1: Key_OUT2 = 0; Key_OUT4 = 1;Key_OUT3 = 1; Key_OUT1 = 1; break;case 2: Key_OUT3 = 0; Key_OUT4 = 1;Key_OUT2 = 1; Key_OUT1 = 1; break;case 3: Key_OUT4 = 0; Key_OUT3 = 1;Key_OUT2 = 1; Key_OUT1 = 1; break;default: break;}}

二、独立键盘

/***********************keyboard.h**********************/
#ifndef __KEYBOARD_H
#define __KEYBOARD_H#include "config.h"
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;extern u8 code CodeMap[4];
extern u8 KeySta[4];extern void KeyAction(char cmd);
extern void KeyScan();
extern void KeyDrive();#endif/***********************keyboard.c**********************/u8 CMD = 0;u8 code CodeMap[4] = {'A', 'B' , 'C' , 'D'
};
u8 KeySta[4] = {1, 1, 1, 1
};void KeyAction(char cmd)
{P2 = (P2 & 0x1F) | 0x80;if(cmd == 'A'){P0 = 0xFE;CMD = 1;}else if(cmd == 'B'){P0 = 0xFD;CMD = 2;}else if(cmd == 'C'){P0 = 0xFB;CMD = 3;}else if(cmd == 'D'){P0 = 0xF7;CMD = 4;}
}void KeyScan()
{u8 i = 0;static u8 KeyBuff[4] = {0xFF,   0xFF,   0xFF,   0xFF,};KeyBuff[0] = (KeyBuff[0] << 1) | S7;KeyBuff[1] = (KeyBuff[1] << 1) | S6;KeyBuff[2] = (KeyBuff[2] << 1) | S5;KeyBuff[3] = (KeyBuff[3] << 1) | S4;for(i = 0; i < 4; i ++){if((KeyBuff[i] & 0x0F) == 0x0F){KeySta[i]  = 1;}if((KeyBuff[i] & 0x0F) == 0x00){KeySta[i]  = 0;}}
}void KeyDrive()
{u8 i;static u8 backup[4] = {1 , 1 , 1 , 1};for(i = 0; i < 4; i ++) {if(KeySta[i] != backup[i]){if(backup[i] == 0){KeyAction(CodeMap[i]);}backup[i] = KeySta[i];}}
}

【蓝桥杯单片机】矩阵键盘和独立键盘新解(更稳定更高复用性)相关推荐

  1. 蓝桥杯单片机学习日记3-矩阵键盘的使用,线反转法,三步消抖,按键长按与短按

    此片文章用于记录蓝桥杯单片机的学习 篮球杯单片机上的矩阵按键原理图如下: 使用矩阵键盘时,要将跳线帽J5跳至KBD模式. 值得注意的是,若开发板上的单片机使用的为STC15,那么以上原理图适用.如果单 ...

  2. 蓝桥杯实验4--按键之独立键盘(proteus仿真)

    开始试试按键的部分 首先说一下什么是按键 按键分为按结构可分为触点式和无触点式两类.开发板上用的是触点式的按键.按键在接口上分类可分为编码键盘和非编码键盘.按键通常使用机械式触点式按键开关,但是由于机 ...

  3. 【蓝桥杯-单片机学习笔记(六)】矩阵键盘控制数码管显示0~F

    一.要求 在CT107D单片机训练平台上,首先将J5处的跳线帽接到1~2引脚,使按键S4~S19组成4*4的矩阵键盘.在扫描按键的过程中,发现有按键触发信号后,待按键松开后,数码管显示相应的数字.按键 ...

  4. 蓝桥杯单片机 独立按键与矩阵按键

    文章目录 前言 一.蓝桥杯按键原理图 二.独立按键与矩阵按键处理思路 1.独立按键 2.矩阵按键 代码实现 总结 前言 按键设计一般分为两种:独立按键和矩阵键盘.按键数量较少的用前者,按键数量较多的用 ...

  5. 蓝桥杯模块矩阵键盘Part_1

       九层妖塔 起于垒土 蓝桥杯模块矩阵键盘Part_1 矩阵键盘 一.理论 1.矩阵键盘的识别与编码: 2.矩阵键盘的工作方式: 二.原理图 三.Template1 1.矩阵键盘扫描函数: 2.定时 ...

  6. 基于STM 32、矩阵键盘和独立键盘实现LCD显示的智能计算器(带括号的加减乘除运算、混合四则运算)——普中科技单片机开发试验仪嵌入式开发

    0 引言 智能计算器是嵌入式开发的入门项目,本章使用STM 32芯片作为CPU,并将矩阵键盘和独立键盘作为输入外设,LCD1602作为显示屏,实现可输入的可视化智能计算器. 备注:最终生成的可执行HE ...

  7. 蓝桥杯单片机(三)矩阵按键

    上章说了独立按键 蓝桥杯单片机(二)独立按键 这章说一下矩阵按键 所谓矩阵按键,就是每一个按键的两端都同时由单片机的IO口进行控制,如原理图所示,上图要想使用矩阵按键,就需要使用跳线帽将排针2引脚和1 ...

  8. 【蓝桥杯单片机】第十六章 独立按键(松开有效)

    本章承接上一章,基本原理是一模一样的,在上一章中,我们按下S7,L7就会马上点亮,而在本章实验中,我们在按下S7后,还需要松开S7,L7才会点亮.这就是松开有效. 第一节   程序编写 请大家对比本章 ...

  9. 蓝桥杯省赛考点_【蓝桥杯单片机01】从历年决赛真题中寻找单片机常见的考点...

    [蓝桥杯单片机01]从历年决赛真题中寻找单片机常见的考点 广东职业技术学院  欧浩源 [第三届:门禁系统] 1.功能简述 "门禁系统"主要有两种工作模式: 模式1:7:00-22: ...

最新文章

  1. 记账本开发进程第一天
  2. vSphere可用性之三准备实验环境
  3. MCP3202的使用
  4. git每个项目创建帐户名和密码
  5. JSTL/EL表达式/Struts2标签/OGNL表达式
  6. 给窗口添加背景图的案例
  7. 初学Java必写的小程序。
  8. shell 结束指定端口
  9. 国人常用密码TOP100 FROM THISITE
  10. 基于Springboot+Vue+ElementUI物流配送管理系统
  11. ubuntu20 关闭防火墙_ubuntu中如何关闭防火墙
  12. 四、Mosquitto 高级应用之用户配置
  13. apktool下载安装
  14. JavaScript的富文本编辑
  15. 机械手臂c语言如何编程,一种串联机械手臂的示教编程方法
  16. python查重算法_用Python实现通过哈希算法检测图片重复的教程
  17. Unity3D中文视频教程【超清+精选】
  18. Python向左,数学向右:梅森素数
  19. bootstrap-select插件angularjs爬坑
  20. File---文件、文件夹的创建

热门文章

  1. 差分信号_形象解读差分信号,它比单端信号强在哪?
  2. 计算机编程人员辛苦吗,全国工资下来了,程序员工资为什么这么高?你是不知道多辛苦?...
  3. java 四元一次方程_JAVA编写求解一元多次方程的程序,要求如下:
  4. Java 设计模式之 Composite 组合模式
  5. Java 算法 王、后传说
  6. VS2017新建HTML项目,VS2017创建项目模板和项模板(方便实用)
  7. HuggingFace学习1:tokenizer学习与将文本编码为固定长度(pytorch)
  8. 解决django3.x manage命令makemigrations无法创建数据表
  9. tshark删除pcap文件中与网关通信的数据包
  10. python使用sql读取数据表并返回dataframe