《微机与接口技术实验》
补充实验报告
2022 – 2023 年第 1 学期
实验时段及分班:
组 号:
姓 名:
学 号:
班 级:
补充实验名称
进制转换
实验内容
请详细阐述自行设计的功能
特点。
(1)用自制的 4x4 键盘输入数字,并可以在数码管上显
示,输入的是 10 进制数,范围为 0 到 1000。
(2)设计了四个开关,分别用于实现清零、转 8 进制、转
10 进制、转 16 进制功能,并且可直接进行下一次的进制转
换。
(3)转码结果可以直接显示在数码管上
(4)清零后可重新键入数字。
汇编源代码
(关键代码和子程序必须有说明)
IOY0 EQU 30H
MY8255_A EQU IOY0+00H*2
MY8255_B EQU IOY0+01H*2
MY8255_C EQU IOY0+02H*2
MY8255_CON EQU IOY0+03H*2
SSTACK SEGMENT STACK
DW 16 DUP(?)
SSTACK ENDS
DATA SEGMENT
DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;对应按键编号的显示码
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV SI,3000H
MOV AL,00H
MOV [SI],AL ;缓冲区内容清零
MOV [SI+1],AL
MOV [SI+2],AL
MOV [SI+3],AL
MOV [SI+4],AL
MOV [SI+4],10 ;进制标志位,8 表示 8 进制,10 表示 10 进制,16 表示 16 进
制数。设置输入为 10 进制数
MOV DI,3000H ;设置键盘缓冲区的初始指针
MOV DX,MY8255_CON ;8255 初始化
MOV AL,81H
OUT DX,AL
BEGIN:
CALL DIS ;调用显示子程序
CALL CLEAR ;清屏
CALL CCSCAN ;扫描
JNZ INK1
JNZ BEGIN
INK1:
CALL DIS
CALL DALLY
CALL DALLY
CALL CLEAR
CALL CCSCAN
JNZ INK2 ;有键按下,转到 INK2
MOV DX,MY8255_C
IN AL,DX ;读取 C 口
AND AL,0F0H ;取高 4 位,对应设置的 4 个开关
TURN16:
CMP AL,80H ;第一个开关按下,转为 16 进制
JNZ TURN10 ;否则,判断第二个开关
CALL TO16 ;调用转 16 进制子程序
JMP BEGIN
TURN10:
CMP AL,40H ;第二个开关按下,转 10 进制
JNZ TURN8 ;否则,判断第三个开关
CALL TO10 ;调用转 10 进制子程序
JMP BEGIN
TURN8:
CMP AL,20H ;第三个开关按下,转 8 进制
JNZ TURN0 ;否则,判断第四个开关
CALL TO8 ;调用转 8 进制子程序
JMP BEGIN
TURN0:
CMP AL,10H ;第三个开关按下,清零
JNZ BEGIN ;否则,转到 begin
CALL TO0 ;调用清零子程序
JMP BEGIN
;确定按下键的位置
INK2:
MOV CH,0FEH
MOV CL,00H
COLUM:
MOV AL,CH
MOV DX,MY8255_A
OUT DX,AL
MOV DX,MY8255_C
IN AL,DX
L1:
TEST AL,01H ;是第一行?
JNZ L2 ;不是,扫描第二行
MOV AL,00H
JMP KCODE
L2:
TEST AL,02H ;是第二行?
JNZ L3 ;不是,扫描第三行
MOV AL,04H
JMP KCODE
L3:
TEST AL,04H ;是第三行?
JNZ L4 ;不是,扫描第四行
MOV AL,08H
JMP KCODE
L4:
TEST AL,08H ;是第四行?
JNZ NEXT ;不是,则扫描下一列
MOV AL,0CH
KCODE:
ADD AL,CL ;键值
CALL PUTBUF ;存键值
PUSH AX
KON:
CALL DIS
CALL CLEAR
CALL CCSCAN
JNZ KON
POP AX
NEXT:
INC CL
MOV AL,CH
TEST AL,08H ;4 列扫描完,则返回
JZ KERR
ROL AL,1 ;否则,下一列
MOV CH,AL
JMP COLUM
KERR:
JMP BEGIN