📄 i2c.lst
字号:
A51 MACRO ASSEMBLER I2C 12/18/2007 11:18:07 PAGE 1
MACRO ASSEMBLER A51 V7.07
OBJECT MODULE PLACED IN i2c.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE i2c.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 EPM_WR_CODE_SEG SEGMENT CODE
45 ;public ?C?CSTPTR
46
47
48 ;XX #define TEST
49
50 PUBLIC MOVX_A_DPTR
51 PUBLIC MOVX_DPTR_A
52 public SendStopCondition
53
54 PUBLIC is_reading
55 PUBLIC is_writing
56 PUBLIC epm_err
57 PUBLIC addr_low
58 PUBLIC addr_high
A51 MACRO ASSEMBLER I2C 12/18/2007 11:18:07 PAGE 2
59
60 $reguse MOVX_A_DPTR(A)
61 $reguse MOVX_DPTR_A()
62 $reguse SendStopCondition()
63
64
65 ;-------------- PIN DEFINITION ---------------------------
66 ;EPM_SDA EQU P2.1
67 extrn bit(EPM_SDA)
68 ;EPM_SCL EQU P2.2
69 extrn bit(EPM_SCL)
70 ;if this updated, update eprom.h
71 ;EPM_WP EQU P2.3
72 extrn bit(EPM_WP)
73 ;enable_task_switch EQU P2.4
74 extrn bit(enable_task_switch)
75
76 ;-------------- EPROM PARAMETER DEFINITION ---------------
77 ;FOR 24C32
0020 78 PAGE_SIZE EQU 20H
79 ;about 15ms @18.432MHz
00FA 80 WAIT_WRITE_COUNT EQU 250
81
82 ;-------------- IMPORTED VARIABLES --------------------------------
83
84
85
86
87
88
89
90
91
92 EPM_BITS SEGMENT BIT
---- 93 RSEG EPM_BITS
0000 94 is_reading:
0000 95 DBIT 1
0001 96 is_writing:
0001 97 DBIT 1
0002 98 epm_err:
0002 99 DBIT 1
100
101 EPM_DATA SEGMENT data
---- 102 rseg EPM_DATA
0000 103 addr_low:
0000 104 DS 1
0001 105 addr_high:
0001 106 DS 1
107
108
109 ;-------------- PROGRAM -------------------------------------------
---- 110 RSEG EPM_WR_CODE_SEG
111
112
113
114
115
116
117
118
119
120
121
122
123
124
A51 MACRO ASSEMBLER I2C 12/18/2007 11:18:07 PAGE 3
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
A51 MACRO ASSEMBLER I2C 12/18/2007 11:18:07 PAGE 4
191
192
193
194
195
196
197
198
199 ;-------------------- macro : Increment address --------------------
200 IncrementAddress Macro first_return_addr
201 INC addr_low
202 MOV A,addr_low
203 JNZ first_return_addr
204 INC addr_high
205 endm
206
207
208 ;-------------------- macro : Compare address --------------------
209
210 CompareAddress Macro RETURN_NOT_EQUAL,RETURN_EQUAL
211 MOV A,DPL
212 CJNE A, addr_low, RETURN_NOT_EQUAL
213 MOV A, DPH
214 CJNE A, addr_high, RETURN_NOT_EQUAL
215 SJMP RETURN_EQUAL
216 ENDM
217
218
219 ;-------------------- macro : Write control code --------------------
220 ;如果EPROM正在写,那么就会不响应。因此要尝试 WAIT_WRITE_COUNT次。
221 ;如果已经检测出 EPROM 有错误,那么就只尝试一次。如果尝试成功,则该标志被清除。
222
223 ;WriteControlCode Macro control_code, failure_return_addr
0000 224 WriteControlCode:
225 ; LOCAL WE_WRITE_CONTROL_CODE, WE_NEXT_CONTROL_CODE
226
0000 7500FA F 227 MOV addr_low, #WAIT_WRITE_COUNT ; addr_low is used as loop count
228 ;如果EPROM 错误,则只尝试一次
0003 300003 F 229 JNB epm_err, WE_WRITE_CONTROL_CODE
0006 750001 F 230 MOV addr_low, #1
0009 231 WE_WRITE_CONTROL_CODE:
0009 C200 F 232 CLR epm_err
000B 120000 F 233 LCALL SendStartcondition
000E 74A0 234 MOV A, #0XA0 ;control_code;//control code 0xa0, write
0010 120000 F 235 LCALL WriteByte;
0013 300005 F 236 JNB epm_err, WE_NEXT_CONTROL_CODE
0016 D500F0 F 237 DJNZ addr_low, WE_WRITE_CONTROL_CODE ;loop end
0019 800E 238 SJMP WCC_RET ;failure_return_addr ; fail
001B 239 WE_NEXT_CONTROL_CODE:
001B E583 240 MOV A, DPH ;//high address
001D F500 F 241 MOV addr_high,A
001F 120000 F 242 LCALL WriteByte
0022 E582 243 MOV A,DPL
0024 F500 F 244 MOV addr_low,A
0026 120000 F 245 LCALL WriteByte
0029 246 WCC_RET:
0029 22 247 RET
248
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -