实验2:8255七段数码管静动态显示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微机实验报告书
学号:姓名:班级:
同组名单:实验日期: 2012.12.21
实验题目:七段数码管的静态显示
实验目标:掌握数码管显示数字的原理
(功能:键盘输入一位十进制数字(0~9),用七段数码管显示。)
解题思路:
1.静态显示:按图 10(a)连接好电路,将8255的A口PA0-PA6分别与七段
数码管的断码驱动输入端a-g项链,位码驱动输入端S1接+5V,S0、dp
接地。编程从键盘输入一位十进制数字,在七段数码管上显示出来。
2.动态显示:按图10(b)连接好电路,七段数码管段码连接不变,位码驱
动输入端S1,S0接8255C口的PC1,PC0。编程在两个数码管上显示“56”。程序框图:静态显示见图11(a),动态显示见图11(b)。
关键问题分析(静态显示):
1、按键判断和程序结束判断
按键来说,由于程序中必须输入数字,所以没有必要对是否按键进行判断,只需要判断按键是否在0-9之间即可。用以下程序即可:
cmp al,'0'
jl exit ; jl,条件转移指令,即在小于时转移
cmp al,'9'
jg exit ;jg, 条件转移指令,即在大于时转移程序中还要用到“cmp”即比较指令,用来比较输入数与0、9的大小关系。程序结束:如若输入的数字小于0或者大于9,必须直接跳出程序,即结束指令必须单独占用一个程序段,这样,程序顺序执行完毕也可以顺利返回DOS。
2、七段码显示。
实验指导书中给出了七段码的字型代码。这样一来,七段码的显示只需要用换码指令“XLAT”便可以轻松实现。前提是必须将七段码字型编成数码表以字符串的形式写进程序中。
3、数字键ASCII码与数值间的转换。
因为0的ASCII码为30H,所以数字键ASCII码与数值间的转换时只需减去30H即可,可用下列语句实现:
sub al,30h
程序清单:
静态显示:
data segment
ioport equ 0c800h-0280h
io8255a equ ioport+288h
io8255b equ ioport+28bh
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 ;延时