哪里找专业做网站的人常熟,wordpress 女装小说,工程项目,网站建设市场调研#x1f680;write in front#x1f680; #x1f50e;大家好#xff0c;我是黄桃罐头#xff0c;希望你看完之后#xff0c;能对你有所帮助#xff0c;不足请指正#xff01;共同学习交流 #x1f381;欢迎各位→点赞#x1f44d; 收藏⭐️ 留言#x1f4dd;… write in front 大家好我是黄桃罐头希望你看完之后能对你有所帮助不足请指正共同学习交流 欢迎各位→点赞 收藏⭐️ 留言 本系列哔哩哔哩江科大51单片机的视频为主以及自己的总结梳理 前言
本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。
引用
51单片机入门教程-2020版 程序全程纯手打 从零开始入门_哔哩哔哩_bilibili
c51语言变量语句意思,C51中循环语句-CSDN博客 矩阵键盘引用
【51单片机】矩阵键盘_51单片机4×4矩阵键盘-CSDN博客
51单片机学习笔记 ——二矩阵键盘_51单片机 矩阵键盘-CSDN博客 郭天祥:
51单片机第三章-数码管显示原理及应用实现-中断_51单片机数码管中断程序-CSDN博客 正文
0. 概述
在淘宝上购买了江协科技51单片机开发板套件普中科技STC51单片机A2型号就上在上一篇博文里说的自己计划学习下江协科技51单片机开发教程通过STC51单片机这种MCU这种贴近于裸机的开发来增加对于系统硬件层面知识的了解和掌握。 1. 矩阵键盘
在键盘中当按键数量较多时为了减少I/O口的占用通常将按键排列成矩阵的形式。采用逐行或逐列的“扫描”就可以独处任何位置按键的状态。 矩阵键盘的目的是减少I/O口占用 矩阵键盘采用的是矩阵的连接方式目的是为了减少IO口的使用。
如果每一个按键都像独立按键一样专门使用一个IO口来控制那么我们需要的IO口数量就是行×列个。
但是如果采用矩阵的连接方式我们需要的IO口数目就会变成行列个矩阵的行列数越多减小的程度就越明显。
但是按照矩阵形式排列也会出现一些不方便的结果所以我们采用了类似之前数码管的解决方式——扫描。 但是与数码管的扫描略有不同数码管是输出元件所以数码管的扫描是输出扫描我们不断循环输出不同的值利用人眼的视觉暂留实现我们需要的操作。 而矩阵键盘是输入元件所以我们矩阵键盘采用的扫描是输入扫描以非常快的速度不断循环读取IO口的值达到与正常按键相同的效果。这里还是利用了扫描速度远大于人操作的速度的原理。 那么如何实现上述操作呢
与之前的独立按键进行比较如果我们单独看矩阵键盘的一行或者一列就会发现它们有着相同的结构在此用列来进行比较用行同理 2. 单片机IO口准双向口
单片机的io口是一种弱上拉的模式~又被称作是准双向口(inputoutput) 既可以输入又可以输出这种就叫做是双向口。 但是这种双向口有点问题:这么样才可以达到输入或者是输出呢 像我们这种矩阵键盘的话是不是给上一端是0然后读取另一头。但是另一头你怎么知道它是一种输入低电平)呢它其实也是作为一种输出端(高电平)它既是输出(高电平)也是输入(低电平)。那么为什么单片机它的 io 口是默认为高电平呢是因为它里面拥有一个上拉电阻把低电平变成高电平了 所以才导致单片机是高电平还有一个是当口输出为1的时候驱动能力很弱允许外部装置将其拉低。当引脚的输出为低电平的时候它的驱动能力很强可以吸收相当大的电流。单片机中 P1、P2、P3 都是一种弱上拉的一种模式。 准双向口输出如下所示 单片机的io口是一种弱上拉的模式~又被称作是准双向口(inputoutput) 既可以输入又可以输出这种就叫做是双向口。此种双向口是弱上拉强下拉当将IO的输出当为1的时候驱动能力很弱允许外部装置将其拉。当引脚的输出为低电平的时候它的驱动能力很强可以吸收相当大的电流。 单片机中 P1、P2、P3 都是一种弱上拉的一种模式。 单片机中 P0 口是开漏输出模式。 一般按键检测都是接地检测第电平。为什么不接Vcc检测高电平哪因为I/O口配置为低电平要将其拉高为高电平需要比较大的电流。 准双向口是一种弱上拉模式可以用如下的示意图来解释当IO口开关选择输出1 高电平时通过电阻接Vcc进行弱上拉其上拉输出能力比较弱此时I/O接口如果接地可以将其拉低为低电平。 3. 矩阵键盘扫描 首先我们需要知道51单片机的引脚默认为高电平所以我们需要对这8个引脚进行一个初始化即P1 0xFF ;这样就和独立按键的操作基本一致了。 可以发现如果我们此时只给P13低电平第一列就和独立按键一样了。接下来需要做的就是判断在P13为低电平时P14、P15、P16、P17是否为低电平。如果是则说明此时有按键按下接通了电路使原来是高电平的引脚变为了低电平。第一列扫描完后重新初始化P1 0xFF ;然后给P12低电平继续检测P14、P15、P16、P17是否为低电平。 以此类推不断循环读取按键是否按下就达到了随时按下任意按键都可以检测出来的效果 本实验使用的普中科技C51单片机开发板矩阵键盘扫描时需要注意的点因为开发板的引脚复用冲突本实验使用按列扫描的方式。 我们这个开发板 P1_5 口可能会有问题P1_5口可能一会读到高电平一会读到第 电平因为在此开发板是行 P1_5 连接到了 Beep 会造成蜂鸣器鸣叫。 为了避免这个问题此实验中使用逐列扫描的方式。 4. 源码编写
本次实验使用逐列扫描矩阵键盘的方式来检测有哪个按键被按下。 matrix.h #ifndef __MATRIX_H__
#define __MATRIX_H__unsigned char MatrixKey();#endif matrix.c #include REGX52.H
#include Delay.h
#include matrix.h/*** brief 获取按下按键的键值* param 无* retval 按下按键的键值没有按键按下时返回0* S11, S12, S33, S44, S55, S66, S77, S88* S99, S100, S33, S11确认, S12取消, S13删除, S14,*/
unsigned char MatrixKey()
{unsigned char keyNumber 0;//每次扫描键盘之前先把P1全部初始化为高电平P10xFF;P1_3 0;//delay(20)延时进行按键按下消抖 while循环检测松手 delay(20) 按键松开消抖if(P1_7 0) {Delay(20); while(P1_7 0); Delay(20); keyNumber 1;} if(P1_6 0) {Delay(20); while(P1_6 0); Delay(20); keyNumber 5;}if(P1_5 0) {Delay(20); while(P1_5 0); Delay(20); keyNumber 9;}if(P1_4 0) {Delay(20); while(P1_4 0); Delay(20); keyNumber 13;}P10xFF;P1_2 0;if(P1_7 0) {Delay(20); while(P1_7 0); Delay(20); keyNumber 2;}if(P1_6 0) {Delay(20); while(P1_6 0); Delay(20); keyNumber 6;}if(P1_5 0) {Delay(20); while(P1_5 0); Delay(20); keyNumber 10;}if(P1_4 0) {Delay(20); while(P1_4 0); Delay(20); keyNumber 14;}P10xFF;P1_1 0;if(P1_7 0) {Delay(20); while(P1_7 0); Delay(20); keyNumber 3;}if(P1_6 0) {Delay(20); while(P1_6 0); Delay(20); keyNumber 7;}if(P1_5 0) {Delay(20); while(P1_5 0); Delay(20); keyNumber 11;}if(P1_4 0) {Delay(20); while(P1_4 0); Delay(20); keyNumber 15;}P10xFF;P1_0 0;if(P1_7 0) {Delay(20); while(P1_7 0); Delay(20); keyNumber 4;}if(P1_6 0) {Delay(20); while(P1_6 0); Delay(20); keyNumber 8;}if(P1_5 0) {Delay(20); while(P1_5 0); Delay(20); keyNumber 12;}if(P1_4 0) {Delay(20); while(P1_4 0); Delay(20); keyNumber 16;}return keyNumber;
} main.c #include REGX52.H
#include INTRINS.H
#include delay.h
#include lcd1602.h
#include matrix.hvoid main()
{unsigned char keyNum 0;LCD_Init();//LCD_ShowString(1, 1, Matrix Key!);while(1){keyNum MatrixKey();if(keyNum){LCD_ShowNum(1, 1, keyNum, 2);}}
}5. 总结 通过本实验了解了STC51单片机的I/O口准双向口I/O口的为弱上拉单片机的I/O口即是输出同时也是输入。因为单片机I/O口是弱上拉当I/O口输出为1时允许通过外部输入将其下拉为低电平。STC51单片机的 P1, P2, P3 口为准双向I/O口弱上拉模式。STC51单片机的 P0 口默认为开漏输出模式。当按键较多时使用矩阵键盘可以节省I/O口资源。矩阵键盘的检测方式是按照行逐行扫描或者按照列逐列扫描。每次扫描之前需要先将所有的矩阵键盘行和列的I/O口置为1然后给某一行或列低电平然后按照行或列扫描检测另一端的输入电平。 6. 结束
本文至此结束