实验五 键盘按键与数码管显示(汇编与微机原理)

键盘按键与数码管显示

实验目的:

熟悉星研集成开发环境,掌握微机接口程序编写调试的基本方法。

掌握矩阵式键盘的工作原理及识别键盘按键的方法。

掌握8段数码管显示数字或字符的工作原理和它的使用方法。

掌握用8255扫描键盘及用8255刷新数码管显示的方法。

实验:

在(2行*8列)小键盘上任意按下某个按键,该键的键值将同时显示在8个数码管上。按键松开时显示上一次的按键值。

(2 行*8 列)小键盘:

实验箱上2行*8列小键盘上当某个按键被按下时,该键所在行的行线值为0、所在列的列线值也为0。根据这个特点结合上述原理图采用"列扫描法"可以识别出当前被按下的按键。

8 个数码管:

实验箱上8个8段数码管。每个数码管有8个笔段,按逆时针方向依次称为a段、b段、c段、d段、e段、f段、g段、dp段,8个段接收来自外部的一个8位二进制数(D7---D0),并且笔段a 对应数据位D0........笔段dp 对应数据位D7 ,由于数码管是共阳的,当段码端接收低电平时相应的笔段就会点亮,段码端接收的数据决定了数码管显示的具体内容。(例:要显示数字0,则笔段a、b、c、d、e、f 都必须点亮,笔段g、h不应该点亮,8个段接收的值应该是11000000,数据D0--D7就应该是11000000(0C0H),让段码端接收11000000它就会显示0)。

数码管的位码控制GND端,当它接收低电平时该数码管会被选中有效工作:即这时只要段码端有有效的数据数码管就会显示数据,当它接收高电平时数码管不工作,这时即使段码端有有效数据数码管也不会显示任何数据。

8255 各端口的分工:

8255的A口工作在方式0输出状态控制数码管的段码;B端口工作在方式0输出状态控制数码管的位码,并且同时控制键盘列线的扫描;C端口工作在方式0输入状态,其中的PC0、PC1控制键盘的第一、第二行行值的读入。

实验代码:

.MODEL	TINY		
PA_8255		EQU	0270H           
PB_8255		EQU	0271H
PC_8255		EQU	0272H
CTRL_8255	EQU	0273H
.STACK	100
.DATA    
buffer          DB      ?               
SEG_TAB		DB	0C0H, 0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H    
		DB	080H, 90H, 88H, 83H,  0C6H,0A1H,86H,8EH,0FFH 

.CODE
START:  	MOV     AX,@DATA
        	MOV     DS,AX
        	MOV	ES,AX
        	NOP		
		MOV	DX,CTRL_8255	;8255初始化
		MOV	AL,89H
		OUT	DX,AL		
        	LEA	SI,buffer
		MOV	AL,10H          ;默认数码管不显示
		MOV     [SI],AL
		
		CALL	DIR             ;调用显示子程序

MAIN2:		LEA	DI,buffer       
		CALL	Getkey          ;得到按键在SEG_TAB中的值放入AL
		STOSB                   ;将AL赋值给DI指向的地址
		CALL	DIR            		
		JMP	MAIN2

DIR		PROC	NEAR            
		PUSH	AX
		PUSH	BX
		PUSH	DX
		LEA	SI,buffer	;置显示缓冲器初值	
		MOV	AL,[SI]
		LEA	BX,SEG_TAB				
		XLAT			;查表取显示数据->AL
		MOV	DX,PA_8255
		OUT	DX,AL		;AL段数据->8255 PA口		
		MOV     DX,PB_8255
		MOV     AL,0		;位码控制GND端低电平有效, 显示8位数据管
		OUT     DX,AL           
		CALL	DL1ms				
		POP	DX
		POP	BX
		POP	AX
		RET
DIR		ENDP

DL1ms		PROC	NEAR		
		PUSH	CX
		MOV	CX,500
		LOOP	$
		POP	CX
		RET
DL1ms		ENDP

GETKEY		PROC	NEAR	       
		PUSH	BX
		PUSH	DX
LK:		CALL	AllKey		;调用判有无闭合键子程序		
		JNE	LK1             

		CALL	DIR		;调用显示子程序
		JMP	LK             
               ;补充程序完成列扫描,得到按键在SEG_TAB中的值放入AL
LK1:		MOV BL, 0FEH	;0FEH-->BL 第0列开始扫描,用BL保存列线扫描口数值,从PB0开始
		MOV BH, 0	;0-->BH   用BH保存列线值,从第0列开始
LK2:		MOV DX, PB_8255	;写B口位码控制端  
		MOV AL, BL	;
		OUT DX, AL	;将BL写入B口列线控制端

		MOV DX, PC_8255	;读C口
		IN  AL, DX	;
		TEST AL, 1	;PC0不等于0转向LONE继续判断PC1
                JNZ  LONE	;
		MOV AL, 0	;0行有键闭合,0-〉AL  PC0等于0表示0行有键闭合,用BH存放按键值
		JMP	LKP             
			
LONE:		TEST AL, 2          
		JNZ NEXT	;PC1不等于0则转向NEXT列计算器+1
		MOV AL, 08	;1行有键闭合,08H-->AL	        

LKP:		ADD BH, AL	;用BH保存键值

LK3:		CALL	AllKey         
		JNE	LK3     ;判断释放否

		MOV AL, BH	;BH键号->AL		
		JMP EXIT

NEXT:		INC BH		;列计数器加1		
		TEST BL, 80H	;
		JZ EXIT		;判是否已扫到最后一列则转向KEND

		ROL BL, 1	;将BL循环左移一位
		JMP	LK2
EXIT:		POP	DX
		POP	BX
		RET                     
GETKEY		ENDP


AllKey		PROC	NEAR            ;判断键盘是否有按键闭合        
		MOV	DX,PB_8255                                                
		XOR	AL,AL                                      
		OUT	DX,AL		;全"0"->扫描口,列线控制端低电平有效
		MOV     DX,PC_8255      ;读C口数据                                     
		IN	AL,DX		;读键状态		 
		AND	AL,03H		;取低二位	
		CMP     AL,3            ;取C口低二位和00000011b比较
		RET
AllKey		ENDP
				
END	START
相关推荐
奋斗的小花生1 小时前
c++ 多态性
开发语言·c++
魔道不误砍柴功1 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
闲晨1 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
老猿讲编程1 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
Chrikk2 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*2 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue2 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man2 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
萧鼎4 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
学地理的小胖砸4 小时前
【一些关于Python的信息和帮助】
开发语言·python