?? time.asm
字號:
;****************************************************************
;*程序功能:在單片機教學實驗儀的MCU#3上的8位數碼管上 *
;*顯示一個只有分和秒的時鐘,采用中斷方式 *
;****************************************************************
ORG 0000H
JMP MAIN
ORG 000BH ;T0的中斷入口地址
JMP T0_SER
DISBUF EQU 30H ;定義一個8個成員的數組(38H-30H)
POSIT EQU 38H ;定義一個變量,用來指示顯示時的數碼管的位選
SEC EQU 39H ;定義一個變量,用來存放時鐘的秒變量
MIN EQU 3AH ;定義一個變量,用來存放時鐘的分變量
COUNT EQU 3BH ;定義一個變量,用來對定時時間進行計數
PROTECT EQU 3CH ;用于保護中斷時,A中的內容
ORG 0030H
MAIN:
MOV SEC,#0
MOV MIN,#0
MOV DISBUF,#0 ;初始化顯示狀態
MOV DISBUF+1,#0
MOV DISBUF+2,#10H ;顯示 -
MOV DISBUF+3,#0
MOV DISBUF+4,#0
MOV DISBUF+5,#11H ;消隱
MOV DISBUF+6,#11H
MOV DISBUF+7,#11H
MOV TMOD,#01H ;用T0的方式1
MOV TH0,#80H ;賦初值 說明:本程序中的初值不準
MOV TL0,#00H
SETB ET0 ;T0中斷允許
SETB EA ;開總中斷
SETB TR0 ;啟動T0
LOOPM:
CALL DIGT_CH ;調用數字拆分程序,將SEC和MIN分成十位和個位,以便于顯示
CALL DISPLAY ;調用顯示程序
JMP LOOPM
;==================================
;8路數碼管驅動
DISPLAY:
MOV POSIT,#01H ;用于指示數碼管位選,初始化為第一個數碼管亮
MOV R1,#08H ;用于指示程序循環,8個數碼管每個送一次數后,本子程序結束
MOV DPTR,#DISCODE ;指向數碼管的碼表
MOV R0,#DISBUF ;指向顯示數組
DISLOOP: ;為方便起見,只將第一個數碼管的執行過程講明,其余依次類推
MOV A,@R0 ;當R0=#DISBUF時,通過間接尋址將DISBUF中的內容放入A中
MOVC A,@A+DPTR ;通過查表,A為地址偏移量,找出A中的數所對應的碼值(即段碼),還放在A中
MOV P0,A ;將A中的數送至P0端口,單此時并未送至數碼管
SETB P1.3 ;使能573鎖存器,此時,段碼才送至數碼管的段選端
CLR P1.3 ;關閉573鎖存器,此時,數據鎖存在數碼管的段選端
MOV P0,POSIT ;送位選至P0,以便指示哪一個數碼管亮
SETB P1.2 ;使能573鎖存器,此時,位選信號才送至數碼管的位選端,相應的數碼管亮
CLR P1.2 ;關閉573鎖存器,此時,數據鎖存在數碼管的位選端
CALL DELAY ;使相應數碼管亮一段時間
MOV P0,#00H ;送位選為00至P0口,即關閉所有的數碼管,一產生消隱作用,避免數碼管上產生重影現象
SETB P1.2
CLR P1.2
MOV A,POSIT ;當一個數碼管完成顯示后,對位選進行移位操作,以便為下一個數碼管
RL A ;的顯示作好準備,此時,位選指向下一個數碼管
MOV POSIT,A
INC R0 ;使R0的數自加一,指向下一個要顯示的數字,若上一次指向DISBUF,則
DJNZ R1,DISLOOP ;本次指向DISBUF+1,并受R1控制,完成8個數在數碼管上的顯示
RET ;所以,在使用此顯示程序時,只需將欲顯示的數字放入對應的DISBUF即可
;================================
DIGT_CH:
MOV A,SEC ;將秒拆分成十位和個位
MOV B,#10
DIV AB
MOV DISBUF,B ;送出去顯示
MOV DISBUF+1,A
MOV A,MIN
MOV B,#10
DIV AB
MOV DISBUF+3,B
MOV DISBUF+4,A
RET
;================================
T0_SER:
MOV TH0,#80H
MOV TL0,#00H
INC COUNT
MOV PROTECT,A ;對A進行保護
MOV A,COUNT
CJNE A,#20H,T0_SER_END ;等待一秒時間到
MOV COUNT,#0
INC SEC
MOV A,SEC
CJNE A,#60,T0_SER_END
MOV SEC,#0
INC MIN
MOV A,MIN
CJNE A,#60,T0_SER_END
MOV MIN,#0
T0_SER_END:
MOV PROTECT,A ;恢復現場
RETI
;================================
DELAY:
MOV R3,#0FH
LOOP: DJNZ R3,LOOP
NOP
RET
;===================================
;共陽數碼管碼表
DISCODE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
; 0 1 2 3 4 5 6 7 8 9
DB 88H,83H,0C6H,0A1H,86H,08EH,0BFH,0FFH,0F7H
; A B C D E F - _
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -