一 实验目的
1)掌握8255方式0的工作原理、初始化设置方法。
2)掌握I/O接口地址译码电路的工作原理及端口地址的计算方法。
3)掌握I/O端口的读写操作及编程方法。
4)掌握数码管显示数字的原理、数码管显示段控及位控的概念及编程方法。
5)掌握微机接口集成开发环境HQFC软件的使用方法。
二 实验原理图
三 代码实现
;参考代码
;七段数码管显示,8255控制寄存器端口地址28BH A口地址288H,C口地址28AH
;**************************************
;* LED数码管实验 *
;* 动态循环显示“00-99” *
;**************************************
data segment
io8255c equ 28ah ;C口地址
io8255cs equ 28bh ;控制寄存器端口地址
io8255a equ 288h ;A口地址
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;在数据段中存放0到9的字形码: 段码
buffer1 db 0, 0 ;存放要显示的个位和十位
bz dw ? ;位码
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov dx,io8255cs ;将8255设为A口输出
mov al,80h ;A口0方式输出
out dx,al
mov di,offset buffer1 ;设di为显示缓冲区
;loop1: mov cx,0300h ;循环次数
loop1: mov cx,030h ;循环次数,延时
loop2: mov bh,02 ;送位码02到bh
lll: mov byte ptr bz,bh ;按字节把位码送到bz中
push di ;di进栈
dec di ;di自减1,指向下一位数字的地址
add di, bz ;所要显示的数传给di
mov bl,[di] ;bl为要显示的数
pop di ;di出栈
mov bh,0 ;bh清零
mov si,offset led ;置led数码表偏移地址为SI
add si,bx ;求出对应的led数码
mov al,byte ptr [si] ;把输出的数的地址传给al
mov dx,io8255a ;自8255A的A口输出
out dx,al
mov al,byte ptr bz ;位码选择相应的数码管亮
mov dx,io8255c ;将8255设为C口输出
out dx,al
push cx ;cx进栈
mov cx,100 ;把100传给CX
delay: loop delay ;延时
pop cx ;CX出栈
mov al,00h ;al清零
out dx,al
mov bh,byte ptr bz ;按位码送到bh中
shr bh,1 ;右移一位,显示十位的数码管数据
jnz lll ;跳到lll显示
loop loop2 ;循环显示另一位
mov ax,word ptr [di] ;把最后一个字传给ax
cmp ah,09 ;将该字的高位与9比较
jnz set ;不等则跳转到set
cmp al,09 ;将该字的低位与9比较
jnz set ;不等则跳转到set
mov ax,0000 ;ax置零
mov [di],al ;al为个位
mov [di+1],ah ;ah为十位
jmp loop1
set: mov ah,01 ;1号功能调用,键盘键入
int 16h
jne exit ;有键按下则转exit
mov ax,word ptr [di] ;没有键入就把个位字传给ax
inc al ;al自增1
aaa ;将ax拆分,分为个位与十位,BCD码十进制调整
mov [di],al ;al为个位
mov [di+1],ah ;ah中为十位
jmp loop1 ;循环loop1,继续循环显示
exit: mov dx,io8255c ;C口位选地址
mov al,0 ;关掉数码管显示
out dx,al
mov ah,4ch ;返回
int 21h
code ends
end start
该程序是先设置好输出方式,输入一个数是数码管亮起来,然后设置好延时,在把显示的数据从00开始,送段码到A口,送位码到C口,将显示数据与9比较,拆分所需要显示的数的十位与个位,在相应的位上显示出来,通过移位,依次显示数字,最后循环显示00-99,直到键盘有输入停止返回,程序结束。
如:显示89,90,99的过程:首先,di调整到十位数8传给bl, di自减1,再加bz,依然指向十位数,置led数码表偏移地址为SI,SI与bl相加得到对应8的字形码偏移地址,把该地址传给al,然后A口输出,然后位码bz=02在C口输出到S1,S0,选择十位数码管S1显示8,延时,把位码01传给bh,bh右移一位成01,跳到lll。位码bh=01H传给bz,di自减等调整到个位数9,置led数码表偏移地址为SI,SI与bl相加得到对应9的字形码偏移地址,把该地址传给al,然后A口输出,然后位码bz=01H在C口输出到S1,S0,选择个位数码管S0显示9,延时,完成89的显示,十位个位与9比较,不是99,跳到set,判断有误按键按下,没有就把个位数传个ax,个位加1,此时,9+1=10,al=a,经aaa调整,al=0(个位),ah=9(十位),再把个位al传给[di],十位ah传给[di+1],回到loop1,延时,然后同上述过程显示十位数9,在显示个位数0,即90;同上述过程显示完99后,判断十位数,个位数是否为9,结果都是,然后ax置00,然后把个位,十位都置0,循环loop1,继续从00开始显示,没有按键按下,一直循环00-99.
四 流程图