按键

一.按键电路

1.矩阵按键

将J5的KBD接在一起,使用矩阵按键。就是1.2接在一起。

现在8个I/O口控制16个按键。P34,P35,P42,P44控制四列,单片机通过这四个I/O输出高低电平。P30,P31,P32,P33控制四行,单片机通过这四个I/O接收高低电平。通过这种方式,单片机进行按键扫描。

具体来说,就是先给P44一个低电平,P34,P35,P42一个高电平,这个时候看P30,P31,P32,P33,如果P30给单片机一个低电平,那么表示S7按下,以此类推。

总结来说,按键扫描就是给a列低电平,其实三列高电平,如果b行是低电平,就是a列b行的按键被按下。

2.独立按键

将J5的BTN接在一起,使用独立按键,就是2.3接在一起。

独立按键由四个一列的按键组成。

独立按键由于2.3接在一起,默认这列是低电平,然后看那行低电平,就是对应的按键。

总结来说,独立按键扫描就是那行低电平,就是那行对应的按键被按下。

二.按键模块化编程

1.按键模块化编程原理

由于矩阵按键和独立按键扫描原理差不多,就不分开编程了。

在蓝桥杯单片机开发板中,按键是一个特殊的外设,一般通过它将其他的外设连接起来。例如:按下S7,LED全亮。

所以说,在按键编程时,不仅要编写按键的模块化代码,还要有一个模板来方便各种外设调用。

2.按键模块化编程代码

(1)按键扫描部分

//key.c头文件代码部分
#include "key.h"//根据考题决定是编写独立按键还是矩阵键盘//--独立按键
unsigned char Key_Read_BTN(void)//这个独立按键结构简单,代码方便。
{unsigned char Key_Value;if(P30 == 0) Key_Value = 7;else     if(P31 == 0) Key_Value = 6;else  if(P32 == 0) Key_Value = 5;else  if(P33 == 0) Key_Value = 4;else Key_Value = 0;return Key_Value;
}//--矩阵键盘
unsigned char Key_Read(void)/*这个思路是先扫描一列,然后接收P3的低四位,
P3 & 0X0F就是将P3的高四位清空,低四位保持不变。然后让这个低四位左移,而低
四位可以代表那一行的按键按下。在keil中,unsigned int是16位变量,通过不断
的左移,这个变量前四位是扫描第1列时P3的后四位,以此类推。这个变量就储存着
按下的按键位置。*/{unsigned int Key_New;unsigned char Key_Value;P44 = 0;P42 = 1;P35 = 1;P34 = 1;Key_New = P3 & 0X0F;P44 = 1;P42 = 0;P35 = 1;P34 = 1;Key_New = (Key_New<<4)|(P3 & 0X0F);P44 = 1;P42 = 1;P35 = 0;P34 = 1;Key_New = (Key_New<<4)|(P3 & 0X0F);P44 = 1;P42 = 1;P35 = 1;P34 = 0;Key_New = (Key_New<<4)|(P3 & 0X0F);switch(~Key_New){case 0x8000: Key_Value = 4; break;case 0x4000: Key_Value = 5; break;  case 0x2000: Key_Value = 6; break; case 0x1000: Key_Value = 7; break; case 0x0800: Key_Value = 8; break;case 0x0400: Key_Value = 9; break;  case 0x0200: Key_Value = 10; break;    case 0x0100: Key_Value = 11; break;    case 0x0080: Key_Value = 12; break;case 0x0040: Key_Value = 13; break;    case 0x0020: Key_Value = 14; break;    case 0x0010: Key_Value = 15; break;            case 0x0008: Key_Value = 16; break;case 0x0004: Key_Value = 17; break;    case 0x0002: Key_Value = 18; break;    case 0x0001: Key_Value = 19; break;            default :  Key_Value = 0;}return Key_Value;}
//key.h头文件代码部分
#include "STC15F2K60S2.H"unsigned char Key_Read_BTN(void);//独立按键
unsigned char Key_Read(void);//矩阵键盘

(2)按键消抖

通过上面的代码以及注释,我们编写了一个只要按下s几按键,key—down就是多少的代码,但是实际上并非如此。通常的按键所用开关为机械弹性开关,当按键按下、抬起时,电平短时间内会发生几次跳变,按键在闭合及断开的瞬间均伴随有一连串的抖动。

抖动很有可能带来一次按键按下,结果单片机执行多次指令,所以我们要做消抖的工作。常用的是通过延时函数进行消抖,不过效果不太好,还会造成性能浪费。蓝桥杯官方采用”三行代码“进行按键消抖。

 //三行代码Key_Value = Key_Read();Key_Down = Key_Value & (Key_Old ^ Key_Value);//下降沿,按得哪个按键,这个值就是几 ^是异或符号,当两个数异或时,会把这两个数按位异或,例如 7^8 = 00000111 ^ 00001000 = 00001111 = 15Key_Old = Key_Value;//检测电平,一直按着一直等于一个数
  1. 正常情况下按键没有按下,Key_Value = 0,Key_Old = 0 。
  2. 当有按键按下,例如S7,Key_Value = 7,Key_Down = 00000111 & (00000111 ^ 00000000)= 00000111 = 7 Key_Old = 7 。
  3. 当按住按键不动时,Key_Value = 7,Key_Down = 00000111 & (00000111 ^ 00000111)= 00000000 = 0 Key_Old = 7 。
  4. 在按键抬起时,Key_Value = 0,Key_Down = 00000000 & (00000111 ^ 00000000)= 00000000 = 0 Key_Old = 7 。

也就是说,Key_Down 是一个判断下降沿的变量,只有按键处于按下的过程Key_Down 才会被赋值,其他情况下Key_Down 是0 。

三行代码提供消抖的作用,同时三行代码具有很高的灵活性,通过一些变化,就可以实现单击,双击,长按等功能。

同时,在按键扫描的部分,我们需要搭配定时器来进行扫描,可以保证按键响应及时,这一部分在定时器部分在仔细讲解。
wn 才会被赋值,其他情况下Key_Down 是0 。==

三行代码提供消抖的作用,同时三行代码具有很高的灵活性,通过一些变化,就可以实现单击,双击,长按等功能。

同时,在按键扫描的部分,我们需要搭配定时器来进行扫描,可以保证按键响应及时,这一部分在定时器部分在仔细讲解。

蓝桥杯单片机按键模块化编程相关推荐

  1. 【蓝桥杯单片机组模块】4、按键模块

    微信搜索:ReCclay,也可免费阅读博主蓝桥系列所有文章,后台回复"代码"即可获取蓝桥所有备赛代码!关注博主公众号,还可拥有加入博主粉丝群实时沟通技术难题.免费下载CSDN资源等 ...

  2. 关于第八届蓝桥杯单片机初赛----电子钟设计的题目分析和编程思路分享

    关于第八届蓝桥杯单片机初赛----电子钟设计的题目分析和编程思路分享 1.前言 蓝桥杯单片机比赛,对于初试者,比如那些没有接触51系列单片机,或者很少编程训练的人而言,确实很有挑战力.而即使对于有基础 ...

  3. 蓝桥杯单片机NE555编程

    蓝桥杯单片机中的NE555模块的编程,其实是很简单.简单来说就是计算一秒钟之内有多少个频率响应.中间所谓的频率响应也就是计算定时器作为计数器时候溢出的个数而已.能够考察的点就是这样子了,也要稍微了解, ...

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

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

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

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

  6. 蓝桥杯单片机设计与开发_标准模板

    蓝桥杯单片机设计与开发_标准模板 一.前言 首先,这篇文章是笔者第一次在 CSDN 上写博文,较为生疏,读者若有任何意见,欢迎大家在评论区交流! 笔者目前为一名大二学生,参加了2021年蓝桥杯单片机设 ...

  7. 蓝桥杯单片机第十四届省赛题目和程序答案

    目录 1.前言 2.题目 3.程序架构 3.1 display.c 3.2 ds1302.c 3.3 iic.c 3.4 onewire.c 3.5 main.c 主函数文件 3.6 环境配置 4. ...

  8. 蓝桥杯单片机设计与开发笔记(一)

    近期和我们实验室的小伙伴一起参加了第七届蓝桥杯单片机开发与设计组省赛,在这里将备赛期间的一些资料和经验总结一下,并分享给大家. 蓝桥杯单片机开发板是国信长天的CT107D单片机综合训练平台,个人感觉这 ...

  9. 【蓝桥杯单片机(24)】历届单片机客观题及答案解析

    目录 考前冲刺,专栏完结篇 ## 推荐链接: 推荐视频–小蜜蜂老师讲解 赛点资源包下载,提取码:brno 三极管基本知识总结 运算放大电路的基础 第十三届蓝桥杯单片机官方直播课录屏 目录 一些刷题后的 ...

最新文章

  1. 《推荐系统实践》要点思维导图
  2. web app指南之构建html5离线应用
  3. java高并发类_Java 高并发之魂
  4. linux ubuntu 软件安装的三种方式
  5. lpc1768的gpio库函数_LPC1768之GPIO流水灯的实验例程
  6. CSS学习-网页导航栏
  7. Ubuntu的配置(以ubuntu 20.04桌面版为例)
  8. 判断Json字符串返回类型 对象 或者 数组
  9. python基本数据类型第三周_python3第二天(基本数据类型)
  10. 中国联通公布8月运营数据出炉 4G用户大幅度提升
  11. Linux TCP/IP网络协议栈:IP协议源码分析
  12. 面向对象7:项目二的总结
  13. 联发科MT7621 Openwrt开发编译记录
  14. 【Linux开发板学习教程】全免费超全面超详细
  15. GF(256)下的乘法
  16. c语言日期计算器程序代码,用C语言写一个日期计算器
  17. 17个品牌,113款5G手机,5G离我们越来越近。
  18. 线性代数 向量组 线性相关与表出 秩 解的关系总(一)
  19. mysql 查询半径范围内经纬度坐标
  20. asp mysql 不用 dsn,另类: asp不用DSN访问数据库

热门文章

  1. 基于nodejs+vue的健身房课程预约平台
  2. 西电操作系统上机实验6
  3. python十大排行_TIOBE 6月排行:Python 排名飙升
  4. 目前国内主流的人事管理系统有哪些?
  5. Python3趣味系列题1------回溯暴力解决数独问题
  6. 我国职业教育的第一届本科生,毕业了!
  7. kettle教程---kettle作业调度,根据更新时间增量更新
  8. 入门 labelImg 数据标注
  9. PostgreSQL 数据库和 pgAdmin 4
  10. 在什么情况下应该使用形式化说明技术?使用形式化说明技术时应遵守哪些准则?...