?? up51s010.lst
字號:
A51 MACRO ASSEMBLER UP51S010 01/06/2005 15:17:35 PAGE 1
MACRO ASSEMBLER A51 V7.08a
OBJECT MODULE PLACED IN up51s010.OBJ
ASSEMBLER INVOKED BY: C:\KEIL\C51\BIN\A51.EXE up51s010.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;/*******************************************************************************
2 ;* *
3 ;* File : uP51s010.c *
4 ;* Date : 2004-9-5 *
5 ;* Version : 1.0 *
6 ;* *
7 ;* Author : kevin kevin@dz51.com *
8 ;* Company : Http://www.dz51.com *
9 ;* *
10 ;********************************************************************************
11 ;* Descriptoon: *
12 ;* 計數器實驗 *
13 ;* 定時器1工作于16位計數模式,記錄外部脈沖的個數; *
14 ;* 定時器0工作于定時模式,用于進行動態掃描顯示 *
15 ;* *
16 ;* 此程序可用按鍵AN4來演示,但是由于按鍵有抖動現象,所以每按一次*
17 ;* 有可能產生多次計數脈沖 *
18 ;* *
19 ;* 程序運行后按下AN4,則數碼管記數增加! *
20 ;* *
21 ;********************************************************************************
22 ;* 計數值單位,寄存器與數碼管對應關系: *
23 ;* *
24 ;* --- 單位 ---------- 數碼管端口 ---- 緩沖區 --------- *
25 ;* 千位 P23 DIS_BUF+3 *
26 ;* 百位 P22 DIS_BUF+2 *
27 ;* 十位 P21 DIS_BUF+1 *
28 ;* 個位 P20 DIS_BUF+0 *
29 ;* *
30 ;********************************************************************************
31
32 NAME WL012
33
34 CODE_SEG SEGMENT CODE
35 DATA_SEG SEGMENT DATA
36 STACK_SEG SEGMENT IDATA
37
---- 38 RSEG DATA_SEG
0000 39 DIS_DIGIT: DS 1
0001 40 DIS_INDEX: DS 1
0002 41 DIS_BUF: DS 4
0006 42 TMP: DS 1
43
---- 44 RSEG STACK_SEG
0000 45 STACK: DS 20
46
47 ;===============================================================================
---- 48 CSEG AT 00000H
0000 020000 F 49 LJMP MAIN
50
---- 51 CSEG AT 0000BH
000B 020000 F 52 LJMP TIMER0
53
54 ;===============================================================================
---- 55 RSEG CODE_SEG
0000 56 MAIN:
0000 758100 F 57 MOV SP,#(STACK-1);
58
A51 MACRO ASSEMBLER UP51S010 01/06/2005 15:17:35 PAGE 2
0003 7580FF 59 MOV P0,#0FFH
0006 75A0FF 60 MOV P2,#0FFH
0009 758951 61 MOV TMOD,#051H ; 定時器0工作模式1, 16位定時方式
62 ; 定時器1工作模式1, 16位計數方式
000C E4 63 CLR A
000D F58D 64 MOV TH1,A
000F F58B 65 MOV TL1,A
0011 758CFC 66 MOV TH0,#0FCH
0014 758A17 67 MOV TL0,#017H
68
69 ; 初始化顯示緩沖區
70
0017 7500C0 F 71 MOV DIS_BUF+03H,#0C0H ; 0xc0是'0'的顯示代碼
001A 7500C0 F 72 MOV DIS_BUF+02H,#0C0H
001D 7500C0 F 73 MOV DIS_BUF+01H,#0C0H
0020 7500C0 F 74 MOV DIS_BUF,#0C0H
75
0023 7500FE F 76 MOV DIS_DIGIT,#0FEH ; 初始顯示P20口數碼管
0026 F500 F 77 MOV DIS_INDEX,A
78
0028 75A882 79 MOV IE,#082H ; 使能TIMER0中斷
80
002B D28C 81 SETB TR0
002D D28E 82 SETB TR1
83
002F 80FE 84 SJMP $
85
86 ; END OF MAIN
87
88 ;===============================================================================
89 USING 1
0031 90 TIMER0:
91 ; 定時器0中斷服程序, 用于數碼管的動態掃描
92 ; DIS_INDEX --- 顯示索引, 用于標識當前顯示的數碼管和緩沖區的偏移量
93 ; DIS_DIGIT --- 位選通值, 傳送到P2口用于選通當前數碼管的數值, 如等于0xfe時,
94 ; 選通P2.0口數碼管
95 ; DIS_BUF --- 顯于緩沖區基地址
96
0031 C0E0 97 PUSH ACC
0033 C0D0 98 PUSH PSW
0035 C082 99 PUSH DPL
0037 C083 100 PUSH DPH
0039 75D008 101 MOV PSW, #08H ; WORK 1
102
103 USING 1
104
003C 758CFC 105 MOV TH0,#0FCH
003F 758A17 106 MOV TL0,#017H
107
0042 75A0FF 108 MOV P2,#0FFH ; 先關閉所有數碼管
109
0045 7400 F 110 MOV A,#DIS_BUF ; 獲得顯示緩沖區基地址
0047 2500 F 111 ADD A,DIS_INDEX ; 獲得偏移量
0049 F8 112 MOV R0,A ; R0 = 基地址 + 偏移量
004A E6 113 MOV A,@R0 ; 獲得顯示代碼
004B F580 114 MOV P0,A ; 顯示代碼傳送到P0口
115
004D 8500A0 F 116 MOV P2,DIS_DIGIT ;
117
0050 E500 F 118 MOV A,DIS_DIGIT ; 位選通值右移, 下次中斷時選通下一位數碼管
0052 23 119 RL A
0053 F500 F 120 MOV DIS_DIGIT,A
121
0055 0500 F 122 INC DIS_INDEX ; DIS_INDEX加1, 下次中斷時顯示下一位
0057 530003 F 123 ANL DIS_INDEX,#0x03 ; 當DIS_INDEX等于4(0000 0100)時, 清0
124
A51 MACRO ASSEMBLER UP51S010 01/06/2005 15:17:35 PAGE 3
005A E500 F 125 MOV A,DIS_INDEX
005C 7003 126 JNZ END_TIMER0
127
005E 120000 F 128 LCALL UPDATE_DISBUF
129
0061 130 END_TIMER0:
0061 D083 131 POP DPH
0063 D082 132 POP DPL
0065 D0D0 133 POP PSW
0067 D0E0 134 POP ACC
135
0069 32 136 RETI
137
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -