📄 sz02.lst
字号:
A51 MACRO ASSEMBLER SZ02 01/04/2007 21:16:37 PAGE 1
MACRO ASSEMBLER A51 V7.07
OBJECT MODULE PLACED IN sz02.OBJ
ASSEMBLER INVOKED BY: C:\Keil 7.06\C51\BIN\A51.EXE sz02.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;----------------------------------------------------------
2 ;文件名称:SZ02.ASM
3 ;程序功能:带定时闹铃时钟
4 ;----------------------------------------------------------
5 ;--------――― 时钟程序部分 ---――――――――
6 ;----- ――― 程序初始化 ――――――――――
7 ; 定义存放计时单元地址
8 ;....................
0000 9 ALB EQU 20H.0 ;闹铃设置标志
10 ;....................
0030 11 BUF EQU 30H ;30~33H 连续4字节存放显示器数据
0034 12 HOUR EQU 34H ;存放小时变量
0035 13 MIN EQU 35H ;存放分钟变量
0036 14 SEC EQU 36H ;存放秒钟变量
0037 15 DEDA EQU 37H ;存放5 ms 计数值
16 ;....................
0038 17 HH EQU 38H ;闹铃设置小时变量
0039 18 MM EQU 39H ;闹铃设置分钟变量
19 ;....................
20 ;按键输入引脚定义
00A4 21 K1 EQU P2.4 ;按键1引脚定义
00A5 22 K2 EQU P2.5 ;按键2引脚定义
00A6 23 K3 EQU P2.6 ;按键3引脚定义
00A7 24 K4 EQU P2.7 ;按键4引脚定义
25
26 ;压电喇叭和指示灯引脚定义
00B4 27 SPK EQU P3.4 ;压电喇叭控制信号
0090 28 WLED EQU P1.0 ;工作指示灯引脚定义
29
30 ;程序开始执行地址
0000 31 ORG 0H ;程序代码由地址0开始执行
0000 800B 32 JMP MAIN
000B 33 ORG 0BH ;定时器 0 中断地址设置
000B 8052 34 JMP TO_SRV
35
36 ;--------- 主 程 序 --------――
37
000D 38 MAIN: ;开始
39 ;...................
000D C200 40 CLR ALB ;清除闹铃标志
41 ;...................
000F 3134 42 ACALL BZ ;压电喇叭连续两次鸣响一声
0011 3134 43 ACALL BZ
0013 3141 44 ACALL LED_BL ;LED 闪动,表示程序开始执行
0015 3127 45 ACALL INIT ;初始变化量
0017 1150 46 ACALL INIT_TIMER ;设置定时器
47
48 ;加载显示器初值数据
0019 74C0 49 MOV A, #0C0H
001B F580 50 MOV P0, A
51
52 ;无穷循环
001D 53 LOOP: ;无穷循环
001D 119A 54 ACALL CONV ;转换 时时 分分 数据
55 ;....................
001F 31BB 56 ACALL TIME_PRO ;检查闹铃时间
57 ;....................
0021 11CD 58 ACALL DISP ;扫描显示
A51 MACRO ASSEMBLER SZ02 01/04/2007 21:16:37 PAGE 2
59
0023 20A406 60 JB K1, M1 ;未按下K1键则继续扫描
0026 3141 61 ACALL LED_BL ;LED闪动
0028 11E7 62 ACALL SET_TIME ;设置目前时间
002A 80F1 63 JMP LOOP ;继续循环执行
64
65 ;设置闹铃时间
002C 20A506 66 M1:JB K2,M2 ;未按下K2键则继续扫描
67 ;.....................
002F 3141 68 ACALL LED_BL
0031 315D 69 ACALL SET_ATIME ;设置闹铃时间
70 ;.....................
0033 80E8 71 JMP LOOP ;继续循环执行
72
0035 20A602 73 M2:JB K3, M3 ;未按下K3键则继续扫描
0038 80E3 74 JMP LOOP ;继续循环执行
75
003A 20A711 76 M3:JB K4,M4 ;未按下K4键则继续扫描
77 ;...................
003D B200 78 CPL ALB
003F 300008 79 JNB ALB,M31
80
81 ;闹铃启动连续3次发出响声
0042 3134 82 ACALL BZ
0044 3134 83 ACALL BZ
0046 3134 84 ACALL BZ
85 ;...................
0048 80D3 86 JMP LOOP ;继续循环执行
87 ;....................
004A 88 M31:
004A 3134 89 ACALL BZ ;闹铃停止,发出一声响
004C 80CF 90 JMP LOOP ;继续循环执行
91 ;...................
004E 92 M4:
004E 80CD 93 JMP LOOP ;继续循环执行
94
95 ;----- 实现走时功能的子程序 ------――
96
97 ;使用定时器0模式0计时
0050 98 INIT_TIMER: ;初始化定时器,使用定时器0模式1计时
0050 758900 99 MOV TMOD,#00000000B ;设置定时器0工作模式为0
0053 75A882 100 MOV IE, #10000010B ;启用定时器0中断产生
0056 758A1C 101 MOV TL0, #(8192-4900)MOD 32 ;加载低字节
0059 758C66 102 MOV TH0, #(8192-4900)/32 ;加载高字节
005C D28C 103 SETB TR0 ;启动定时器0开始计时
005E 22 104 RET
105 ;-----------―――
106 ;中断服务程序
005F 107 TO_SRV: ;定时器0计时中断程序每隔5ms中断一次
005F C0E0 108 PUSH ACC ;将累加器放入堆栈
0061 758A1C 109 MOV TL0, #(8192-4900)MOD 32 ;加载低字节
0064 758C66 110 MOV TH0, #(8192-4900)/32 ;加载高字节
0067 0537 111 INC DEDA ;5ms计数值加1
112 ;秒输出
0069 E537 113 MOV A, DEDA
006B B4C829 114 CJNE A,#200,TT1 ;是否1s到了
006E 753700 115 MOV DEDA, #0 ;计数值清除为0
0071 B290 116 CPL WLED ;LED灯亮灭变换
0073 0536 117 INC SEC ;秒计数加1
0075 E536 118 MOV A, SEC
0077 B43C1D 119 CJNE A, #60, TT1;是否1min到了
120 ;分输出
007A 0535 121 INC MIN ;分计数加1
007C 753600 122 MOV SEC, #0 ;秒计数清除为0
007F E535 123 MOV A, MIN
0081 B43C13 124 CJNE A, #60, TT1 ;是否1h到了
A51 MACRO ASSEMBLER SZ02 01/04/2007 21:16:37 PAGE 3
125 ;时输出
0084 0534 126 INC HOUR ;小时计数加1
0086 753500 127 MOV MIN, #0 ;分计数清除为0
0089 E534 128 MOV A, HOUR
008B B41809 129 CJNE A,#24, TT1 ;是否24h到了
008E 753600 130 MOV SEC, #0 ;秒钟变量清除为0
0091 753500 131 MOV MIN, #0 ;分钟变量清除为0
0094 753400 132 MOV HOUR, #0 ;小时变量清除为0
0097 133 TT1:
0097 D0E0 134 POP ACC ;将累加器由堆栈取出
0099 32 135 RETI
136
137 ;----―― 实现显示功能的子程序 ---――――
138
139 ;转换 时时:分分 数据
009A 140 CONV:
141 ;转换小时数据
009A E534 142 MOV A, HOUR
009C 75F00A 143 MOV B, #10
009F 84 144 DIV AB
00A0 9000BD 145 MOV DPTR,#TABLE ;查表转换
00A3 93 146 MOVC A, @A+DPTR
00A4 F530 147 MOV BUF, A
00A6 E5F0 148 MOV A, B
00A8 93 149 MOVC A, @A+DPTR
00A9 F531 150 MOV BUF+1, A
151 ;转换分钟数据
00AB E535 152 MOV A, MIN
00AD 75F00A 153 MOV B, #10
00B0 84 154 DIV AB
00B1 9000BD 155 MOV DPTR,#TABLE ;查表转换
00B4 93 156 MOVC A, @A+DPTR
00B5 F532 157 MOV BUF+2, A
00B7 E5F0 158 MOV A, B
00B9 93 159 MOVC A, @A+DPTR
00BA F533 160 MOV BUF+3, A
00BC 22 161 RET
162
163 ;字型数据编码表
00BD 164 TABLE:
00BD C0F9A4B0 165 DB 0C0H,0F9H,0A4H,0B0H
00C1 999282F8 166 DB 99H,92H,82H,0F8H
00C5 80908883 167 DB 80H,90H,88H,83H
00C9 C6A1868E 168 DB 0C6H,0A1H,86H,8EH
169
170 ;---------――――
171 ;扫描显示
00CD 172 DISP:
00CD 7830 173 MOV R0, #BUF ;指向显示器显示缓冲区起始地址
00CF 7A04 174 MOV R2, #4 ;循环执行4次
00D1 75E0F7 175 MOV ACC, #11110111b;加载扫描信号初值11110111B
00D4 176 S1:
00D4 C0E0 177 PUSH ACC
00D6 E6 178 MOV A, @R0 ;取出显示器数据
00D7 F580 179 MOV P0, A ;由P0送出一位显示器数据
00D9 D0E0 180 POP ACC
00DB 85E0A0 181 MOV P2, ACC ;由P2送出扫描输出信号
00DE 7D02 182 MOV R5, #2 ;延迟一会儿
00E0 314C 183 ACALL DELAY
184 ;改变扫描码 EX:XXXX1011
00E2 03 185 RR A ;累加器向右移动一位
00E3 08 186 INC R0 ;显示器显示缓冲区地址加1
00E4 DAEE 187 DJNZ R2, S1 ;循环判断是否继续执行
00E6 22 188 RET
189
190 ;---―― 实现调整时间子程序 ――――――
A51 MACRO ASSEMBLER SZ02 01/04/2007 21:16:37 PAGE 4
191
192 ;设置目前时间
00E7 193 SET_TIME:
00E7 C28C 194 CLR TR0 ;定时器动作暂停
00E9 753600 195 MOV SEC, #0 ;秒钟变量清除为0
00EC 196 L0:
00EC 11CD 197 ACALL DISP ;扫描显示
198
00EE 20A513 199 JB K2, L1 ;未按下K2键则继续扫描
00F1 30A5FD 200 JNB K2, $ ;有按下则等待放开来
201 ;K2小时调整
00F4 0534 202 INC HOUR ;小时计数加1
00F6 E534 203 MOV A, HOUR
00F8 B41803 204 CJNE A,#24, L11 ;是否24H到了
00FB 753400 205 MOV HOUR, #0 ;小时变量清除为0
00FE 206 L11:
00FE 119A 207 ACALL CONV ;转换显示数据
0100 11CD 208 ACALL DISP ;扫描显示
0102 80E8 209 JMP L0 ;继续程序执行
210
0104 20A613 211 L1:JB K3, L2 ;未按下K3键则继续扫描
0107 30A6FD 212 JNB K3,$ ;有按下则等待放开来
213 ;K3分钟调整.
010A 0535 214 INC MIN ;分钟计数加1
010C E535 215 MOV A, MIN
010E B43C03 216 CJNE A,#60, L21 ;是否60 min到了
0111 753500 217 MOV MIN, #0 ;分钟变量清除为0
0114 218 L21:
0114 119A 219 ACALL CONV ;转换显示数据
0116 11CD 220 ACALL DISP ;扫描显示
0118 80D2 221 JMP L0 ;继续程序执行
222
011A 20A7CF 223 L2: JB K4,L0 ;未按下K4键则继续扫描
011D 30A7FD 224 JNB K4, $ ;有按下则等待放开来
0120 3134 225 ACALL BZ ;压电喇叭鸣响一声
226 ;K4设置完成
0122 3141 227 ACALL LED_BL ;LED闪动
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -