📄 clock.lst
字号:
A51 MACRO ASSEMBLER CLOCK 04/20/2005 20:19:34 PAGE 1
MACRO ASSEMBLER A51 V1.05
OBJECT MODULE PLACED IN CLOCK.OBJ
ASSEMBLER INVOKED BY: C:\MANLEY\PMEDWIN\A51.EXE CLOCK.ASM DB
LOC OBJ LINE SOURCE
0000 1 ORG 0000H
0000 2100 2 AJMP MAIN
000B 3 ORG 000BH
000B 2131 4 AJMP TIME
5 ;以下是主程序
0100 6 ORG 0100H
0100 752000 7 MAIN: MOV 20H,#00H ;计时的0.05秒?秒?时和分单元清0
0103 752100 8 MOV 21H,#00H
0106 752200 9 MOV 22H,#00H
0109 752300 10 MOV 23H,#00H
010C 75B802 11 MOV IP,#02H ;中断优先级寄存器IP设置为定时中断0优先
010F D2AF 12 SETB EA ;开中断
0111 D2A9 13 SETB ET0 ;开定时/计数中断T0
0113 758901 14 MOV TMOD,#01H ;工作方式设置为定时器T0的方式1
0116 758AB0 15 MOV TL0,#0B0H
0119 758C3C 16 MOV TH0,#3CH
011C D28C 17 SETB TR0 ;启动定时器工作
011E 758140 18 MOV SP,#40H ;堆栈指针设为40H
0121 120173 19 NEXT: LCALL DISP ;调用显示子程序
0124 1201E7 20 LCALL KEY ;调按键判断子程序
0127 60F8 21 JZ NEXT ;无键按下转NEXT
0129 12020D 22 LCALL ANKEY ;有键按下转按键处理子程序
012C 80F3 23 SJMP NEXT ;按键处理完转NEXT
012E 00 24 NOP
012F 00 25 NOP
0130 00 26 NOP
27 ;以下是定时中断处理程序
0131 C0E0 28 TIME: PUSH ACC ;现场保护
0133 C0D0 29 PUSH PSW
0135 758AB4 30 MOV TL0,#0B4H ;重置初值
0138 758C3C 31 MOV TH0,#3CH
013B 0520 32 INC 20H ;计时处理,20H中存放50ms
013D E520 33 MOV A,20H
013F B4142A 34 CJNE A,#20,RETI1 ;A的值不等20,则转RETI1
0142 752000 35 MOV 20H,#00H ;1秒钟到,20H清0
0145 E521 36 MOV A,21H ;将21H(存放秒)的内容送A
0147 2401 37 ADD A,#01H ;将21H中的内容加1,即定时20次后秒加1
0149 D4 38 DA A ;十进制调整
014A F521 39 MOV 21H,A ;将调整后的A送21H
014C B4601D 40 CJNE A,#60H,RETI1 ;21H中的内容不等于60则转RET1
014F 752100 41 MOV 21H,#00H ;1分钟到,21H(秒)清0
0152 E522 42 MOV A,22H ;将22H(存放分)中的内容送A
0154 2401 43 ADD A,#01H ;将22H中的加1,即60秒后分加1
0156 D4 44 DA A ;十进制调整
0157 F522 45 MOV 22H,A ;将A的内容送22H
0159 B46010 46 CJNE A,#60H,RETI1 ;22H中的内容不等于60则转RET1
015C 752200 47 MOV 22H,#00H ;一小时时间到,22H(分)清0
015F E523 48 MOV A,23H ;将23H(存放小时)中的内容送A
0161 2401 49 ADD A,#01H ;23H中的内容加1
0163 D4 50 DA A ;十进制调整
0164 F523 51 MOV 23H,A ;将A的内容送23H
0166 B42403 52 CJNE A,#24H,RETI1 ;23H中的内容不等于24,转RET1
0169 752300 53 MOV 23H,#00H ;时间到达24小时,23H(小时)清0
016C D0D0 54 RETI1: POP PSW ;恢复现场
016E D0E0 55 POP ACC
0170 32 56 RETI ;中断返回
0171 00 57 NOP
0172 00 58 NOP
A51 MACRO ASSEMBLER CLOCK 04/20/2005 20:19:34 PAGE 2
59 ;以下是显示子程序
0173 532F10 60 DISP: ANL 2FH,#10H ;设置2FH的D4位为秒显示标志,以便处理秒后的小数点
0176 E521 61 MOV A,21H ;将21H(秒)送A
0178 540F 62 ANL A,#0FH ;取秒的低4位
017A 452F 63 ORL A,2FH ;查带小数点的字形码,处理秒后的小数点
017C F52F 64 MOV 2FH,A ;将秒的低4位送2FH
017E E521 65 MOV A,21H ;将21H(秒)送A
0180 54F0 66 ANL A,#0F0H ;取秒的高4位
0182 C4 67 SWAP A ;交换A的高4位和低4位
0183 F52E 68 MOV 2EH,A ;将秒的高4位送2EH
0185 532D10 69 ANL 2DH,#10H ;设置2DH的D4位为分显示标志,以便处理分后的小数点
0188 E522 70 MOV A,22H ;将22H(分)送A
018A 540F 71 ANL A,#0FH ;取分的低4位
018C 452D 72 ORL A,2DH ;查带小数点的字形码,处理分后的小数点
018E F52D 73 MOV 2DH,A ;将分的低4位送2DH
0190 E522 74 MOV A,22H ;将22H送A
0192 54F0 75 ANL A,#0F0H ;取分的高4位
0194 C4 76 SWAP A ;交换A的高4位和低4位
0195 F52C 77 MOV 2CH,A ;将分的高4位送2CH
0197 532B10 78 ANL 2BH,#10H ;设置2BH的D4小时显示标志,以便处理小时后的小数点
019A E523 79 MOV A,23H ;将23H(小时)送A
019C 540F 80 ANL A,#0FH ;取小时的低4位
019E 452B 81 ORL A,2BH ;查带小数点的字形码,处理小时后的小数点
01A0 F52B 82 MOV 2BH,A ;将小时的低4位送2BH
01A2 E523 83 MOV A,23H ;将23H(小时)的内容送A
01A4 54F0 84 ANL A,#0F0H ;取小时的高4位
01A6 C4 85 SWAP A ;交换A的高4位和低4位
01A7 F52A 86 MOV 2AH,A ;将小时的高4位送2AH
01A9 782F 87 MOV R0,#2FH ;显示偏移量
01AB 7B06 88 MOV R3,#06H ;将6个显示器循环显示
01AD 9001C5 89 MOV DPTR,#TABLE ;指向表首址
01B0 74FB 90 MOV A,#11111011B ;将1111 1011B送A,准备动态扫描
01B2 F5F0 91 LOOP1: MOV B,A ;将A存于B
01B4 F5A0 92 MOV P2,A ;将A送P2位选端
01B6 E6 93 MOV A,@R0 ;将R0指针地址送A
01B7 93 94 MOVC A,@A+DPTR ;查表
01B8 F580 95 MOV P0,A ;送显示
01BA 7A80 96 MOV R2,#80H ;延时
01BC DAFE 97 DJNZ R2,$
01BE 18 98 DEC R0 ;R0减1,以便进行小时?分和秒的切换
01BF E5F0 99 MOV A,B ;将暂存在B中的内容送A
01C1 23 100 RL A ;左移1位
01C2 DBEE 101 DJNZ R3,LOOP1 ;6个显示器循环显示
01C4 22 102 RET
01C5 C0F9A4B0 103 TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;不带小数点
01C9 999282F8
01CD 8090
01CF 00000000 104 DB 00H,00H,00H,00H,00H,00H
01D3 0000
105 ;若2FH?2DH?2BH的第4位为0,可以从以上16个不带小数点的字形码中查找
01D5 40792430 106 DB 40H,79H,24H,30H,19H,12H,2H,78H,00H,10H;带小数点
01D9 19120278
01DD 0010
01DF 00000000 107 DB 00H,00H,00H,00H,00H,00H
01E3 0000
108 ;若2FH?2DH?2BH的第4位为1,可以从以上16个带小数点的字形码中查找
01E5 00 109 NOP
01E6 00 110 NOP
111 ;按键判断子程序
01E7 75B0FF 112 KEY: MOV P3,#0FFH ;向P3口写1
01EA E5B0 113 MOV A,P3 ;读P3口的状态,按键按下时,相应的位变为低电平
01EC F4 114 CPL A ;将A取反,按键按下时,相应的位变为高电平
01ED 543C 115 ANL A,#00111100B ;将A与0011 1100B相与,以获取(P3.2~P3.5)是否有键被按下
01EF 6019 116 JZ RETX ;若A的值为0,说明无键按下,转RETX
01F1 120173 117 LCALL DISP ; ;若A的值为1,说明有键按下,调DISP显示子程序,延时
01F4 120173 118 LCALL DISP
A51 MACRO ASSEMBLER CLOCK 04/20/2005 20:19:34 PAGE 3
01F7 E5B0 119 MOV A,P3 ;再读P3口的状态
01F9 F4 120 CPL A
01FA 543C 121 ANL A, #00111100B
01FC 600C 122 JZ RETX ;若A的值为0,说明是键抖动
01FE FE 123 MOV R6,A ;若A的值为1,说明有键按下,将键值存入R6
01FF 120173 124 LOOP2: LCALL DISP ;调显示子程序
0202 E5B0 125 MOV A,P3 ;读P3口的状态
0204 F4 126 CPL A
0205 543C 127 ANL A,#00111100B
0207 70F6 128 JNZ LOOP2 ;若A的值不等于0,说明键未释放,转LOOP2,等待键释放
0209 EE 129 MOV A,R6 ;若A的值为0,说明键已释放,将R6中的键值送A
020A 22 130 RETX: RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -