📄 wl011.lst
字号:
A51 MACRO ASSEMBLER WL011 02/04/2005 14:40:41 PAGE 1
MACRO ASSEMBLER A51 V7.10
OBJECT MODULE PLACED IN wl011.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE wl011.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;********************************************************************************
2 ;* *
3 ;* File : wl011.asm *
4 ;* Date : 2004-1-5 *
5 ;* Version : 1.0 *
6 ;* *
7 ;* Author : Freeman freeman@willar.com *
8 ;* Company : Willar www.willar.com *
9 ;* *
10 ;*****************************x**************************************************
11 ;* Descriptoon: *
12 ;* 秒表 *
13 ;* K1---控制按钮 *
14 ;* 第一次按下时, 启动开始计时 *
15 ;* 第二次按下时, 停止 *
16 ;* 第三次按下时, 归零 *
17 ;* *
18 ;* 秒单位,寄存器与数码管对应关系: *
19 ;* *
20 ;* --- 秒单位 ---------- 数码管端口 ---- 缓冲区 --------- 计时(BCD码)值寄存器 *
21 ;* 十万位 P20 dis_buf[7] sec_bcd[7] *
22 ;* 万位 P21 dis_buf[6] sec_bcd[6] *
23 ;* 千位 P22 dis_buf[5] sec_bcd[5] *
24 ;* 百位 P23 dis_buf[4] sec_bcd[4] *
25 ;* 十位 P24 dis_buf[3] sec_bcd[3] *
26 ;* 个位(1.s) P25 dis_buf[2] sec_bcd[2] *
27 ;* 十分位(0.1s) P26 dis_buf[1] sec_bcd[1] *
28 ;* 百分位(0.01s) P27 dis_buf[0] sec_bcd[0] *
29 ;* *
30 ;********************************************************************************
31
32 NAME WL011
33
34
35 CODE_SEG SEGMENT CODE
36 DATA_SEG SEGMENT DATA
37 STACK_SEG SEGMENT IDATA
38
---- 39 RSEG DATA_SEG
0000 40 KEY_S: DS 1
0001 41 KEY_V: DS 1
0002 42 DIS_DIGIT: DS 1
0003 43 DIS_INDEX: DS 1
0004 44 SEC_BCD: DS 8 ; 秒计数值, BCD码
000C 45 KEY_TIMES: DS 1 ; K1 按下次数
000D 46 DIS_BUF: DS 8 ; 显示缓冲区
47
---- 48 RSEG STACK_SEG
0000 49 STACK: DS 20
50
0094 51 K1 BIT P1.4
52
53 ;===============================================================================
---- 54 CSEG AT 0000H
0000 020000 F 55 LJMP MAIN
56
57
---- 58 CSEG AT 0000BH
A51 MACRO ASSEMBLER WL011 02/04/2005 14:40:41 PAGE 2
000B 020000 F 59 LJMP TIMER0
60
61
---- 62 CSEG AT 0001BH
001B 020000 F 63 LJMP TIMER1
64
65 ;===============================================================================
---- 66 RSEG CODE_SEG
0000 67 MAIN:
68 USING 0
0000 758100 F 69 MOV SP,#(STACK-1)
70
0003 7580FF 71 MOV P0,#0FFH ; 初始化端口
0006 75A0FF 72 MOV P2,#0FFH
0009 758911 73 MOV TMOD,#011H ;
000C 758DDC 74 MOV TH1,#0DCH
000F E4 75 CLR A
0010 F58B 76 MOV TL1,A
77
0012 758CFC 78 MOV TH0,#0FCH
79
0015 758A17 80 MOV TL0,#017H
81
0018 120000 F 82 LCALL CLR_TIME ; 清零计时值
83
001B 75007F F 84 MOV DIS_DIGIT,#07FH ; 上电时选通P27数码管
85
001E E4 86 CLR A
001F F500 F 87 MOV DIS_INDEX,A
88
0021 F500 F 89 MOV KEY_TIMES,A
90
0023 750001 F 91 MOV KEY_V,#01H
92
0026 75A88A 93 MOV IE,#08AH ; 使能timer0, timer1中断
94
0029 D28C 95 SETB TR0
002B C28E 96 CLR TR1
97
002D 98 MAIN_LP:
002D 120000 F 99 LCALL SCAN_KEY ; 键扫描
0030 60FB 100 JZ MAIN_LP ; 无键返回
101
0032 7F0A 102 MOV R7,#10 ; 延时10ms
0034 120000 F 103 LCALL DELAYMS ; 延时去抖动
0037 120000 F 104 LCALL SCAN_KEY ; 再次扫描
003A 60F1 105 JZ MAIN_LP ; 无键返回
106
003C 850000 F 107 MOV KEY_V,KEY_S ; 保存键值
003F 120000 F 108 LCALL PROC_KEY ; 键处理
0042 80E9 109 SJMP MAIN_LP ; 调回主循环
110 ; END OF main
111
112 ;===============================================================================
113
0044 114 CLR_TIME:
115
0044 E4 116 CLR A
0045 F500 F 117 MOV SEC_BCD,A ; 清零所有计时值
0047 F500 F 118 MOV SEC_BCD+01H,A
0049 F500 F 119 MOV SEC_BCD+02H,A
004B F500 F 120 MOV SEC_BCD+03H,A
004D F500 F 121 MOV SEC_BCD+04H,A
004F F500 F 122 MOV SEC_BCD+05H,A
0051 F500 F 123 MOV SEC_BCD+06H,A
0053 F500 F 124 MOV SEC_BCD+07H,A
A51 MACRO ASSEMBLER WL011 02/04/2005 14:40:41 PAGE 3
0055 020000 F 125 LJMP UPDATE_DISBUF ; 更新显示缓冲区
126
127 ; END OF CLR_TIME
128
129 ;===============================================================================
0058 130 SCAN_KEY:
0058 E4 131 CLR A
0059 F500 F 132 MOV KEY_S,A
005B A294 133 MOV C,K1 ; 读按键状态
005D 33 134 RLC A
005E 4200 F 135 ORL KEY_S,A
0060 E500 F 136 MOV A,KEY_S
0062 6500 F 137 XRL A,KEY_V ;
138
0064 22 139 RET
140 ; END OF scan_key
141
142 ;===============================================================================
0065 143 PROC_KEY:
0065 E500 F 144 MOV A,KEY_V
0067 20E018 145 JB ACC.0,END_PROC_KEY
146
006A 0500 F 147 INC KEY_TIMES
006C E500 F 148 MOV A,KEY_TIMES
006E B40103 149 CJNE A,#01H,PROC_KEY1
150
0071 D28E 151 SETB TR1 ; KEY_TIMES = 1,第一次按下K1, 启动开始计时
0073 22 152 RET
153
0074 154 PROC_KEY1:
0074 E500 F 155 MOV A,KEY_TIMES
0076 B40203 156 CJNE A,#02H,PROC_KEY2
157
0079 C28E 158 CLR TR1 ; KEY_TIMES = 2, 第二次按下K1, 停止计时
159
007B 22 160 RET
161
007C 162 PROC_KEY2:
007C 120000 F 163 LCALL CLR_TIME ; 第三次按下K1, 清零计时值
164
007F E4 165 CLR A
0080 F500 F 166 MOV KEY_TIMES,A ; 清零KEY_TIMES
167
0082 168 END_PROC_KEY:
0082 22 169 RET
170
171 ;===============================================================================
172
0083 173 TIMER0:
174 ; 定时器0中断服程序, 用于数码管的动态扫描
175 ; DIS_INDEX --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
176 ; DIS_DIGIT --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
177 ; 选通P2.0口数码管
178 ; DIS_BUF --- 显于缓冲区基地址
179
0083 C0E0 180 PUSH ACC
0085 C0D0 181 PUSH PSW
0087 C000 182 PUSH AR0
183
0089 758CFC 184 MOV TH0,#0FCH
008C 758A17 185 MOV TL0,#017H
186
008F 75A0FF 187 MOV P2,#0FFH ; 先关闭所有数码管
188
0092 7400 F 189 MOV A,#DIS_BUF ; 获得显示缓冲区基地址
0094 2500 F 190 ADD A,DIS_INDEX ; 获得偏移量
A51 MACRO ASSEMBLER WL011 02/04/2005 14:40:41 PAGE 4
0096 F8 191 MOV R0,A ; R0 = 基地址 + 偏移量
0097 E6 192 MOV A,@R0 ; 获得显示代码
0098 F580 193 MOV P0,A ; 显示代码传送到P0口
194
009A 8500A0 F 195 MOV P2,DIS_DIGIT ;
196
009D E500 F 197 MOV A,DIS_DIGIT ; 位选通值右移(P20<-P27), 下次中断时选通下一位数码
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -