wl012.lst
来自「单片机开发资料 基于51单片机的单片机开发板 包括《实验例程」· LST 代码 · 共 308 行 · 第 1/2 页
LST
308 行
A51 MACRO ASSEMBLER WL012 11/03/2004 11:15:09 PAGE 1
MACRO ASSEMBLER A51 V7.08a
OBJECT MODULE PLACED IN wl012.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE wl012.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;********************************************************************************
2 ;* *
3 ;* File : wl012.asm *
4 ;* Date : 2004-11-5 *
5 ;* Version : 1.0 *
6 ;* *
7 ;********************************************************************************
8 ;* Descriptoon: *
9 ;* 计数器实验 *
10 ;* 定时器1工作于16位计数模式,记录外部脉冲的个数; *
11 ;* 定时器0工作于定时模式,用于进行动态扫描显示 *
12 ;* *
13 ;* 此程序可用按键AN4来演示,但是由于按键有抖动现象,所以每按一次*
14 ;* 有可能产生多次计数脉冲 *
15 ;* *
16 ;********************************************************************************
17 ;* 计数值单位,寄存器与数码管对应关系: *
18 ;* *
19 ;* --- 单位 ---------- 数码管端口 ---- 缓冲区 --------- *
20 ;* X P20 DIS_BUF+7 *
21 ;* X P21 DIS_BUF+6 *
22 ;* X P22 DIS_BUF+5 *
23 ;* 万位 P23 DIS_BUF+4 *
24 ;* 千位 P24 DIS_BUF+3 *
25 ;* 百位 P25 DIS_BUF+2 *
26 ;* 十位 P26 DIS_BUF+1 *
27 ;* 个位 P27 DIS_BUF+0 *
28 ;* *
29 ;********************************************************************************
30
31 NAME WL012
32
33 CODE_SEG SEGMENT CODE
34 DATA_SEG SEGMENT DATA
35 STACK_SEG SEGMENT IDATA
36
---- 37 RSEG DATA_SEG
0000 38 DIS_DIGIT: DS 1
0001 39 DIS_INDEX: DS 1
0002 40 DIS_BUF: DS 8
000A 41 TMP: DS 1
42
---- 43 RSEG STACK_SEG
0000 44 STACK: DS 20
45
46 ;===============================================================================
---- 47 CSEG AT 00000H
0000 020000 F 48 LJMP MAIN
49
---- 50 CSEG AT 0000BH
000B 020000 F 51 LJMP TIMER0
52
53 ;===============================================================================
---- 54 RSEG CODE_SEG
0000 55 MAIN:
0000 758100 F 56 MOV SP,#(STACK-1);
57
0003 7580FF 58 MOV P0,#0FFH
A51 MACRO ASSEMBLER WL012 11/03/2004 11:15:09 PAGE 2
0006 75A0FF 59 MOV P2,#0FFH
0009 758951 60 MOV TMOD,#051H ; 定时器0工作模式1, 16位定时方式
61 ; 定时器1工作模式1, 16位计数方式
000C E4 62 CLR A
000D F58D 63 MOV TH1,A
000F F58B 64 MOV TL1,A
0011 758CFC 65 MOV TH0,#0FCH
0014 758A17 66 MOV TL0,#017H
67
68 ; 初始化显示缓冲区
0017 7500FF F 69 MOV DIS_BUF+07H,#0FFH ; 最数小于65536, 所以前三个数码不显示
001A 7500FF F 70 MOV DIS_BUF+06H,#0FFH
001D 7500FF F 71 MOV DIS_BUF+05H,#0FFH
72
0020 7500C0 F 73 MOV DIS_BUF+04H,#0C0H ; 0xc0是'0'的显示代码
0023 7500C0 F 74 MOV DIS_BUF+03H,#0C0H
0026 7500C0 F 75 MOV DIS_BUF+02H,#0C0H
0029 7500C0 F 76 MOV DIS_BUF+01H,#0C0H
002C 7500C0 F 77 MOV DIS_BUF,#0C0H
78
002F 75007F F 79 MOV DIS_DIGIT,#07FH ; 初始显示P27口数码管
80
0032 F500 F 81 MOV DIS_INDEX,A
82
0034 75A882 83 MOV IE,#082H ; 使能TIMER0中断
84
0037 D28C 85 SETB TR0
0039 D28E 86 SETB TR1
87
003B 80FE 88 SJMP $
89
90 ; END OF MAIN
91
92 ;===============================================================================
93 USING 1
003D 94 TIMER0:
95 ; 定时器0中断服程序, 用于数码管的动态扫描
96 ; DIS_INDEX --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
97 ; DIS_DIGIT --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
98 ; 选通P2.0口数码管
99 ; DIS_BUF --- 显于缓冲区基地址
100
003D C0E0 101 PUSH ACC
003F C0D0 102 PUSH PSW
0041 C082 103 PUSH DPL
0043 C083 104 PUSH DPH
0045 75D008 105 MOV PSW, #08H ; WORK 1
106
107 USING 1
108
0048 758CFC 109 MOV TH0,#0FCH
004B 758A17 110 MOV TL0,#017H
111
004E 75A0FF 112 MOV P2,#0FFH ; 先关闭所有数码管
113
0051 7400 F 114 MOV A,#DIS_BUF ; 获得显示缓冲区基地址
0053 2500 F 115 ADD A,DIS_INDEX ; 获得偏移量
0055 F8 116 MOV R0,A ; R0 = 基地址 + 偏移量
0056 E6 117 MOV A,@R0 ; 获得显示代码
0057 F580 118 MOV P0,A ; 显示代码传送到P0口
119
0059 8500A0 F 120 MOV P2,DIS_DIGIT ;
121
005C E500 F 122 MOV A,DIS_DIGIT ; 位选通值右移, 下次中断时选通下一位数码管
005E 03 123 RR A
005F F500 F 124 MOV DIS_DIGIT,A
A51 MACRO ASSEMBLER WL012 11/03/2004 11:15:09 PAGE 3
125
0061 0500 F 126 INC DIS_INDEX ; DIS_INDEX加1, 下次中断时显示下一位
0063 530007 F 127 ANL DIS_INDEX,#0x07 ; 当DIS_INDEX等于8(0000 1000)时, 清0
128
0066 E500 F 129 MOV A,DIS_INDEX
0068 7003 130 JNZ END_TIMER0
131
006A 120000 F 132 LCALL UPDATE_DISBUF
133
006D 134 END_TIMER0:
006D D083 135 POP DPH
006F D082 136 POP DPL
0071 D0D0 137 POP PSW
0073 D0E0 138 POP ACC
139
0075 32 140 RETI
141
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?