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