📄 i2ce2prom.lst
字号:
(0041) SETBIT(I2C_DIR,SDA); // Set SDA to output
114 9A51 SBI 0x0A,1
(0042) CLEARBIT(I2C_PORT,SDA); // Clear SDA
115 9859 CBI 0x0B,1
116 9508 RET
(0043) }
(0044)
(0045)
(0046) // *********************************************** //
(0047) // *** This routine will send the I2C Stop Bit *** //
(0048) // *********************************************** //
(0049)
(0050) void I2C_Stop (void)
(0051) {
(0052)
(0053) SETBIT(I2C_DIR,SDA); // Set SDA to output
_I2C_Stop:
117 9A51 SBI 0x0A,1
(0054)
(0055) CLEARBIT(I2C_PORT,SCL); // Clear SCL
118 9858 CBI 0x0B,0
(0056) CLEARBIT(I2C_PORT,SDA); // Clear SDA
119 9859 CBI 0x0B,1
(0057)
(0058) SETBIT(I2C_PORT,SCL); // Set SCL High
11A 9A58 SBI 0x0B,0
(0059) SETBIT(I2C_PORT,SDA); // Set SDA High
11B 9A59 SBI 0x0B,1
11C 9508 RET
(0060) }
(0061)
(0062)
(0063)
(0064)
(0065)
(0066) // ************************************************** //
(0067) // *** This routine will send the I2C clock pulse *** //
(0068) // ************************************************** //
(0069)
(0070) void I2C_Clock (void)
(0071) {
(0072) SETBIT(I2C_PORT,SCL); // Set SCL high
_I2C_Clock:
11D 9A58 SBI 0x0B,0
(0073) NOP(); // Small Delay
11E 0000 NOP
(0074) CLEARBIT(I2C_PORT,SCL); // Set SCL low
11F 9858 CBI 0x0B,0
120 9508 RET
_Write_I2C_Byte:
i --> R20
byte --> R22
121 934A ST R20,-Y
122 936A ST R22,-Y
123 2F60 MOV R22,R16
(0075) }
(0076)
(0077)
(0078)
(0079)
(0080) // ******************************************************** //
(0081) // *** This routine will write a byte to the I2C device *** //
(0082) // ******************************************************** //
(0083)
(0084) void Write_I2C_Byte(unsigned char byte)
(0085) {
(0086) unsigned char i;
(0087)
(0088) SETBIT(I2C_DIR,SDA); // Set SDA to output
124 9A51 SBI 0x0A,1
(0089) CLEARBIT(I2C_PORT,SCL);
125 9858 CBI 0x0B,0
(0090)
(0091) for (i = 0; i < 8; i++){ // Loop for our 8 bits
126 2744 CLR R20
127 C00B RJMP 0x0133
(0092)
(0093) // Set or Clear SDA pin
(0094) if((byte & 0x80) == 0x80) SETBIT(I2C_PORT, SDA); // Set I2C SDA PIN
128 2F86 MOV R24,R22
129 7880 ANDI R24,0x80
12A 3880 CPI R24,0x80
12B F411 BNE 0x012E
12C 9A59 SBI 0x0B,1
12D C001 RJMP 0x012F
(0095) else CLEARBIT(I2C_PORT,SDA); // Clear I2C SDA PIN
12E 9859 CBI 0x0B,1
(0096)
(0097) SETBIT(I2C_PORT,SCL); // Set SCL High, Clock data
12F 9A58 SBI 0x0B,0
(0098)
(0099) byte = byte << 1; // Shift data in buffer right one
130 0F66 LSL R22
(0100)
(0101) CLEARBIT(I2C_PORT,SCL); // Clear SCL
131 9858 CBI 0x0B,0
132 9543 INC R20
133 3048 CPI R20,0x8
134 F398 BCS 0x0128
(0102) }
(0103)
(0104)
(0105) while(I2C_Ackn() ); // Check for acknowledge from I2C device
135 D019 RCALL _I2C_Ackn
136 2300 TST R16
137 F7E9 BNE 0x0135
138 9169 LD R22,Y+
139 9149 LD R20,Y+
13A 9508 RET
_Read_I2C_Byte:
i --> R22
buff --> R20
13B 934A ST R20,-Y
13C 936A ST R22,-Y
(0106) }
(0107)
(0108)
(0109)
(0110)
(0111)
(0112) // ********************************************************* //
(0113) // *** This routine will read a byte from the I2C device *** //
(0114) // ********************************************************* //
(0115)
(0116) unsigned char Read_I2C_Byte(void)
(0117) {
(0118) unsigned char i,buff = 0;
13D 2744 CLR R20
(0119)
(0120) for (i = 0; i < 8; i++){
13E 2766 CLR R22
13F C008 RJMP 0x0148
(0121)
(0122) buff = buff << 1;
140 0F44 LSL R20
(0123)
(0124) CLEARBIT(I2C_DIR,SDA); // Set SDA to input
141 9851 CBI 0x0A,1
(0125)
(0126) SETBIT(I2C_PORT,SCL); // Set SCL High,Clock bit out
142 9A58 SBI 0x0B,0
(0127)
(0128) // Read data on SDA pin
(0129) if ( CHECKBIT( I2C_IN,SDA ) ) buff = buff | 0x01;
143 9B49 SBIS 0x09,1
144 C001 RJMP 0x0146
145 6041 ORI R20,1
(0130)
(0131) CLEARBIT(I2C_PORT,SCL); // Clear SCL
146 9858 CBI 0x0B,0
147 9563 INC R22
148 3068 CPI R22,0x8
149 F3B0 BCS 0x0140
(0132) }
(0133)
(0134) // *** No ACK *** //
(0135)
(0136) I2C_Clock(); // Clock I2C bit
14A DFD2 RCALL _I2C_Clock
(0137)
(0138) return buff; // Return our I2C byte
14B 2F04 MOV R16,R20
14C 9169 LD R22,Y+
14D 9149 LD R20,Y+
14E 9508 RET
(0139) }
(0140)
(0141)
(0142)
(0143)
(0144) // *********************************************************************** //
(0145) // *** This routine returns a 0 if the I2C device sends an acknowledge *** //
(0146) // *********************************************************************** //
(0147)
(0148) unsigned char I2C_Ackn(void)
(0149) {
(0150) unsigned char Ackn = 0; // Temp RAM for Ackn flag
_I2C_Ackn:
Ackn --> R16
14F 2700 CLR R16
(0151)
(0152) CLEARBIT(I2C_PORT,SCL);
150 9858 CBI 0x0B,0
(0153) CLEARBIT(I2C_DIR,SDA); // Set SDA to input
151 9851 CBI 0x0A,1
(0154)
(0155) SETBIT(I2C_PORT,SCL); // Clock the ACK bit
152 9A58 SBI 0x0B,0
(0156)
(0157) if ( CHECKBIT( I2C_IN,SDA ) ) Ackn = 1; // Check the ACK bit on SDA
153 9B49 SBIS 0x09,1
154 C001 RJMP 0x0156
155 E001 LDI R16,1
(0158)
(0159) CLEARBIT(I2C_PORT,SCL); // Clear the clock
156 9858 CBI 0x0B,0
(0160)
(0161) return Ackn; // Return our ACK bit
157 9508 RET
_Write_I2C_Control:
RW --> Y,+2
H_ADD --> R20
D_Code --> R22
158 934A ST R20,-Y
159 936A ST R22,-Y
15A 2F42 MOV R20,R18
15B 2F60 MOV R22,R16
(0162) }
(0163)
(0164)
(0165)
(0166)
(0167)
(0168) // ***************************************************** //
(0169) // *** This routine will write the I2C device code, *** //
(0170) // *** set the device chip select bits, *** //
(0171) // *** and set or clear the I2C R/W bit *** //
(0172) // ***************************************************** //
(0173)
(0174) void Write_I2C_Control(unsigned char D_Code,unsigned char H_ADD,unsigned char RW)
(0175) {
(0176)
(0177) // *** Send the I2C device Control code *** //
(0178)
(0179) CLEARBIT(I2C_PORT,SCL); // Clear SCL clock
15C 9858 CBI 0x0B,0
(0180)
(0181) if( (D_Code & 0x08) == 0x08) SETBIT(I2C_PORT, SDA); // Set I2C SDA PIN
15D 2F86 MOV R24,R22
15E 7088 ANDI R24,0x8
15F 3088 CPI R24,0x8
160 F411 BNE 0x0163
161 9A59 SBI 0x0B,1
162 C001 RJMP 0x0164
(0182) else CLEARBIT(I2C_PORT,SDA); // Clear I2C SDA PIN
163 9859 CBI 0x0B,1
(0183)
(0184) I2C_Clock(); // Clock I2C bit
164 DFB8 RCALL _I2C_Clock
(0185)
(0186) if( (D_Code & 0x04) == 0x04) SETBIT(I2C_PORT, SDA); // Set I2C SDA PIN
165 2F86 MOV R24,R22
166 7084 ANDI R24,4
167 3084 CPI R24,4
168 F411 BNE 0x016B
169 9A59 SBI 0x0B,1
16A C001 RJMP 0x016C
(0187) else CLEARBIT(I2C_PORT,SDA); // Clear I2C SDA PIN
16B 9859 CBI 0x0B,1
(0188)
(0189) I2C_Clock(); // Clock I2C bit
16C DFB0 RCALL _I2C_Clock
(0190)
(0191) if( (D_Code & 0x02) == 0x02) SETBIT(I2C_PORT, SDA); // Set I2C SDA PIN
16D 2F86 MOV R24,R22
16E 7082 ANDI R24,2
16F 3082 CPI R24,2
170 F411 BNE 0x0173
171 9A59 SBI 0x0B,1
172 C001 RJMP 0x0174
(0192) else CLEARBIT(I2C_PORT,SDA); // Clear I2C SDA PIN
173 9859 CBI 0x0B,1
(0193)
(0194) I2C_Clock(); // Clock I2C bit
174 DFA8 RCALL _I2C_Clock
(0195)
(0196) if( (D_Code & 0x01) == 0x01) SETBIT(I2C_PORT, SDA); // Set I2C SDA PIN
175 2F86 MOV R24,R22
176 7081 ANDI R24,1
177 3081 CPI R24,1
178 F411 BNE 0x017B
179 9A59 SBI 0x0B,1
17A C001 RJMP 0x017C
(0197) else CLEARBIT(I2C_PORT,SDA); // Clear I2C SDA PIN
17B 9859 CBI 0x0B,1
(0198)
(0199) I2C_Clock(); // Clock I2C bit
17C DFA0 RCALL _I2C_Clock
(0200)
(0201)
(0202)
(0203) // *** Send the I2C Control byte chip selects bits *** //
(0204)
(0205) if( (H_ADD & 0x04) == 0x04) SETBIT(I2C_PORT, SDA); // Set I2C SDA PIN
17D 2F84 MOV R24,R20
17E 7084 ANDI R24,4
17F 3084 CPI R24,4
180 F411 BNE 0x0183
181 9A59 SBI 0x0B,1
182 C001 RJMP 0x0184
(0206) else CLEARBIT(I2C_PORT,SDA); // Clear I2C SDA PIN
183 9859 CBI 0x0B,1
(0207)
(0208) I2C_Clock(); // Clock I2C bit
184 DF98 RCALL _I2C_Clock
(0209)
(0210) if( (H_ADD & 0x02) == 0x02) SETBIT(I2C_PORT, SDA); // Set I2C SDA PIN
185 2F84 MOV R24,R20
186 7082 ANDI R24,2
187 3082 CPI R24,2
188 F411 BNE 0x018B
189 9A59 SBI 0x0B,1
18A C001 RJMP 0x018C
(0211) else CLEARBIT(I2C_PORT,SDA); // Clear I2C SDA PIN
18B 9859 CBI 0x0B,1
(0212)
(0213) I2C_Clock(); // Clock I2C bit
18C DF90 RCALL _I2C_Clock
(0214)
(0215) if( (H_ADD & 0x01) == 0x01) SETBIT(I2C_PORT, SDA); // Set I2C SDA PIN
18D 2F84 MOV R24,R20
18E 7081 ANDI R24,1
18F 3081 CPI R24,1
190 F411 BNE 0x0193
191 9A59 SBI 0x0B,1
192 C001 RJMP 0x0194
(0216) else CLEARBIT(I2C_PORT,SDA); // Clear I2C SDA PIN
193 9859 CBI 0x0B,1
(0217)
(0218) I2C_Clock(); // Clock I2C bit
194 DF88 RCALL _I2C_Clock
(0219)
(0220) // *** Set or Clear the read / write bit for I2C control *** //
(0221)
(0222) if(RW) SETBIT(I2C_PORT,SDA); // Set I2C SDA PIN
195 800A LDD R0,Y+2
196 2000 TST R0
197 F011 BEQ 0x019A
198 9A59 SBI 0x0B,1
199 C001 RJMP 0x019B
(0223) else CLEARBIT(I2C_PORT,SDA); // Clear I2C SDA PIN
19A 9859 CBI 0x0B,1
(0224)
(0225) I2C_Clock(); // Clock I2C bit
19B DF81 RCALL _I2C_Clock
(0226)
(0227) while(I2C_Ackn() ); // Check for acknowledge from I2C device
FILE: <library>
19C DFB2 RCALL _I2C_Ackn
19D 2300 TST R16
19E F7E9 BNE 0x019C
19F 9169 LD R22,Y+
1A0 9149 LD R20,Y+
1A1 9508 RET
pop_xgset003C:
1A2 90A9 LD R10,Y+
1A3 90B9 LD R11,Y+
1A4 90C9 LD R12,Y+
1A5 90D9 LD R13,Y+
1A6 9508 RET
push_xgsetF0FC:
1A7 937A ST R23,-Y
1A8 936A ST R22,-Y
push_xgset30FC:
1A9 935A ST R21,-Y
1AA 934A ST R20,-Y
push_xgset00FC:
1AB 92FA ST R15,-Y
1AC 92EA ST R14,-Y
push_xgset003C:
1AD 92DA ST R13,-Y
1AE 92CA ST R12,-Y
1AF 92BA ST R11,-Y
1B0 92AA ST R10,-Y
1B1 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -