1、实验目的:要求掌握8255芯片的工作原理、初始化、编程应用。
2、实验原理:通过端口A和端口B的输出实现数字在数码管的显示。
3、实验内容:修改或自己编写程序将自己学号分三次、间隔1秒显示出来。
提示:多个数码管同时显示可以通过设置余辉时间实现.
程序及解释如下:
Data segment
PortA equ 404H ;8255的PA口地址xz db 0f9h,92h,0c0h,92hqs db 0c0h,0b0h,0c0h,0b0hqd db 0f9h,90h
s db "Display a b c d at the same time. Press any key to exit...",0dh,0ah,"$" ;程序功能提示
Data ends
Code segmentassume cs:code,ds:data
Start:mov ax,data mov ds,ax mov dx,offset s ;显示提示mov ah,9int 21hmov dx, PortA+3mov al,80H out dx,al ;PA、PB口初始化为基本输出方式
L0: lea si,xz ;将xz地址给simov ah,08h ;置位选初值,从左边开始显示
L1: push ax ; 栈堆指令,数据进桟mov al,[si] ;显示数字mov dx,PortAout dx,almov al,ahmov dx,PortA+1 ;地址加一out dx,al ;到端口dxcall de; 延时inc si; 准备显示下一数字pop ax ;栈堆指令,将数据打出shr ah,1; 选择下一数码管cmp ah,0; 判断是否显示完"d"jnz l1shr ah,1 ; 选择下一数码管push ax ;栈堆指令,数据进桟mov dx,PortAout dx,almov al,ahmov dx,PortA+1out dx,alpop ax;栈堆指令,将数据打出call de
L2: lea si,qsmov ah,08h ;置位选初值,从左边开始显示
L3: push ax;栈堆指令,数据进桟mov al,[si] ;显示数字mov dx,PortAout dx,almov al,ahmov dx,PortA+1out dx,alcall de; 延时inc si; 准备显示下一数字pop ax;栈堆指令,将数据打出shr ah,1; 选择下一数码管cmp ah,0; 判断是否显示完"d"jnz l3shr ah,1push ax;栈堆指令,数据进桟mov dx,PortAout dx,almov al,ahmov dx,PortA+1out dx,alpop ax;栈堆指令,将数据打出call de
L4: lea si,qdmov ah,08h ;置位选初值,从左边开始显示
L5: push ax;栈堆指令,数据进桟mov al,[si] ;显示数字mov dx,PortAout dx,almov al,ahmov dx,PortA+1out dx,alcall de; 延时inc si; 准备显示下一数字pop ax;栈堆指令,将数据打出shr ah,1; 选择下一数码管cmp ah,2; 判断是否显示完"d"jnz l5shr ah,1shr ah,1push axmov dx,PortAout dx,almov al,ahmov dx,PortA+1out dx,alpop ax;栈堆指令,将数据打出call dejmp l0
Exit:mov ah,4ch ; 结束程序int 21h
de proc near ; 循环延时子程序push cxpush bxmov cx,0000H
d1: mov bx,9f00h
d2: dec bxjnz d2loop d1pop bx;栈堆指令,将数据打出pop cx;栈堆指令,将数据打出retde endpCode endsend Start