📄 i2cmstr.lst
字号:
180 ;____________________________________________________________________
181 ; STARTBIT
182 ; Sends the start bit to initiate an I2C communication
183
00E3 184 STARTBIT:
00E3 D2EE 185 SETB MDE ; enable SDATA pin as an output
00E5 C200 186 CLR NOACK
00E7 C2EF 187 CLR MDO ; low O/P on SDATA
00E9 C2ED 188 CLR MCO ; start bit
00EB 22 189 RET
190 ;____________________________________________________________________
191 ; STOPBIT
192 ; Sends the stop bit to end an I2C transmission
193
00EC 194 STOPBIT:
00EC D2EE 195 SETB MDE ; to enable SDATA pin as an output
00EE C2EF 196 CLR MDO ; get SDATA ready for stop
00F0 D2ED 197 SETB MCO ; set clock for stop
00F2 D2EF 198 SETB MDO ; this is the stop bit
00F4 22 199 RET
200 ;____________________________________________________________________
201 ; SENDBYTE
202 ; Send 8-bits in ACC to the slave
00F5 203 SENDBYTE:
00F5 753008 204 MOV BITCNT,#8 ; 8 bits in a byte
00F8 D2EE 205 SETB MDE ; to enable SDATA pin as an output
00FA C2ED 206 CLR MCO ; make sure that the clock line is low
00FC 207 SENDBIT:
00FC 33 208 RLC A ; put data bit to be sent into carry
00FD 92EF 209 MOV MDO,C ; put data bit on SDATA line
00FF D2ED 210 SETB MCO ; clock to send bit
0101 C2ED 211 CLR MCO ; clear clock
0103 D530F6 212 DJNZ BITCNT,SENDBIT ; jump back and send all eight bits
213
0106 C2EE 214 CLR MDE ; release data line for acknowledge
0108 D2ED 215 SETB MCO ; send clock for acknowledge
010A 30EC02 216 JNB MDI,NEXT ; this is a check for acknowledge
010D D200 217 SETB NOACK ; no acknowledge, set flag
010F C2ED 218 NEXT: CLR MCO ; clear clock
0111 22 219 RET
220 ;____________________________________________________________________
221 ; RCVBYTE
222 ; receives one byte of data from an I2C slave device. Returns it in A
223
0112 224 RCVBYTE:
0112 753008 225 MOV BITCNT,#8 ; Set bit count.
0115 C2EE 226 CLR MDE ; to enable SDATA pin as an input
0117 C2ED 227 CLR MCO ; make sure the clock line is low
0119 228 RCVBIT:
0119 D2ED 229 SETB MCO ; clock to recieve bit
011B C2ED 230 CLR MCO ; clear clock
011D A2EC 231 MOV C,MDI ; read data bit into carry.
011F 33 232 RLC A ; Rotate bit into result byte.
I2CMSTR PAGE 5
233
0120 D530F6 234 DJNZ BITCNT,RCVBIT ; Repeat until all bits received.
235 ; recieved byte is in the accumulator
236
0123 D2EE 237 SETB MDE ; Data pin =Output for NACK
0125 D2EF 238 SETB MDO ; Send NACK (always send NACK for
239 ; last byte in transmission)
0127 D2ED 240 SETB MCO ; Send NACK clock.
0129 C2ED 241 CLR MCO
012B 22 242 RET
243
244 ;____________________________________________________________________
245 ; DELAY
246 ; DELAY ROUTINE FOR THE ADuC812/ADuC816/ADuC824
012C 247 DELAY: ; Delays by 100ms * A
248
249 ; ADuC812 100ms based on 11.0592MHz Core Clock
250 ; ADuC824 100ms based on 1.573MHz Core Clock
251
012C FA 252 MOV R2,A ; Acc holds delay variable
012D 7BC8 253 DLY0: MOV R3,#200 ; Set up delay loop0
012F 7CE5 254 DLY1: MOV R4,#229 ; Set up delay loop1
0131 DCFE 255 DJNZ R4,$ ; Dec R4 & Jump here until R4 is 0
256 ; wait here for 131*15.3us=2ms
0133 DBFA 257 DJNZ R3,DLY1 ; Dec R3 & Jump DLY1 until R3 is 0
258 ; Wait for 50*2ms
0135 DAF6 259 DJNZ R2,DLY0 ; Dec R2 & Jump DLY0 until R2 is 0
260 ; wait for ACC*100ms
0137 22 261 RET ; Return from subroutine
262 ;____________________________________________________________________
263 ; ERROR
264 ; this subroutine is run if a NACK is received from the slave
265
0138 266 ERROR:
0138 7445 267 MOV A,#45h
013A 12013E 268 CALL SENDCHAR ; send the letter E out the UART
013D 22 269 RET
270 ;____________________________________________________________________
271 ; SENDCHAR
272 ; sends ASCII value contained in A to UART
273
013E 274 SENDCHAR:
013E 3099FD 275 JNB TI,$ ; wait til present char gone
0141 C299 276 CLR TI ; must clear TI
0143 F599 277 MOV SBUF,A
0145 22 278 RET
279 ;____________________________________________________________________
280 ; HEX2ASCII
281 ; converts A into the hex character representing the value of A's
282 ; least significant nibble
283
0146 284 HEX2ASCII:
0146 540F 285 ANL A,#00Fh
0148 B40A00 286 CJNE A,#00Ah,$+3
014B 4002 287 JC IO0030
014D 2407 288 ADD A,#007h
014F 2430 289 IO0030: ADD A,#'0'
0151 22 290 RET
I2CMSTR PAGE 6
291 ;____________________________________________________________________
292 ; SENDVAL
293 ; converts the hex value of A into two ASCII chars, and then spits
294 ; these two characters up the UART. does not change the value of A.
295
0152 296 SENDVAL:
0152 C0E0 297 PUSH ACC
0154 C4 298 SWAP A
0155 3146 299 CALL HEX2ASCII
0157 313E 300 CALL SENDCHAR ; send high nibble
0159 D0E0 301 POP ACC
015B C0E0 302 PUSH ACC
015D 3146 303 CALL HEX2ASCII
015F 313E 304 CALL SENDCHAR ; send low nibble
0161 D0E0 305 POP ACC
0163 22 306 RET
307 ;____________________________________________________________________
308
309 END
VERSION 1.2h ASSEMBLY COMPLETE, 0 ERRORS FOUND
I2CMSTR PAGE 7
ACC. . . . . . . . . . . . . . . D ADDR 00E0H PREDEFINED
BITCNT . . . . . . . . . . . . . D ADDR 0030H
DELAY. . . . . . . . . . . . . . C ADDR 012CH
DLY0 . . . . . . . . . . . . . . C ADDR 012DH
DLY1 . . . . . . . . . . . . . . C ADDR 012FH
EA . . . . . . . . . . . . . . . B ADDR 00AFH PREDEFINED
ERR. . . . . . . . . . . . . . . B ADDR 0000H
ERROR. . . . . . . . . . . . . . C ADDR 0138H
EX0. . . . . . . . . . . . . . . B ADDR 00A8H PREDEFINED
HEX2ASCII. . . . . . . . . . . . C ADDR 0146H
I2CCON . . . . . . . . . . . . . D ADDR 00E8H PREDEFINED
INPUT. . . . . . . . . . . . . . D ADDR 0032H
IO0030 . . . . . . . . . . . . . C ADDR 014FH
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 010FH
NOACK. . . . . . . . . . . . . . B ADDR 0000H
OUTPUT . . . . . . . . . . . . . D ADDR 0033H
P3 . . . . . . . . . . . . . . . D ADDR 00B0H PREDEFINED
RCVBIT . . . . . . . . . . . . . C ADDR 0119H
RCVBYTE. . . . . . . . . . . . . C ADDR 0112H
RCVDATA. . . . . . . . . . . . . C ADDR 00C6H
RCVRET . . . . . . . . . . . . . C ADDR 00E2H
RI . . . . . . . . . . . . . . . B ADDR 0098H PREDEFINED
RXTXLOOP . . . . . . . . . . . . C ADDR 007CH
SBUF . . . . . . . . . . . . . . D ADDR 0099H PREDEFINED
SCON . . . . . . . . . . . . . . D ADDR 0098H PREDEFINED
SENDBIT. . . . . . . . . . . . . C ADDR 00FCH
SENDBYTE . . . . . . . . . . . . C ADDR 00F5H
SENDCHAR . . . . . . . . . . . . C ADDR 013EH
SENDDATA . . . . . . . . . . . . C ADDR 00ADH
SENDERR. . . . . . . . . . . . . C ADDR 008DH
SENDRET. . . . . . . . . . . . . C ADDR 00C5H
SENDVAL. . . . . . . . . . . . . C ADDR 0152H
SKIP . . . . . . . . . . . . . . C ADDR 0092H
SLAVEADD . . . . . . . . . . . . D ADDR 0031H
STARTBIT . . . . . . . . . . . . C ADDR 00E3H
STOPBIT. . . . . . . . . . . . . C ADDR 00ECH
STOPRCV. . . . . . . . . . . . . C ADDR 00DAH
STOPSEND . . . . . . . . . . . . C ADDR 00BDH
T3CON. . . . . . . . . . . . . . D ADDR 009EH PREDEFINED
T3FD . . . . . . . . . . . . . . D ADDR 009DH PREDEFINED
TI . . . . . . . . . . . . . . . B ADDR 0099H PREDEFINED
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -