51汇编——矩阵键盘

2023-11-16

矩阵按键可以说是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,#2
		MOV P1, #0FBH        ;1111 1011
	   MOV A,P1	 
	   ANL A,#0F0H
	   CJNE A,#0F0H,ON
	    //4、扫描第四行
	   MOV R2,#3
		MOV P1, #0F7H        ;1111 0111
	   MOV A,P1	 
	   ANL A,#0F0H
	   CJNE A,#0F0H,ON
	   JMP 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   乘后的结果:C

		   MOV R2,A                    ;将乘后的结果重新赋值给R2
									
		  MOV 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,LAST
			MOV R1,#2
LAST:       CJNE A,#07H,ER
			MOV R1,#3

ER:			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 A
			RET





;共阴数码管的编码 输入3FH时显示数字0,以此类推  ,分别显示0~F
  TAB: DB 3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH,77H,7cH,39H,5eH,79H,71H

这里给一个完整的程序

 ORG 0000H
 LJMP MAIN
 DISPLAY:
  			MOV DPTR ,#TAB
			MOV A,R0			   
		
			MOVC A,@A+DPTR
				MOV P2,A
			CLR A
			RET
KEY_SCAN:
START:
		MOV P1,#0FFH
		//1、先扫描第一行
		MOV R2,#0
		MOV P1, #0FEH
	   MOV A,P1	 
	   ANL A,#0F0H
	   CJNE A,#0F0H,ON
	   //2、扫描第二行
	   MOV R2,#1
		MOV P1, #0FDH
	   MOV A,P1	 
	   ANL A,#0F0H
	   CJNE A,#0F0H,ON
	   //3、扫描第三行
	   MOV R2,#2
		MOV P1, #0FBH
	   MOV A,P1	 
	   ANL A,#0F0H
	   CJNE A,#0F0H,ON
	    //4、扫描第四行
	   MOV R2,#3
		MOV P1, #0F7H
	   MOV A,P1	 
	   ANL A,#0F0H
	   CJNE A,#0F0H,ON
	   JMP CHU
ON:  
		MOV R1,A	
CHANGE:  
			MOV A,R2
			MOV B,#4
			MUL AB
		   MOV R2,A
									 //E D B 7
		  MOV A,R1
		  	SWAP A
E0:		  CJNE A,#0EH,D0
		    MOV R1,#0
D0:       CJNE A,#0DH,B0
			MOV R1,#1
B0:       CJNE A,#0BH,LAST
			MOV R1,#2
LAST:       CJNE A,#07H,ER
			MOV R1,#3
ER:			MOV A,R2 		
		   ADD A,R1
		   MOV R0,A        
CHU:

		RET

MAIN:
F1:		ACALL  KEY_SCAN
		ACALL  DISPLAY
		JMP F1
  TAB: DB 3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH,77H,7cH,39H,5eH,79H,71H

 END

仿真电路图: 

矩阵键盘的程序+仿真 度盘自取 

链接:https://pan.baidu.com/s/1jH5wYGY-kki2SB957ex29Q 
提取码:sg6j


 最后在给一个之前为期末准备的2*8矩阵键盘+IO口扩展+流水灯的实例。

度盘自取

链接:https://pan.baidu.com/s/1dQtBQqXKwYiBS8UReP6Pvg 
提取码:3bjy

----------------------------------------------------------结束-----------------------------------------------------------------

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51汇编——矩阵键盘 的相关文章

  • 测试用例基础 12_02

    回顾 测试用例怎么写 测试点 不包含测试步骤 只有测试什么 只有测什么功能 预期的结果 为了提高作业的效率 测试用例只写测试点 直接写在Xmind 或者Excel 效率会比较高 面试的时候 就直接说测试点 是为了有限的时间 完整的测试用例
  • Ubuntu15.04 安装卡在logo界面不动

    Ubuntu15 04 安装卡在logo界面不动 进度点卡死不动 原因主要是双显卡 电源设置项默认不合理 导致安装失败 选择USB硬盘 uefi 进入到一个有四个选项的界面 分别是 1 try Ubuntu without install

随机推荐

  • ChatGPT颠覆的第三个行业-教育领域

    引言 随着人工智能技术的飞速发展 越来越多的行业受到了影响 ChatGPT作为一种领先的自然语言处理技术 在内容创作 在线客服等领域取得了显著的成果 如今 它正开始进入另一个领域 教育 本文将探讨ChatGPT如何改变教育行业 以及它为教育
  • 3D旋转 相册

    效果展示 代码逻辑
  • STM8 学习笔记15:SPI

    SPI 1 概述 SPI 串行外设设备接口 Serial Peropheral Interface 是一种高速的 全双工 串行 同步的通信总线 2 特性 主或从操作 8 或 16 位传输帧格式 通信速率一般在 50MHz 以下 可编程的时钟
  • mac 安装 php 与 hyperf 框架依赖的扩展并启动 gptlink 项目

    m系列 mac 安装 php 与 hyperf 框架依赖的扩展并启动 gptlink 项目 gptlink 项目是一个前后端一体化的 chatgpt 开源项目 gptlink 项目地址 https github com gptlink gp
  • 关于EPLAN二次开发,Visual Studio 2019开发环境设置

    关于EPLAN二次开发 Visual Studio 2019开发环境设置 您指的拥有 准备工作 参考入门操作 转载 参考入门 http blog sina com cn s blog 9a1ad43a01013n6v html 1 准备工具
  • Verilog对数据进行四舍五入(round)与饱和(saturation)截位

    设计经验 5 Verilog对数据进行四舍五入 round 与饱和 saturation 截位 一 软件平台与硬件平台 软件平台 操作系统 Windows 8 1 64 bit 开发套件 Vivado2015 4 2 Matlab2016a
  • ant design pro v5 req.body获取数据为空的问题

    问题描述 需要发送请求修改mock里面MaterialList的数据 在service的方法中可以打印出正确的需传递的参数 但是在mock里面使用 res send req body 返回的却是 原代码 services ant desig
  • 【电子电路】MOS选型技巧

    MOSFET选型技巧 导语 MOSFET是电路中非常常见的元件 常用于信号开关 功率开关 电平转换等各种用途 由于MOSFET的型号众多 应用面广 所以MOSFET的选型需要考虑的因素也比较多 许多工程师在选型时感觉无从下手 今天小编就来分
  • 爬虫之JS的解析

    JS的解析 学习目标 了解 定位js的方法 了解 添加断点观察js的执行过程的方法 应用 js2py获取js的方法 1 确定js的位置 对于前面人人网的案例 我们知道了url地址中有部分参数 但是参数是如何生成的呢 毫无疑问 参数肯定是js
  • 区块链开源实现HYPERLEDGER FABRIC架构详解

    写在前面 今天看了一篇讲解fabric架构的文章 感觉还不错 将fabric里的MSP和交易流程都讲的很明白 遂将文章在此分享 各位也可以直接看原文 也可以看我的 其中穿插了些本人拙见 原文地址 http www taohui pub 20
  • Going Deeper with convolutions

    Going Deeper with convolutions 转载请注明 http blog csdn net stdcoutzyx article details 40759903 本篇论文是针对ImageNet2014的比赛 论文中的方
  • 【原动力.降本增效】读后有感

    自我介绍 目前在一家算法加密公司担任项目经理 是从微信公众号火爆的那个年代开始接触 IT 互联网行业的 我的技术栈就不在这里介绍了 比较杂 因为前几家公司都是中小公司 那时候老板恨不得把设计也给开了 让你连画图带写页面 带写服务器后端功能
  • 慢SQL的致胜法宝

    大促备战 最大的隐患项之一就是慢SQL 对于服务平稳运行带来的破坏性最大 也是日常工作中经常带来整个应用抖动的最大隐患 在日常开发中如何避免出现慢SQL 出现了慢SQL应该按照什么思路去解决是我们必须要知道的 本文主要介绍对于慢SQL的排查
  • 【解决win10 64位系统下ISE14.7闪退问题】

    解决win10 64位系统下ISE14 7闪退问题 在FPGA开发中 使用Xilinx ISE设计工具可以快速进行开发 但是在使用win10 64位系统下的ISE14 7版本时 可能会遇到闪退的问题 这个问题很麻烦 但是可以通过一些简单的步
  • Cocos Shader实现纹理的动态波浪效果

    一 效果预览 通过滑动条可调节波浪频率的快慢 二 实现原理 对当前uv坐标进行线性 三角函数的混合变换 结合动态变化的时间值 得到一个新的采样坐标 使纹理呈现出动态 起伏不定的波浪形态 Shader中的关键代码如下 得到波浪效果的新坐标 v
  • VS code-设置问题

    起因 VS code本来是默认支持禁用非活动区域代码着色的 但我不知道怎么点取消了 今天又设置回来 因为感觉这样看代码方便点 方法 如果设置项旁边还有灰色小字提示与工作区不同 需要点一下将工作区设置也勾上 我就是只设置了用户区 没设置工作区
  • 搭配 umijs+vue的项目实战 以umijs为主应用+vue微应用

    这里写目录标题 搭配 umijs vue的项目实战 以umijs为主应用 vue微应用 umi js配置qiankun Vue2 x微应用 搭配 umijs vue的项目实战 以umijs为主应用 vue微应用 1 首先我们需要在项目中下载
  • 软件ETest

    ETest简介 ETest是一款软件开发环境IDE 基于该IDE可以完成嵌入式系统测试软件的开发与部署 该产品是由凯云科技率先在行业内推出的国产自主可控半实物仿真测试开发平台 有效打破了国内该领域长期由进口软件LabView DSpace等
  • 冲牙器使用记录

    保护好牙齿才能品尝美食 可以买一款比较便宜的冲牙器先试试 价位在100 200即可 一般有高中低三档 先用最低档位体验2个星期 冲的时候 喷嘴就贴着牙齿 不然会水花四溅
  • 51汇编——矩阵键盘

    矩阵按键可以说是51单片机一个比较典型的输入型的外设 它可以让人与单片机更好的进行交互 这一小节打算写一个4X4的矩阵按键 至于2X8 3X4 3X3 这些类型的其实他们的原理都是一样的 可以仿4X4的来写 矩阵按键扫描原理 这里使用的是8