8255和led数码管显示-微机原理(精)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
data segment
ioport equ 2400h
io8255a equ ioport+008h
io8255b equ ioport+00bh
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh mesg1 db 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 al,80h ;10000000B ,控制字 PA 以方式 0输出out dx,al
zby: mov dx,offset mesg1 ; 显示提示信息
mov ah,09h
int 21h
mov ah,01 ; 从键盘接收字符
int 21h
cmp al,'0' ; 是否小于 0
jl exit ; 如若小于 0,则跳转到 exit 退出程序
cmp al,'9' ; 是否大于 9
jg exit ; 如若大于 9,则跳转到 exit 退出程序
sub al,30h ; 将所得字符的 ASCII 码减 30H ,数字键 ascii 码同数值转换 mov bx,offset led ;bx 为数码表的起始地址
xlat ; 求出相应的段码
mov dx,io8255a ; 从 8255的 A 口输出
out dx,al
jmp zby ; 转 zby
exit: mov ah,4ch ; 返回 DOS
int 21h
code ends
end start
动态显示 :
data segment
ioport equ 0c800h-0280h
io8255a equ ioport+28ah
io8255b equ ioport+28bh
io8255c equ ioport+288h
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ; 段码buffer1 db 5,6 ; 存放要显示的个位和十位
bz dw ? ; 位码
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov dx,io8255b ; 将 8255设为 A 口输出
mov al,80h ;10000000B ,控制字 PA 以方式 0输出 out dx,al mov di,offset buffer1 ; 设 di 为显示缓冲区
loop2: mov bh,02
zby: mov byte ptr bz,bh
push di
dec di
add di, bz
mov bl,[di] ;bl 为要显示的数
pop di
mov al,0
mov dx,io8255a
out dx,al
mov bh,0
mov si,offset led ; 置 led 数码表偏移地址为 SI add si,bx ; 求出对应的 led 数码mov al,byte ptr [si]
mov dx,io8255c ; 自 8255A 的口输出
out dx,al
mov al,byte ptr bz ; 使相应的数码管亮
mov dx,io8255a
out dx,al
mov cx,3000
delay: loop delay ; 延时
mov bh,byte ptr bz
shr bh,1
jnz zby
mov dx,0ffh
mov ah,06
int 21h
je loop2 ; 有键按下则退出mov dx,io8255a
mov al,0 ; 关掉数码管显示out dx,al
mov ah,4ch ; 返回
int 21h
code ends
end start