?? digital clock (1).asm
字號:
LEDBUF EQU 30H ;顯示碼緩存區
HOUR EQU 40H
MINUTE EQU 41H
SECOND EQU 42H
C100us EQU 43H
TICK EQU 10000 ;置中斷次數
T100us EQU 256-100 ;置定時器初始值
LJMP START ;跳轉至主程序
ORG 000BH ;定時器0中斷入口
T0INT: PUSH PSW ;狀態保護
PUSH ACC
MOV A,C100us+1
JNZ GOON ;計數值是否為0
DEC C100us
GOON: DEC C100us+1
MOV A,C100us
ORL A,C100us+1
JNZ EXIT
MOV C100us,#HIGH(TICK) ;重置計數值
MOV C100us+1,#LOW(TICK)
INC SECOND ;秒值加一
MOV A,SECOND
CJNE A,#60,EXIT ;判斷秒值是否為60
MOV SECOND,#0 ;秒值為60,則清0
INC MINUTE ;分值加一
MOV A,MINUTE
CJNE A,#60,EXIT ;判斷分值是否為60
MOV MINUTE,#0 ;分值為60,則清0
INC HOUR ;小時值加一
MOV A,HOUR
CJNE A,#24,EXIT ;判斷小時值是否為24
MOV HOUR,#0 ;小時值為24,則清0
EXIT: POP ACC
POP PSW
RETI
DELAY: ;延時子程序
MOV R7,#0FFH
DELAYLOOP:
DJNZ R7,DELAYLOOP
DJNZ R6,DELAYLOOP
RET
LEDMAP: DB 3FH,06H,5BH,4FH ;八段數碼管顯示碼
DB 66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH
DB 39H,5EH,79H,71H
DISPLAYLED:
MOV R0,#LEDBUF
MOV R1,#6 ;共6個八段管
MOV R2,#01111111B ;位掃描碼初值
LOOP: MOV A,#0
MOV P0,A ;關所有八段管
MOV A,@R0
MOV P0,A
MOV A,R2
MOV P3,A ;顯示一位八段管
MOV R6,#01H
CALL DELAY
MOV A,R2 ;顯示下一位
RR A
MOV R2,A
INC R0
DJNZ R1,LOOP
RET
T0LED: MOV DPTR,#LEDMAP ;將字段碼轉換顯示碼
MOVC A,@A+DPTR
RET
START: MOV TMOD,#02H ;定時器工作方式2
MOV TH0,#T100us ;置定時器初始值
MOV TL0,#T100us
MOV IE,#10000010B ;EA=1,IT0=1
MOV HOUR,#0 ;顯示初始值
MOV MINUTE,#0
MOV SECOND,#0
MOV C100us,#HIGH(TICK)
MOV C100us+1,#LOW(TICK)
SETB TR0 ;啟動定時器0
MLOOP: MOV A,HOUR ;顯示小時值十位
MOV B,#10
DIV AB
CALL T0LED
MOV LEDBUF,A ;將十位值送顯示碼緩存區
MOV A,B ;顯示小時值個位
CALL T0LED
ORL A,#80H ;顯示小數點
MOV LEDBUF+1,A ;送顯示碼緩存區
MOV A,MINUTE ;顯示分鐘值十位
MOV B,#10
DIV AB
CALL T0LED
MOV LEDBUF+2,A ;將十位值送顯示碼緩存區
MOV A,B ;顯示分鐘個位值
CALL T0LED
ORL A,#80H ;顯示小數點
MOV LEDBUF+3,A ;送顯示碼緩存區
MOV A,SECOND
MOV B,#10 ;顯示秒十位值
DIV AB
CALL T0LED
MOV LEDBUF+4,A ;送顯示碼緩存區
MOV A,B
CALL T0LED
MOV LEDBUF+5,A
CALL DISPLAYLED ;調用顯示子程序
LJMP MLOOP
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -