📄 clock.sdi
字号:
,,,HOUR EQU 30H ;小时计数单元
,,,MIN EQU 31H ;分钟计数单元
,,,SEC EQU 32H ;秒计数单元
,,,COUNT EQU 33H ;50ms计数单元
,,,BUF EQU 38H ;显示缓冲区首地址,共3字节
,,, ORG 0
0000,02 00 30,, LJMP START
,,, ORG 0BH
000B,02 00 A0,, LJMP TS
,,, ORG 30H
0030,75 81 60,START,START: MOV SP,#60H
0033,75 89 01,, MOV TMOD,#01H ;设T0为方式0
0036,75 8C 3C,, MOV TH0,#3CH
0039,75 8A B0,, MOV TL0,#0B0H ;50ms定时初值
003C,D2 B9,, SETB PT0 ;设T0为高级中断
003E,D2 A9,, SETB ET0 ;允许T0中断
0040,75 33 14,, MOV COUNT,#20 ;50ms计数单元赋初值
0043,75 30 00,, MOV HOUR,#0 ;小时计数单元清零
0046,75 31 00,, MOV MIN,#0 ;分钟计数单元清零
0049,75 32 00,, MOV SEC,#0 ;秒计数单元清零
004C,D2 8C,, SETB TR0 ;启动计数
004E,C2 AF,LOOP,LOOP: CLR EA ;关中断,避免读数时显示跳动
0050,85 30 38,, MOV BUF,HOUR ;存小时数到显示缓冲区
0053,85 31 39,, MOV BUF+1,MIN ;存分钟数到显示缓冲区
0056,85 32 3A,, MOV BUF+2,SEC ;存秒数到显示缓冲区
0059,D2 AF,, SETB EA ;开中断
005B,12 00 60,, LCALL DISP
005E,80 EE,, SJMP LOOP
,,,;显示程序
,,,;将BUF单元的2字节BCD码送数码管显示
0060,78 38,DISP,DISP: MOV R0,#BUF
0062,7A 03,, MOV R2,#3 ;共显示3个字节的BCD码
0064,7B 01,, MOV R3,#1 ;位码初值
0066,E6,DISP1,DISP1: MOV A,@R0
0067,54 0F,, ANL A,#0FH
0069,90 00 8F,, MOV DPTR,#DISP_TAB
006C,93,, MOVC A,@A+DPTR
006D,54 7F,, ANL A,#7FH ;点亮末尾小数点以便于区分时间
006F,F5 80,, MOV P0,A ;送段码
0071,EB,, MOV A,R3
0072,F5 A0,, MOV P2,A
0074,23,, RL A
0075,FB,, MOV R3,A
0076,12 00 E8,, LCALL DELAY ;延时1ms
0079,E6,, MOV A,@R0
007A,C4,, SWAP A
007B,54 0F,, ANL A,#0FH
007D,90 00 8F,, MOV DPTR,#DISP_TAB
0080,93,, MOVC A,@A+DPTR
0081,F5 80,, MOV P0,A ;送段码
0083,EB,, MOV A,R3
0084,F5 A0,, MOV P2,A
0086,23,, RL A
0087,FB,, MOV R3,A
0088,12 00 E8,, LCALL DELAY
008B,08,, INC R0
008C,DA D8,, DJNZ R2,DISP1
008E,22,, RET
008F,C0 F9 A4 B0,DISP_TAB,DISP_TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0D8H
0097,80 90 88 83,, DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH
,,,;时钟定时中断服务程序
00A0,C0 D0,TS,TS: PUSH PSW
00A2,C0 E0,, PUSH ACC
00A4,C0 83,, PUSH DPH
00A6,C0 82,, PUSH DPL
00A8,C2 8C,, CLR TR0
00AA,75 8C 3C,, MOV TH0,#3CH
00AD,75 8A B0,, MOV TL0,#0B0H
00B0,D2 8C,, SETB TR0
00B2,D5 33 2A,, DJNZ COUNT,EXIT
00B5,75 33 14,, MOV COUNT,#20
00B8,E5 32,, MOV A,SEC
00BA,24 01,, ADD A,#1 ;秒加1
00BC,D4,, DA A ;调整为BCD码
00BD,F5 32,, MOV SEC,A ;存秒
00BF,B4 60 1D,, CJNE A,#60H,EXIT ;不到60秒则退出
00C2,75 32 00,, MOV SEC,#0 ;秒单元清零
00C5,E5 31,, MOV A,MIN
00C7,24 01,, ADD A,#1 ;分加1
00C9,D4,, DA A ;调整为BCD码
00CA,F5 31,, MOV MIN,A ;存分
00CC,B4 60 10,, CJNE A,#60H,EXIT ;不到60分则退出
00CF,75 31 00,, MOV MIN,#0
00D2,E5 30,, MOV A,HOUR
00D4,24 01,, ADD A,#1 ;小时加1
00D6,D4,, DA A ;调整为BCD码
00D7,F5 30,, MOV HOUR,A ;存小时
00D9,B4 24 03,, CJNE A,#24H,EXIT ;不到24小时则退出
00DC,75 30 00,, MOV HOUR,#0
00DF,D0 82,EXIT,EXIT: POP DPL
00E1,D0 83,, POP DPH
00E3,D0 E0,, POP ACC
00E5,D0 D0,, POP PSW
00E7,32,, RETI
00E8,7E FA,DELAY,DELAY: MOV R6,#250
00EA,00,L1,L1: NOP
00EB,00,, NOP
00EC,DE FC,, DJNZ R6,L1
00EE,22,, RET
000E,,, END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -