📄 sz01.lst
字号:
A51 MACRO ASSEMBLER SZ01 01/04/2007 21:35:15 PAGE 1
MACRO ASSEMBLER A51 V7.07
OBJECT MODULE PLACED IN sz01.OBJ
ASSEMBLER INVOKED BY: C:\Keil 7.06\C51\BIN\A51.EXE sz01.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;----------------------------------------------------------
2 ;文件名称:SZ01.ASM
3 ;程序功能:时钟
4 ;----------------------------------------------------------
5
6 ;----- ――― 程序初始化 ――――――――――
7 ; 定义存放计时单元地址
8
0030 9 BUF EQU 30H ;30~33H 连续4字节存放显示器数据
0034 10 HOUR EQU 34H ;存放小时变量
0035 11 MIN EQU 35H ;存放分钟变量
0036 12 SEC EQU 36H ;存放秒钟变量
0037 13 DEDA EQU 37H ;存放5 ms 计数值
14
15 ;按键输入引脚定义
00A4 16 K1 EQU P2.4 ;按键1引脚定义
00A5 17 K2 EQU P2.5 ;按键2引脚定义
00A6 18 K3 EQU P2.6 ;按键3引脚定义
00A7 19 K4 EQU P2.7 ;按键4引脚定义
20
21 ;压电喇叭和指示灯引脚定义
00B4 22 SPK EQU P3.4 ;压电喇叭控制信号
0090 23 WLED EQU P1.0 ;工作指示灯引脚定义
24
25 ;程序开始执行地址
0000 26 ORG 0H ;程序代码由地址0开始执行
0000 800B 27 JMP MAIN
000B 28 ORG 0BH ;定时器 0 中断地址设置
000B 803B 29 JMP TO_SRV
30
31 ;--------- 主 程 序 --------――
32
000D 33 MAIN: ;开始
34
000D 311D 35 ACALL BZ ;压电喇叭连续两次鸣响一声
000F 311D 36 ACALL BZ
0011 312A 37 ACALL LED_BL ;LED 闪动,表示程序开始执行
0013 3110 38 ACALL INIT ;初始变化量
0015 1139 39 ACALL INIT_TIMER ;设置定时器
40
41 ;加载显示器初值数据
0017 74C0 42 MOV A, #0C0H
0019 F580 43 MOV P0, A
44
45 ;无穷循环
001B 46 LOOP: ;无穷循环
001B 1183 47 ACALL CONV ;转换 时时 分分 数据
001D 11B6 48 ACALL DISP ;扫描显示
49
001F 20A406 50 JB K1, M1 ;未按下K1键则继续扫描
0022 312A 51 ACALL LED_BL ;LED闪动
0024 11D0 52 ACALL SET_TIME ;设置目前时间
0026 80F3 53 JMP LOOP ;继续循环执行
54
55
0028 20A502 56 M1:JB K2,M2 ;未按下K2键则继续扫描
002B 80EE 57 JMP LOOP ;继续循环执行
58
A51 MACRO ASSEMBLER SZ01 01/04/2007 21:35:15 PAGE 2
002D 20A602 59 M2:JB K3, M3 ;未按下K3键则继续扫描
0030 80E9 60 JMP LOOP ;继续循环执行
61
0032 20A702 62 M3:JB K4,M4 ;未按下K4键则继续扫描
0035 80E4 63 JMP LOOP ;继续循环执行
64
0037 65 M4:
0037 80E2 66 JMP LOOP ;继续循环执行
67
68 ;----- 实现走时功能的子程序 ------――
69
70 ;使用定时器0模式0计时
0039 71 INIT_TIMER: ;初始化定时器,使用定时器0模式1计时
0039 758900 72 MOV TMOD,#00000000B ;设置定时器0工作模式为0
003C 75A882 73 MOV IE, #10000010B ;启用定时器0中断产生
003F 758A18 74 MOV TL0, #(8192-5000)MOD 32 ;加载低字节
0042 758C63 75 MOV TH0, #(8192-5000)/32 ;加载高字节
0045 D28C 76 SETB TR0 ;启动定时器0开始计时
0047 22 77 RET
78 ;-----------―――
79 ;中断服务程序
0048 80 TO_SRV: ;定时器0计时中断程序每隔5ms中断一次
0048 C0E0 81 PUSH ACC ;将累加器放入堆栈
004A 758A18 82 MOV TL0, #(8192-5000)MOD 32 ;加载低字节
004D 758C63 83 MOV TH0, #(8192-5000)/32 ;加载高字节
0050 0537 84 INC DEDA ;5ms计数值加1
85 ;秒输出
0052 E537 86 MOV A, DEDA
0054 B4C829 87 CJNE A,#200,TT1 ;是否1s到了
0057 753700 88 MOV DEDA, #0 ;计数值清除为0
005A B290 89 CPL WLED ;LED灯亮灭变换
005C 0536 90 INC SEC ;秒计数加1
005E E536 91 MOV A, SEC
0060 B43C1D 92 CJNE A, #60, TT1;是否1min到了
93 ;分输出
0063 0535 94 INC MIN ;分计数加1
0065 753600 95 MOV SEC, #0 ;秒计数清除为0
0068 E535 96 MOV A, MIN
006A B43C13 97 CJNE A, #60, TT1 ;是否1h到了
98 ;时输出
006D 0534 99 INC HOUR ;小时计数加1
006F 753500 100 MOV MIN, #0 ;分计数清除为0
0072 E534 101 MOV A, HOUR
0074 B41809 102 CJNE A,#24, TT1 ;是否24h到了
0077 753600 103 MOV SEC, #0 ;秒钟变量清除为0
007A 753500 104 MOV MIN, #0 ;分钟变量清除为0
007D 753400 105 MOV HOUR, #0 ;小时变量清除为0
0080 106 TT1:
0080 D0E0 107 POP ACC ;将累加器由堆栈取出
0082 32 108 RETI
109
110 ;----―― 实现显示功能的子程序 ---――――
111
112 ;转换 时时:分分 数据
0083 113 CONV:
114 ;转换小时数据
0083 E534 115 MOV A, HOUR
0085 75F00A 116 MOV B, #10
0088 84 117 DIV AB
0089 9000A6 118 MOV DPTR,#TABLE ;查表转换
008C 93 119 MOVC A, @A+DPTR
008D F530 120 MOV BUF, A
008F E5F0 121 MOV A, B
0091 93 122 MOVC A, @A+DPTR
0092 F531 123 MOV BUF+1, A
124 ;转换分钟数据
A51 MACRO ASSEMBLER SZ01 01/04/2007 21:35:15 PAGE 3
0094 E535 125 MOV A, MIN
0096 75F00A 126 MOV B, #10
0099 84 127 DIV AB
009A 9000A6 128 MOV DPTR,#TABLE ;查表转换
009D 93 129 MOVC A, @A+DPTR
009E F532 130 MOV BUF+2, A
00A0 E5F0 131 MOV A, B
00A2 93 132 MOVC A, @A+DPTR
00A3 F533 133 MOV BUF+3, A
00A5 22 134 RET
135
136 ;字型数据编码表
00A6 137 TABLE:
00A6 C0F9A4B0 138 DB 0C0H,0F9H,0A4H,0B0H
00AA 999282F8 139 DB 99H,92H,82H,0F8H
00AE 80908883 140 DB 80H,90H,88H,83H
00B2 C6A1868E 141 DB 0C6H,0A1H,86H,8EH
142
143 ;---------――――
144 ;扫描显示
00B6 145 DISP:
00B6 7830 146 MOV R0, #BUF ;指向显示器显示缓冲区起始地址
00B8 7A04 147 MOV R2, #4 ;循环执行4次
00BA 75E0F7 148 MOV ACC, #11110111b;加载扫描信号初值11110111B
00BD 149 S1:
00BD C0E0 150 PUSH ACC
00BF E6 151 MOV A, @R0 ;取出显示器数据
00C0 F580 152 MOV P0, A ;由P0送出一位显示器数据
00C2 D0E0 153 POP ACC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -