本程序实现8255基本输入输出实验,即传递一个待显示参数,实现数码显示管显示该参数(即显示两位),其中8255ABC三口均为输出
实验步骤:
1.初始化8255
2.将要显示的数分割成数码管对应的数
3.利用余辉效应,让数码管显示对应得数字
注意:让数码管显示时,每次显示一位时,先关闭数码管显示,然后送段位,最后送位选通,由于人的大脑在2毫秒的情况下,未能反应,故看到数码显示管显示的是两位,其实在代码控制中是一位一位显示的
代码如下:
1 ;宏定义,8255口地址
2 ioy1 equ 0640H ;片选ioy1对应的端口始地址
3 my8255_a equ ioy1+00H*2 ;8255的A口地址
4 my8255_b equ ioy1+01H*2 ;8255的B口地址
5 my8255_c equ ioy1+02H*2 ;8255的C口地址
6 my8255_mode equ ioy1+03H*2 ;8255的制寄存器地址
7 data segment
8 array1 db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;数码显示管对应的0~9
9 times db 90 ;数码管要现实的数字
10 num1 db 0 ;用来保存十位数字
11 num2 db 0 ;用来保存个位数字
12 dataends
13 sstack segment stack
14 dw 32 dup(?)
15 sstack ends
16 code segment
17 assume cs:code,ds:data
18 start:
19 main:
20 mov ax,data
21 mov ds,ax
22 call init
23 call divide
24 call show
25 jmp main
26 ;*****************************************
27 ;初始化8255,向8255送控制字,abc均为输出口
28 init proc near
29 mov ax,80h
30 mov dx,my8255_mode
31 out dx,ax
32 ret
33 init endp
34 ;*****************************************
35
36 ;*****************************************
37 ;向bx和si中传入要显示的数值的地址
38 show proc near
39 ;显示管熄灭
40 mov dx,my8255_c
41 xor ax,ax
42 mov al,11b
43 out dx,al
44 ;显示十位
45 mov dx,my8255_b
46 xor ax,ax
47 lea bx,num1
48 mov al,[bx]
49 out dx,ax
50 mov dx,my8255_c
51 xor ax,ax
52 mov al,10b
53 out dx,al
54 ;延时处理
55 call delay
56 ;显示管熄灭
57 mov dx,my8255_c
58 mov al,11b
59 out dx,al
60 ;显示个位
61 mov dx,my8255_b
62 xor ax,ax
63 lea si,num2
64 mov al,[si]
65 out dx,ax
66 mov dx,my8255_c
67 mov al,01b
68 out dx,al
69 ret
70 show endp
71 ;*****************************************
72
73 ;*****************************************
74 ;将给定的要显示的十进制数转换为数码管对应的0~9
75 ;思路是用十进制数除以10,商保存在al中,余数保存在ah中
76 ;利用偏移量取出数码管对应的要显示的编码
77 divide proc near
78 ;保存信息
79 push di
80 push ax
81 push bx
82 push cx
83 push si
84 ;将数字初除以10 商保存在al中,余数保存在ah中
85 xor ax,ax
86 xor bx,bx
87 xor cx,cx
88 mov al,times[0]
89 mov bl,0ah
90 div bl
91 mov cx,ax
92 lea bx,array1
93 xor ax,ax
94 mov al,cl
95 ;获得实际待显示的数码管的地址
96 add bx,ax
97 lea si,num1
98 mov ax,[bx]
99 ;将该地址中的值赋值给num1,即十位
100 mov [si],al
101 lea bx,array1
102 xor ax,ax
103 mov al,ch
104 ;获得实际待显示的数码管的地址
105 add bx,ax
106 lea si,num2
107 mov ax,[bx]
108 ;将该地址中的值赋值给num2,即个位
109 mov [si],al
110 pop si
111 pop cx
112 pop bx
113 pop ax
114 pop di
115 ret
116 divide endp
117 ;***************************************
118
119 ;***************************************
120 ;延时处理
121 delay proc near
122 push cx
123 mov cx,10
124 mylelay:
125 loop mylelay
126 pop cx
127 ret
128 delay endp
129 ;****************************************
130 code ends
131 end start