📄 i2cmstr.lst
字号:
210 ;____________________________________________________________________
211 ; STOPBIT
212 ; Sends the stop bit to end an I2C transmission
213
00F8 214 STOPBIT:
215
00F8 D2EE 216 SETB MDE ; to enable SDATA pin as an output
00FA C2EF 217 CLR MDO ; get SDATA ready for stop
00FC D2ED 218 SETB MCO ; set clock for stop
00FE 120141 219 CALL DELAY5
0101 D2EF 220 SETB MDO ; this is the stop bit
0103 22 221 RET
222
223
224
225 ;____________________________________________________________________
226 ; SENDBYTE
227 ; Send 8-bits in ACC to the slave
228
0104 229 SENDBYTE:
230
0104 753008 231 MOV BITCNT,#8 ; 8 bits in a byte
0107 D2EE 232 SETB MDE ; to enable SDATA pin as an output
I2CMSTR PAGE 5
0109 C2ED 233 CLR MCO ; make sure that the clock line is low
010B 234 SENDBIT:
010B 33 235 RLC A ; put data bit to be sent into carry
010C 92EF 236 MOV MDO,C ; put data bit on SDATA line
010E D2ED 237 SETB MCO ; clock to send bit
0110 C2ED 238 CLR MCO ; clear clock
0112 D530F6 239 DJNZ BITCNT,SENDBIT ; jump back and send all eight bits
240
0115 C2EE 241 CLR MDE ; release data line for acknowledge
0117 D2ED 242 SETB MCO ; send clock for acknowledge
0119 120141 243 CALL DELAY5
011C 30EC02 244 JNB MDI,NEXT ; this is a check for acknowledge
011F D200 245 SETB NOACK ; no acknowledge, set flag
0121 C2ED 246 NEXT: CLR MCO ; clear clock
0123 22 247 RET
248
249
250
251 ;____________________________________________________________________
252 ; RCVBYTE
253 ; receives one byte of data from an I2C slave device.
254
0124 255 RCVBYTE:
0124 753008 256 MOV BITCNT,#8 ; Set bit count.
0127 C2EE 257 CLR MDE ; to enable SDATA pin as an input
0129 C2ED 258 CLR MCO ; make sure the clock line is low
012B 259 RCVBIT:
012B D2ED 260 SETB MCO ; clock to recieve bit
012D C2ED 261 CLR MCO ; clear clock
012F A2EC 262 MOV C,MDI ; read data bit into carry.
0131 33 263 RLC A ; Rotate bit into result byte.
264
0132 D530F6 265 DJNZ BITCNT,RCVBIT ; Repeat until all bits received.
266 ; recieved byte is in the accumulator
267
0135 D2EE 268 SETB MDE ; Data pin of the master must be an..
269 ; ..output for the acknowledge
0137 D2EF 270 SETB MDO ; Send no acknowledge, last byte.
271
0139 D2ED 272 SETB MCO ; Send no-acknowledge clock.
013B 120141 273 CALL DELAY5
013E C2ED 274 CLR MCO ; clear clock
0140 22 275 RET
276
277
278 ;____________________________________________________________________
279 ; DELAY5
280 ; Short delay (5 machine cycles incl CALL time) for the main signals
281 ; (SCLOCK , SDATA)
282
0141 283 DELAY5:
0141 00 284 NOP
0142 22 285 RET
286
287 ;____________________________________________________________________
288 ; DELAY
289 ; DELAY ROUTINE FOR THE ADuC812/ADuC816/ADuC824
0143 290 DELAY: ; Delays by 100ms * A
I2CMSTR PAGE 6
291
292 ; ADuC812 100ms based on 11.0592MHz Core Clock
293 ; ADuC824 100ms based on 1.573MHz Core Clock
294
0143 FA 295 MOV R2,A ; Acc holds delay variable
0144 7BC8 296 DLY0: MOV R3,#200 ; Set up delay loop0
0146 7CE5 297 DLY1: MOV R4,#229 ; Set up delay loop1
298 ;DLY0: MOV R3,#50 ; Set up delay loop0
299 ;DLY1: MOV R4,#131 ; Set up delay loop1
0148 DCFE 300 DJNZ R4,$ ; Dec R4 & Jump here until R4 is 0
301 ; wait here for 131*15.3us=2ms
014A DBFA 302 DJNZ R3,DLY1 ; Dec R3 & Jump DLY1 until R3 is 0
303 ; Wait for 50*2ms
014C DAF6 304 DJNZ R2,DLY0 ; Dec R2 & Jump DLY0 until R2 is 0
305 ; wait for ACC*100ms
014E 22 306 RET ; Return from subroutine
307
308 ;____________________________________________________________________
309 ; ERROR
310 ; this subroutine is run if a NACK is recieved from the slave
311
014F 312 ERROR:
313
014F 7445 314 MOV A,#45h
0151 3154 315 ACALL SENDCHAR ; send the letter E out the UART
0153 22 316 RET
317
318 ;____________________________________________________________________
319 ; SENDCHAR
320 ; sends ASCII value contained in A to UART
321
0154 322 SENDCHAR:
323
0154 3099FD 324 JNB TI,$ ; wait til present char gone
0157 C299 325 CLR TI ; must clear TI
0159 F599 326 MOV SBUF,A
015B 22 327 RET
328
329
330 ;____________________________________________________________________
331 ; HEX2ASCII
332 ; converts A into the hex character representing the value of A's
333 ; least significant nibble
334
015C 335 HEX2ASCII:
336
015C 540F 337 ANL A,#00Fh
015E B40A00 338 CJNE A,#00Ah,$+3
0161 4002 339 JC IO0030
0163 2407 340 ADD A,#007h
0165 2430 341 IO0030: ADD A,#'0'
0167 22 342 RET
343
344
345 ;____________________________________________________________________
346 ; SENDVAL
347 ; converts the hex value of A into two ASCII chars, and then spits
348 ; these two characters up the UART. does not change the value of A.
I2CMSTR PAGE 7
349
0168 350 SENDVAL:
0168 C0E0 351 PUSH ACC
016A C4 352 SWAP A
016B 315C 353 CALL HEX2ASCII
016D 3154 354 CALL SENDCHAR ; send high nibble
016F D0E0 355 POP ACC
0171 C0E0 356 PUSH ACC
0173 315C 357 CALL HEX2ASCII
0175 3154 358 CALL SENDCHAR ; send low nibble
0177 D0E0 359 POP ACC
360
0179 22 361 RET
362
363 END
364
VERSION 1.2h ASSEMBLY COMPLETE, 0 ERRORS FOUND
I2CMSTR PAGE 8
ACC. . . . . . . . . . . . . . . D ADDR 00E0H PREDEFINED
BITCNT . . . . . . . . . . . . . D ADDR 0030H
DELAY. . . . . . . . . . . . . . C ADDR 0143H
DELAY5 . . . . . . . . . . . . . C ADDR 0141H
DLY0 . . . . . . . . . . . . . . C ADDR 0144H
DLY1 . . . . . . . . . . . . . . C ADDR 0146H
EA . . . . . . . . . . . . . . . B ADDR 00AFH PREDEFINED
ERR. . . . . . . . . . . . . . . B ADDR 0000H
ERROR. . . . . . . . . . . . . . C ADDR 014FH
EX0. . . . . . . . . . . . . . . B ADDR 00A8H PREDEFINED
HEX2ASCII. . . . . . . . . . . . C ADDR 015CH
I2CCON . . . . . . . . . . . . . D ADDR 00E8H PREDEFINED
I2CRS. . . . . . . . . . . . . . B ADDR 00EAH PREDEFINED
INPUT. . . . . . . . . . . . . . D ADDR 0032H
IO0030 . . . . . . . . . . . . . C ADDR 0165H
IT0. . . . . . . . . . . . . . . B ADDR 0088H PREDEFINED
LED. . . . . . . . . . . . . . . NUMB 00B4H
MAIN . . . . . . . . . . . . . . C ADDR 0060H
MCO. . . . . . . . . . . . . . . B ADDR 00EDH PREDEFINED
MDE. . . . . . . . . . . . . . . B ADDR 00EEH PREDEFINED
MDI. . . . . . . . . . . . . . . B ADDR 00ECH PREDEFINED
MDO. . . . . . . . . . . . . . . B ADDR 00EFH PREDEFINED
NEXT . . . . . . . . . . . . . . C ADDR 0121H
NOACK. . . . . . . . . . . . . . B ADDR 0000H
OUTPUT . . . . . . . . . . . . . D ADDR 0033H
P3 . . . . . . . . . . . . . . . D ADDR 00B0H PREDEFINED
RCVBIT . . . . . . . . . . . . . C ADDR 012BH
RCVBYTE. . . . . . . . . . . . . C ADDR 0124H
RCVDATA. . . . . . . . . . . . . C ADDR 00CAH
RCVRET . . . . . . . . . . . . . C ADDR 00EBH
RI . . . . . . . . . . . . . . . B ADDR 0098H PREDEFINED
RXTXLOOP . . . . . . . . . . . . C ADDR 007EH
SBUF . . . . . . . . . . . . . . D ADDR 0099H PREDEFINED
SCON . . . . . . . . . . . . . . D ADDR 0098H PREDEFINED
SENDBIT. . . . . . . . . . . . . C ADDR 010BH
SENDBYTE . . . . . . . . . . . . C ADDR 0104H
SENDCHAR . . . . . . . . . . . . C ADDR 0154H
SENDDATA . . . . . . . . . . . . C ADDR 00AFH
SENDERR. . . . . . . . . . . . . C ADDR 008FH
SENDRET. . . . . . . . . . . . . C ADDR 00C9H
SENDVAL. . . . . . . . . . . . . C ADDR 0168H
SKIP . . . . . . . . . . . . . . C ADDR 0094H
SLAVEADD . . . . . . . . . . . . D ADDR 0031H
STARTBIT . . . . . . . . . . . . C ADDR 00ECH
STOPBIT. . . . . . . . . . . . . C ADDR 00F8H
STOPRCV. . . . . . . . . . . . . C ADDR 00E1H
STOPSEND . . . . . . . . . . . . C ADDR 00BFH
TH1. . . . . . . . . . . . . . . D ADDR 008DH PREDEFINED
TI . . . . . . . . . . . . . . . B ADDR 0099H PREDEFINED
TMOD . . . . . . . . . . . . . . D ADDR 0089H PREDEFINED
TR1. . . . . . . . . . . . . . . B ADDR 008EH PREDEFINED
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -