51汇编——矩阵键盘

51汇编——矩阵键盘这一小节打算写一个4X4的矩阵按键。

矩阵按键可以说是51单片机一个比较典型的输入型的外设。它可以让人与单片机更好的进行交互。

这一小节打算写一个4X4的矩阵按键。至于2X8 , 3X4 ,3X3 这些类型的其实他们的原理都是一样的。可以仿4X4的来写。

矩阵按键扫描原理

51汇编——矩阵键盘

这里使用的是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

仿真电路图: 

51汇编——矩阵键盘

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

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


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

度盘自取

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

———————————————————-结束—————————————————————–

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38822.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注