此片文章用于记录蓝桥杯单片机的学习

篮球杯单片机上的矩阵按键原理图如下:

使用矩阵键盘时,要将跳线帽J5跳至KBD模式。

值得注意的是,若开发板上的单片机使用的为STC15,那么以上原理图适用。如果单片机为IAP15,则在上述原理图中,要将P36换成P42,P37换成P44。

修改如下(IAP15):

常用的矩阵键盘扫描方式有行扫描法和线反转法,在比赛过程中,为了提高键盘的扫描速度和程序的运行效率,这里建议采用三步消抖法加线反转法,这样程序运行效率较高,并且支持按键的短按和长按。

线反转法原理简单,配合三步消抖即可支持按键的快速扫描和长按与短按。

矩阵键盘程序如下:

KET4X4.c(IAP15)

#include <STC15F2K60S2.H>
#define u8 unsigned char
#define KEY_4X4  //定义KEY_4X4就代表使用矩阵按键模式
#ifdef KEY_4X4
u8 Key_4_value;          //用来记录键值
bit Key_time_falg;       //用来做为计时标志位
unsigned long Key_time;  //用来记录按键按下的时间,进而判断是长按还是短按u8 Key_scan4x4() {u8 Key_temp, Key_value;P3 = 0x0f;P42 = 0;P44 = 0;Key_temp = (P3 & 0x0f);switch (Key_temp) {case (0x07): Key_value = 4; break;  //第四行按下  0000 0111case (0x0b): Key_value = 5; break;  //第三行按下  0000 1011case (0x0d): Key_value = 6; break;  //第二行按下  0000 1101case (0x0e): Key_value = 7; break;  //第一行按下  0000 1110default: Key_value = 0; break;}P3 = 0xf0;  //1111 0000P42 = 1;P44 = 1;Key_temp = (P3 & 0xf0);if (P44 == 0) {  //第一列按下Key_value = Key_value;} else if (P42 == 0) {  //第二列按下Key_value = Key_value + 4;} else if (Key_temp == 0xd0) {  //第三列按下Key_value = Key_value + 8;} else if (Key_temp == 0xe0) {  //第四列按下Key_value = Key_value + 12;}return Key_value;
}
void Read_key4x4() {u8 Key_up, Key_down, Key_temp;static u8 Key_old = 0;Key_temp = Key_scan4x4();Key_down = Key_temp & (Key_old ^ Key_temp);  //三步消抖法,Key_donw是按键按下的键值 Key_up是按键弹上的键值 Key_old用来记录上一次的键值Key_up = ~Key_temp & (Key_old ^ Key_temp);Key_old = Key_temp;if (Key_down)  //如果需要在按键按下就立马执行 则可以在这里对把Key_donw的值给Key_4_value{Key_time_falg = 1;  //开始计时}if (Key_up)  //这里是按键按下 并松手了才执行{Key_time_falg = 0;    // 已松手 结束计时if (Key_time >= 500)  //  如果按下的时间大于500,则为长按 否则为短按{Key_4_value = Key_up + 100;Key_time = 0;} else {Key_4_value = Key_up;Key_time = 0;}}
}
#endif

KET4X4.h

#ifndef _KEY4X4_H_
#define _KET4X4_H_
#define u8 unsigned charu8 Key_scan4x4();
void Read_key4x4();#endif

现在,在主程序中配置好定时器和中断即可:

Main.c

#include <STC15F2K60S2.H>
#include "intrins.h"
// #include "74LS138.h"
// #include "Key4.h"
#include "KEY4X4.h"
extern u8 Key_4_value;          //记录键值
extern unsigned long Key_time;  //记录按下的时间
extern bit Key_time_falg;       //计时标志位
void Timer0Init(void)           //1毫秒@11.0592MHz
{AUXR |= 0x80;  //定时器时钟1T模式TMOD &= 0xF0;  //设置定时器模式TMOD |= 0x01;  //设置定时器模式TL0 = 0xCD;    //设置定时初值TH0 = 0xD4;    //设置定时初值TF0 = 0;       //清除TF0标志EA = 1;ET0 = 1;TR0 = 1;  //定时器0开始计时
}
void main() {//  init_ls138();               // 上电关闭所有外设Timer0Init();while (1) {if (Key_4_value == 11)          //按键S11被按下{                               /*做事情*/} else if (Key_4_value == 10)   //按键S10被按下{                               /*做事情*/} else if (Key_4_value == 18)   //按键S18被按下{                               /*做事情*/} else if (Key_4_value == 19)   //按键S19被按下{                               /*做事情*/} else if (Key_4_value == 111)  //按键S11被长按{                               /*做事情*/} else if (Key_4_value == 110)  //按键S10被长按{                               /*做事情*/} else if (Key_4_value == 118)  //按键S18被长按{                               /*做事情*/} else if (Key_4_value == 119)  //按键S19被长按{                               /*做事情*/}}
}
void Tim0_interrupt() interrupt 1 {static u8 i = 0;TL0 = 0xCD;  //设置定时初值TH0 = 0xD4;  //设置定时初值i++;if (Key_time_falg == 1) {Key_time++;}if (i >= 10) {  //10ms按键扫描一次Read_key4x4();i = 0;}
}

在程序中,只需要判断KEY-4-value的值即可分辨按键哪个被按下,分别对应S4~S19,长按的键值为原本的键值加上100。

蓝桥杯单片机学习日记1-LED 蜂鸣器 继电器 数码管的简单驱动

蓝桥杯单片机学习日记2-独立按键的短按,长按的使用

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

  1. 蓝桥杯单片机学习日记1-LED 蜂鸣器 继电器 数码管的简单驱动

    此片文章用于记录蓝桥杯单片机的学习. LED 蜂鸣器 继电器 数码管 这些都是比赛时常用的外设,如下原理图:  LED部分:  蜂鸣器和继电器部分(图中还有步进电机部分):  数码管部分: 可见,上述 ...

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

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

  3. 蓝桥杯单片机学习13——NE555方波发生器频率测量

    NE555 简介 引脚图 原理图 真值表 工作原理 频率测量原理 定时器测量频率方法 代码实现 总结(一堆废话) 简介 NE555是一种高度稳定的控制器,内部用三个阻值为5KΩ的电阻分压,因此叫做55 ...

  4. 【蓝桥杯—单片机学习笔记(四)】共阳数码管的动态显示

    一.要求 在CT107D单片机训练综合平台上,实现数码管的动态显示,在8位数码管中,前面4位显示年份"2022",接着是2个分隔符"--",最后两位是月份,从1 ...

  5. 蓝桥杯单片机学习11——PCF8591A/DD/A转换芯片

    上期我们学习了DS1302实时时钟的基本使用,现在我们来学习PCF8591A/D&D/A转换芯片的相关内容 蓝桥杯单片机学习11--PCF8591A/D&D/A转换芯片 PCF8591 ...

  6. 蓝桥杯单片机学习12——AT24C02EEPROM存储芯片

    上期我们学习了PCF8591A/D&D/A转换芯片的相关内容,这么我们来介绍以下AT24C02 AT24C02 简介 命名格式 引脚描述 原理图 IIC通信原理 读写地址 存储地址 基本控制方 ...

  7. 突击蓝桥杯嵌入式(四)——滴答定时器、按键的三行代码消抖、LCD与ADC

    突击蓝桥杯嵌入式(四)--滴答定时器.按键的三行代码消抖.LCD与ADC 1.滴答定时器定时运行 我们利用滴答定时器,让LED每隔1s闪烁一次 //首先我们定义一个变量 __IO uint32_t u ...

  8. 蓝桥杯单片机学习必备资源

    目录 一.你不知道蓝桥杯单片机底层驱动改了?? 二.小蜜蜂教程--自撸代码 三.个人心得 1.NE555 2.DS1302 3.DS18B20 4.AT24C02 5.PCF8951 6.串口指令读取 ...

  9. 蓝桥杯单片机学习4——独立按键矩阵按键

    上期学习了数码管的静态显示,这次我们来学习独立按键&矩阵按键 独立按键 原理很简单,当作为独立按键使用时,跳线帽的23接在一起,此时按键如果按下,则按键连接的IO口电平会被拉低,通过捕获IO的 ...

最新文章

  1. linux求文件共有行。多个文件求共有行交集完全匹配-w
  2. python回溯算法_什么是回溯法,Python解法交流?
  3. 爱创课堂每日一题第四十天- 说说你对语义化的理解?
  4. python实现中文图片文字识别--OCR about chinese text--tesseract
  5. 火炬之光2找不到服务器,火炬之光2无法运行解决办法详细介绍
  6. 9、Flutter 实现 生成二维码
  7. js制定一个单选按钮_【下】每个月整理发票太头疼?手把手教你快速开发一个工具解决!...
  8. 高性能MYSQL读书笔记1
  9. OpenGL(二)——OpenGL图形绘制
  10. Python字典中 get() 函数的使用
  11. string 是值类型,还是引用类型(.net)
  12. Ubuntu18.04 + CUDA10.0 + tensorflow-gpu 安装过程
  13. 2017-2018-1 20179209《Linux内核原理与分析》第六周作业
  14. 在vue中动态添加商品SKU
  15. easy poi 模板生成多表excel
  16. vue 中使用 js-xlsx 导出数据导 excle, 支持多 sheet
  17. 微信小程序如何在手机预览调试
  18. Unity3D眼镜Shader技术实现
  19. 网站在移动端访问时偶尔不能加载页面,http访问被劫持
  20. Jackson公司蛋白质印迹指南丨样品制备

热门文章

  1. 王者赏金赛仿掌趣电竞平台 约战系统,高端源码
  2. 用python实现KNN算法对鸢尾花的分类
  3. 第10课:底实战详解使用Java开发Spark程序学习笔记(二)
  4. iphone android 双击,iPhone8新功能曝光:双击唤醒屏幕 向安卓手机学习
  5. 智能路由心酸调优路——看推广代码简洁之道的重要性
  6. [web]验证码 篇三——使用jQuery框架实现滑块验证码
  7. 不要制定“太伟大”的计划
  8. 这恐怕是目前画质最好最流畅的安卓直播投屏软件了
  9. A股2017十大TOP10,大数据榜单透视A股赚钱基因!
  10. 多头表现乏力 黄金技术面大周期数月持续盘整