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