一、实验目的
-
了解共阴数码管显示数字的原理(共阴:所有发光管阴极接一起形成公共端)
-
掌握六位共阴级数码管动态显示的控制方法
二、实验设备、材料
-
上位机:A86集成环境软件
-
下位机:微机接口设备80486DX
-
一个单根线,2根排线
-
实验箱如下图
三、实验内容
-
实验内容:在数码管上从左到右品示“123456”;用8255 的PA和PC 分别作为数码管的段码和位码;共阴7段数码管显示 16 进制数,字形的编码表如图3-1
-
接线图如下(O表示接线柱,红色线为要接的线,---表示省略的接线)PC0~PC5端口C低6位对应位码端(BIT)6位,PA0~PA7接数码管ABCDEFGH接线柱
-
abcedfgh高电平有效,接高电平发光;需要发光的地方置为1,不需要置为0
-
-
数码管实际上是由七个发光管组成8字形而构成的,加上小数点就是8个。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极的数码管。
-
PA0~PA7与数码管的A~H分别对应
-
通过分时轮流控制各个数码管的的选通端,就使各个数码管轮流受控显示,这就是动态驱动(6个数字依次显示,不同时显示,每次只显示一个数,但速度很快肉眼无法看出是一个接一个的显示;因为是依次显示故在编写代码时需要一直循环显示,才会保证数码管一直显示所需要的数)。位选通端需要接高电平才会显示字形,无位选通时每个显示均是一致的,通过改变位选通端的电平使得每一位显示不同的字形(若想让BIT6显示1:BIT6接高电平,其余接低电平)
-
左边第一位显示1
位码为:00100000b 段码为:00000110b=06h
左边第二位显示2
位码为:00010000b 段码为:01011011b=5Bh 剩下的以此类推,参照图3-1
-
关键程序分析
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh, 77h,7ch,39h,5eh,79h,71h,73h,Offh,00h ;段码0~FP全亮、灭
buffer1 db 01h,02h,03h,04h,05h,06h ;存放要显示的十位和个位
con db ? ;显示长度 -
流程图如下
-
代码如下
.model small
.486
data segment
ioport equ 0210h
io8255c equ ioport+2h
io8255k equ ioport+3h
io8255a equ ioport
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h,73h,0ffh,00h ;字形码库(包含你所需要的字形)
buffer1 db 01h,02h,03h,04h,05h,06h ;从led库中取你所需要的字形,第一位01h对应库中的06h
con db ? ;显示长度,显示几位
data ends
code segment
assume cs:code,ds:data
start: mov ax.data
mov ds,ax
mov dx.io8255k ;将8255设为A口C口输出(具体原因参考文章https://blog.csdn.net/m0_73938137/article/details/147047300?sharetype=blogdetail&shareId=147047300&sharerefer=APP&sharesource=m0_73938137&sharefrom=link)
mov al, 80h
out dx,al
II: CALL DISP ;调用子程序DISP
JMP II ;无条件跳转到II
mov ah,4ch ;返回
int 21h
DISP: mov al,06h
mov byte ptr con,al ;确定显示长度为06h
mov si,offset buffer1 ;取buffer1的偏移地址放到si寄存器中
mov ah,0dfh ;ah里放0dfh(11011111)
disp0: mov cx,0ffffh
mov bl,ds:[si] ;将si对应地址的内容放入bl中,即01h
mov bh,0h
push si ;si的值推到栈中
mov dx,io8255c ;将端口c的地址给dx
mov al,ah ;将ah即0dfh(11011111)给al
not al ;将al的值按位取反(00100000),表示BIT6(位码)
out dx,al ;输出led位码
mov dx,io8255a
mov si offset led ;取led数码表的偏移地址放入si寄存器中
add si, bx ;求出对应的led数码
mov al,byte ptr [si +BX] ;led+01h=06h放入al中
out dx,al ;输出段码06h
disp1: loop disp1
mov cx,00ffh
disp2: loop disp2 ;延时操作
ror ah,01h ;循环右移,将ah内容右移(11011111变为11101111)
pop si
inc si ;自增
mov al,byte ptr con
dec al ;al值减1,即con显示长度减1
mov byte ptr con, al
jnz disp0 ;显示长度不为0时跳转,让位码+1直到显示完即显示长度con为0
mov dx,io8255a
mov al,0
out dx,al
RET ;子程序结束
code ends
end start
四、实验步骤
-
实验箱接线如图
-
-
运行软件,根据实验内容的描述,编写实验程序,在已有实验程序的情况下选择:打开一,工程一数码管显示(文件目录).project(工程)
-
双击“数码管显示”(文件名),屏幕显示源文件内容。使用“生成”菜单中“构建或重新构建〞 选项,对实验程序进行汇编、连接。
-
选“启动调试”在状态栏晟示程序编译、连接、传送整个过程的相关信息,汇编、连接、传送无误的话光标移至源文件中的START(程序的开始位置)
-
在“调试”菜单中点击 “开始调试”。进入调试环境,根据自己的要求选择调试操观察调试过程中,指令执行情况,包括各寄存器及数据区内容的变化。我们选择“继续”操作,就是连续的运行程序此时在数码管上显“123456”
五、实验现象及结论分析
-
数码管上显示出“123456”