.486
DATA SEGMENT AT 0 USE16
PORTA EQU 203H A口
PORTB EQU 207H B口
PORTC EQU 20BH C口
CONTROL EQU 20FH 控制口
PORT2 EQU 360H 七段码位地址
ORG 4200H
DATA1 DB 6 DUP (?) 输入数据区
ORG 4210H
DATA2 DB 6 DUP (?) 显示缓宴伍冲区
DATAENDS
CODESEGMENT USE16
ASSUME CS:CODE,DS:DATA,ES:DATA
ORG 2000H
BEG: JMP START
TAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH
DB 67H,77H,7CH,39H,5EH,79H,71H 段码表
START: MOV AX,DATA 初始化
MOV DS,AX
MOV ES,AX
MOV AX,0
MOV SS,AX
MOV SP,1000H
LEA DX,CONTROL ...8255初始化
MOV AL,10001001B ...
OUT DX,AL ..清显示
MOV DX,PORTA....
MOV AL,00H ....
OUT DX,AL...
LP:
LEA DX,PORTC ...AL= 读数据
IN AL,DX ...
LEA SI,DATA1 ...存数据
MOV [SI],AL ...
CALL CZ 调用拿者拆字子程序
CALL DISP 调用显示子程序
JMP LP 循环取数显示
CZ PROC
PUSH CX
LEA SI,DATA1 SI= 拆字,取数
LEA DI,DATA2 DI= 显示缓冲区首消祥薯址
CZ0:
MOV BL,[SI]
AND BL,0F0H BL=
MOV CL,4
ROL BL,CL
MOV [DI],BL (DI)=
INC DI
MOV BL,[SI]
AND BL,0FH BL=
MOV [DI],BL
INC SI
INC DI
CMP SI, 08H....
JBE CZ0
POP CX
RET
CZ ENDP
DISP PROC 显示子程序
PUSH CX
PUSH DX
LEA BX,TAB
LEA SI,DATA2
MOV AH,0C1H
DISP1:
MOV DX,PORT2
MOV AL,AH
OUT DX,AL AL= , AL= 位输出
MOV DX,PORT1
MOV AL,[SI]
XLAT
OUT DX,AL AL=,AL= 段输出
MOV CX,0200H
LOOP $
INC SI
SAL AH,1
OR AH,0C0H
CMP AH,0C0H
JNZ DISP1
POP DX
POP CX
RET
DISP ENDP
CODE ENDS
END BEG
用8255扩展I/O口显示6位的显示码。希望对你有帮助,
正好我们做了这个实验你知道的,把数据段中的端口地址改为你的计算机可识别的8255A的端口地址
从键盘接收数字,在七段数码管上显示
data segment
ioport equ 2400h-0280h
io8255a equ ioport+288h
io8255b equ ioport+28bh
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
mesg1db 0dh,0ah,'Input a num (0--9h):',0dh,0ah,'$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dx,io8255b使8255的A口为输出方式
mov ax,10000000b80h,A组方式0,A口输出,B组方式0,B口输出,C口输出
out dx,al
sss:
mov dx,offset mesg1显示提示信息
mov ah,09h
int 21h
mov ah,01 从键盘接收字符
int 21h
cmp al,'0' 是否小于0
jb sss 若是则退出
cmp al,'9' 是否大于9
ja sss 若是则退出
and al,0fh 将所得字符的ASCII码减银运拆30H
mov bx,offset led bx为数码表的起锋枣始地址
xlat 求出相应的段码
mov dx,io8255a 从8255的A口输出
out dx,al
jmp sss转悄则SSS
exit:
mov ah,4ch 返回DOS
int 21h
code ends
end start
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)