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