1. 程式人生 > >8255實現數碼顯示管顯示兩位數字

8255實現數碼顯示管顯示兩位數字

本程式實現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 codeends

131     end start