51汇编——矩阵键盘
矩阵按键可以说是51单片机一个比较典型的输入型的外设。它可以让人与单片机更好的进行交互。
这一小节打算写一个4X4的矩阵按键。至于2X8 , 3X4 ,3X3 这些类型的其实他们的原理都是一样的。可以仿4X4的来写。
矩阵按键扫描原理
这里使用的是8个IO口控制16个按键。
其实原理也很简单,就是对每一行一次进行扫描。比如在图中标号0处(第一行)给一个低电平,如果第一行有按键被按下,那么通过读取标号4、5、6、7处的电平就可以知道是第一行的哪一个按键被按下。其他行也是一样。
先对第一行进行扫描。
KEY_SCAN:
START:MOV P1,#0FFH//1、先扫描第一行MOV R2,#0 ;用来记录行号(第0行)MOV P1, #0FEH ;1111 1110 P1.0为低电平。MOV A,P1 ;读取P1口的电平状态ANL A,#0F0H ;通过逻辑与读取P1口的高四位的电平状态CJNE A,#0F0H,ON /*判断读取的电平状态经过逻辑与后是否等于1111 0000,如果等于1111 0000说明没有按键按下,反之有按键按下。如果没有按键按下就继续扫描第二行。*/
对第二行的扫描
//2、扫描第二行MOV R2,#1 ;记录行号MOV P1, #0FDH ;1111 1101 P1.1为低电平MOV A,P1 ANL A,#0F0H ;读取电平状态并进行逻辑与CJNE A,#0F0H,ON
以此类推
对第三行和第四行的扫描
//3、扫描第三行MOV R2,#2MOV P1, #0FBH ;1111 1011MOV A,P1 ANL A,#0F0HCJNE A,#0F0H,ON//4、扫描第四行MOV R2,#3MOV P1, #0F7H ;1111 0111MOV A,P1 ANL A,#0F0HCJNE A,#0F0H,ONJMP CHU
值得注意的是这一句
CJNE A,#0F0H,ON
如果如果不等于1111 0000说明有按键按下,程序跳转到 ON处。
ON: MOV R1,A ;将读取到的值存放在R1中待用。
在对第三行和第四行的扫描结束后如果都没有按键按下会到这一句: JMP CHU
CHU:RET
直接结束扫描函数。
至此当有按键按下时我们会得到两个数据 行号、读取到(经过逻辑与后)的P1口数据分别放在R2,R1寄存器中。
现在我们要做的就是把这两个数据转换成0~F对应的要显示的数据。
CHANGE: MOV A,R2 ;读取行号MOV B,#4 MUL AB ;让A=行号*4=对应行的第一个按键所对应的显示值;(因为这里是4X4矩阵键盘); 行号:0 乘后的结果:0; 行号:1 乘后的结果:4; 行号:2 乘后的结果:8; 行号:3 乘后的结果:CMOV R2,A ;将乘后的结果重新赋值给R2MOV A,R1 SWAP A ;半字节就交换。E0: CJNE A,#0EH,D0 ;如果半字节交换后等于 0000 1110说明是该行的第一 MOV R1,#0 ;个按键被按下,对R1赋值0 ,如果不等于则跳到下一个D0: CJNE A,#0DH,B0 MOV R1,#1
B0: CJNE A,#0BH,LASTMOV R1,#2
LAST: CJNE A,#07H,ERMOV R1,#3ER: MOV A,R2 ADD A,R1 ;最后将重新赋好的值相加就得到了对应的显示值。MOV R0,A
把转换好的数据放在R0寄存器中。
然后就是显示的控制了
DISPLAY:MOV DPTR ,#TAB MOV A,R0 MOVC A,@A+DPTR ;变址寻址MOV P2,A CLR ARET;共阴数码管的编码 输入3FH时显示数字0,以此类推 ,分别显示0~FTAB: DB 3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH,77H,7cH,39H,5eH,79H,71H
这里给一个完整的程序
ORG 0000HLJMP MAINDISPLAY:MOV DPTR ,#TABMOV A,R0 MOVC A,@A+DPTRMOV P2,ACLR ARET
KEY_SCAN:
START:MOV P1,#0FFH//1、先扫描第一行MOV R2,#0MOV P1, #0FEHMOV A,P1 ANL A,#0F0HCJNE A,#0F0H,ON//2、扫描第二行MOV R2,#1MOV P1, #0FDHMOV A,P1 ANL A,#0F0HCJNE A,#0F0H,ON//3、扫描第三行MOV R2,#2MOV P1, #0FBHMOV A,P1 ANL A,#0F0HCJNE A,#0F0H,ON//4、扫描第四行MOV R2,#3MOV P1, #0F7HMOV A,P1 ANL A,#0F0HCJNE A,#0F0H,ONJMP CHU
ON: MOV R1,A
CHANGE: MOV A,R2MOV B,#4MUL ABMOV R2,A//E D B 7MOV A,R1SWAP A
E0: CJNE A,#0EH,D0MOV R1,#0
D0: CJNE A,#0DH,B0MOV R1,#1
B0: CJNE A,#0BH,LASTMOV R1,#2
LAST: CJNE A,#07H,ERMOV R1,#3
ER: MOV A,R2 ADD A,R1MOV R0,A
CHU:RETMAIN:
F1: ACALL KEY_SCANACALL DISPLAYJMP F1TAB: DB 3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH,77H,7cH,39H,5eH,79H,71HEND
仿真电路图:
矩阵键盘的程序+仿真 度盘自取
链接:https://pan.baidu.com/s/1jH5wYGY-kki2SB957ex29Q
提取码:sg6j
最后在给一个之前为期末准备的2*8矩阵键盘+IO口扩展+流水灯的实例。
度盘自取
链接:https://pan.baidu.com/s/1dQtBQqXKwYiBS8UReP6Pvg
提取码:3bjy
----------------------------------------------------------结束-----------------------------------------------------------------
51汇编——矩阵键盘相关推荐
- c51单片机矩阵键盘1602计算器_基于51单片机矩阵键盘的简易计算器制作
1. 运算过程.符号公式实时显示在显示屏上(I2C 1602). 2. 自带三角函数.开根号.平方运算. 3. 计算得出的结果可设置保存并用以下一次计算. 4. 所有运算结果精确到至少小数点后两位. ...
- 51单片机矩阵键盘的控制原理-扫描及使用方式
矩阵键盘 矩阵键盘一般和之前学的LCD1602液晶屏一起控制,建议先看一下之前的博客学习一下液晶屏的使用. 当然矩阵键盘也可以和数码管和LED等一起操作,但是数码管需要扫描,很费CPU,LED又不能直 ...
- 51单片机矩阵键盘——数码管显示
1.前言 当我们熟悉了数码管的位选与段选,并了解的矩阵键盘的扫描之后就可以编写程序了. 1.1实验现象 按下矩阵键盘S1并松开,数码管第一位(LED8)显示0:按下矩阵键盘S2并松开,数码管第一位显示 ...
- 51单片机矩阵键盘——LCD1602显示
1.前言 本次的实验需要用到LCD1602液晶屏,需要用到LCD1602.c 与LCD1602.h文件链接: https://download.csdn.net/download/YLG_lin/86 ...
- 51单片机矩阵键盘扫描及使用方法
一.矩阵键盘简介 矩阵键盘,也称矩阵按键,是为了节约单片机IO口占用所引入的一种外设. (图片截取至普中A2开发板原理图) (图片截取至普中A2开发板实物图) 我们知道,一个独立按键需要1个IO口.但 ...
- 51的矩阵键盘(4*4)的原理与实现
个人感觉,这个矩阵键盘的出现,就是为了减少串行口的使用,像这个4*4的矩阵键盘,8个串行口就可以控制16键,而如果是普通的则需要16个串行口,同样的效果,串行口的使用减少了一般,对于串行口资源紧张的情 ...
- 51单片机矩阵键盘C程序
飞哥语录:别高估关系,别低估人心. 主程序1: void main() {uchar i,j,ki=0;j=0;while(1){i=key();//键盘循环扫描,其值赋给变量数组tableif(i! ...
- 按键(独立按键、矩阵键盘)——附带程序
按键 一.独立按键: 简介: 消抖: 代码: 二.矩阵键盘 : 行列反转扫描法: 按键对照表: 三.矩阵键盘实验 效果展示: 仿真电路图: 代码: 一.独立按键: 简介: 接触式按键,又叫轻触开关 接 ...
- c51单片机矩阵键盘1602计算器_51单片机矩阵键盘计算器.doc
51单片机矩阵键盘计算器 51单片机矩阵键盘计算器 /**********413暑假作品*********12864液晶显示屏,结合4*4矩阵键盘,简易计算器*,存储地址:STC-hex2 , LCD ...
- 【51单片机】矩阵键盘逐行扫描法仿真实验+超详细Proteus仿真和Keil操作步骤
[51单片机]矩阵键盘逐行扫描法仿真实验+超详细Proteus仿真和Keil操作步骤 一.环境 二.硬件部分 1. Proteus新建工程 2. 添加元件 3.连接线路 4.硬件效果 三.软件部分 1 ...
最新文章
- 105_键盘事件对象
- 计算机删除qq用户信息吗,电脑中删除qq资料生日性别的方法
- FutureTask的使用
- 我的10年富士康故事
- 优化Java序列化– Java,XML,JSON,Kryo,POF
- 迷宫搜索问题最短路_【算法常用模板】总结(更新中)
- Python GUI设计 PythonWx
- c 获得java数据,获得jar中数据,获得jar数据,// example c
- 更改VMware硬盘大小
- python学起来很蛋疼_一个初学者的辛酸路程-了解Python-2
- Webuploader 出坑记
- 烽火服务器安装系统,烽火服务器进入bios配置
- 期望收益率、方差、协方差、相关系数的计算公式
- REST,以及RESTful的讲解
- 使用 Convex 进行状态管理的指南
- 组织行为学笔记(3)——情绪和心情
- 《数学史概论》读后感
- CAD中样条曲线Spline怎样才能分解成多段弧arc?
- Excel用函数把时间戳格式和日期格式相互转换
- 如何做华为云服务器迁移?