8段數碼管顯示.兩位數碼管顯示00--99依次循環(動態掃描方式).p1做LED顯示數據輸出口.p3.2;p3.3分別控制數碼管個位數和十位數顯示.
8段數碼管從內部接線上分共陽和共陰兩種。在電路設計時應根據情況決定采用共陽或共陰,其基本原則是:若單片機IO口直接驅動數碼管個段,最好采用共陽數碼管,因為51單片機IO口輸出高電平時輸出的電流很小,數碼管不會太亮;若數碼管是通過驅動芯片與單片機相連的,就要看驅動芯片對數碼管極性的要求啦。下面的實驗采用共陽數碼管。
;======================================= ;constant define ;常數定義 csp equ 60h ;堆棧開始使用的位置. ;======================================= ;variable define ;變量定義 vadigit equ 30h ;數碼管個位數存放內存位置 vbdigit equ 31h ;數碼管十位數存放內存位置 vcnt1 equ 32h ;計數器數值存放內存位置
;======================================= ;Func: 程序開始. ;======================================= org 0000h ajmp main
org 0030h ;到0030h處避開00-30h的敏感地址 ;======================================= ;Func: 程序初始化. ;======================================= main: ;初始化特殊寄存器及變量 mov sp,#csp ;指定堆棧開始使用的位置. star: mov vcnt1,#0 ;初始化計數器,從0開始 lop1: acall display ;調用顯示子程序 inc vcnt1 ;對計數器加1 mov a,vcnt1 cjne a,#100,lop1 ;判斷計數器是否滿100? mov vcnt1,#0 ;滿100就清零重新開始 ljmp lop1 ;不滿就循環執行
;======================================= ;Func: 8.字型LED顯示子程序 ;Input: vcnt1 ;======================================= display: mov a,vcnt1 ;將temp中的十六進制數轉換成10進制 mov b,#10 ;10進制/10=10進制 div ab ;a除以b,商在a,余數在b. mov vbdigit,a ;十位在a mov vadigit,b ;個位在b mov dptr,#digittab ;指定查表起始地址 mov r0,#4 dpl1: mov r1,#250 ; dplop: mov a,vadigit ;取個位數 movc a,@a+dptr ;查個位數的7段代碼 mov p1,a ;送出個位的7段代碼 clr p3.2 ;開個位顯示 acall delayus ;顯示162微秒 setb p3.2 ;關閉個位顯示,防止鬼影 mov a,vbdigit ;取十位數 movc a,@a+dptr ;查十位數的7段代碼 mov p1,a ;送出十位的7段代碼 clr p3.3 ;開十位顯示 acall delayus ;顯示162微秒 setb p3.3 ;關閉十位顯示,防止鬼影 djnz r1,dplop ;循環執行250次 djnz r0,dpl1 ;循環執行250X4=1000次 ret
;======================================= ;Func: 162us延時子程序 ;======================================= delayus: mov r7,#80 ;///2+2X80=162微秒,延時按11.0592MHZ計算 djnz r7,$ ret
org 0600h ;======================================= digittab: ;實驗板上的7段數碼管0~9數字的共陽顯示代碼 db 0c0h;0 db 0f9h;1 db 0a4h;2 db 0b0h;3 db 099h;4 db 092h;5 db 082h;6 db 0f8h;7 db 080h;8 db 090h;9 end |