📄 hard_i2c.lst
字号:
(0193) {
(0194) i2c_ddr|=(1<<SCL); //SCK为输出
_I2C_Ini:
00DE 9AA0 SBI 0x14,0
(0195) i2c_ddr|=(1<<SDA); //SDA为双向的,先设置为输出
00DF 9AA1 SBI 0x14,1
00E0 9508 RET
_i2c_Write:
number --> R20
Wdata --> R22
RomAddress --> R10
00E1 940E0181 CALL push_gset3
00E3 2F62 MOV R22,R18
00E4 2EA0 MOV R10,R16
(0196)
(0197)
(0198) }
(0199)
(0200) /******************************************
(0201) I2C总线写一个字节
(0202) 返回1:写成功
(0203) 返回非1:写失败
(0204) *******************************************/
(0205) unsigned char i2c_Write(unsigned char RomAddress,unsigned char Wdata)
(0206) {unsigned char number=10;
00E5 E04A LDI R20,0xA
00E6 C02F RJMP 0x0116
(0207) while(number--)
(0208) {
(0209) Start();//I2C启动
00E7 EA84 LDI R24,0xA4
00E8 BF86 OUT 0x36,R24
(0210) Wait();
00E9 B626 IN R2,0x36
00EA FE27 SBRS R2,7
00EB CFFD RJMP 0x00E9
(0211) if(TestAck()!=START) continue;//ACK
00EC B181 IN R24,0x01
00ED 7F88 ANDI R24,0xF8
00EE 3088 CPI R24,0x8
00EF F009 BEQ 0x00F1
00F0 C025 RJMP 0x0116
(0212) Write8Bit(wr_device_add);//写I2C从器件地址和写方式
00F1 EA80 LDI R24,0xA0
00F2 B983 OUT 0x03,R24
00F3 E884 LDI R24,0x84
00F4 BF86 OUT 0x36,R24
(0213) Wait();
00F5 B626 IN R2,0x36
00F6 FE27 SBRS R2,7
00F7 CFFD RJMP 0x00F5
(0214)
(0215) if(TestAck()!=MT_SLA_ACK)
00F8 B181 IN R24,0x01
00F9 7F88 ANDI R24,0xF8
00FA 3188 CPI R24,0x18
00FB F029 BEQ 0x0101
(0216) {putchar(0);
00FC 2700 CLR R16
00FD 2711 CLR R17
00FE 940E01CA CALL _putchar
(0217) continue;//ACK
0100 C015 RJMP 0x0116
(0218) }
(0219) Write8Bit(RomAddress);//写24C02的ROM地址
0101 B8A3 OUT 0x03,R10
0102 E884 LDI R24,0x84
0103 BF86 OUT 0x36,R24
(0220) Wait();
0104 B626 IN R2,0x36
0105 FE27 SBRS R2,7
0106 CFFD RJMP 0x0104
(0221) if(TestAck()!=MT_DATA_ACK) continue;//ACK
0107 B181 IN R24,0x01
0108 7F88 ANDI R24,0xF8
0109 3288 CPI R24,0x28
010A F009 BEQ 0x010C
010B C00A RJMP 0x0116
(0222) Write8Bit(Wdata);//写数据到24C02的ROM
010C B963 OUT 0x03,R22
010D E884 LDI R24,0x84
010E BF86 OUT 0x36,R24
(0223) Wait();
010F B626 IN R2,0x36
0110 FE27 SBRS R2,7
0111 CFFD RJMP 0x010F
(0224) if(TestAck()!=MT_DATA_ACK) continue;//ACK
0112 B181 IN R24,0x01
0113 7F88 ANDI R24,0xF8
0114 3288 CPI R24,0x28
0115 F029 BEQ 0x011B
0116 2E24 MOV R2,R20
0117 2433 CLR R3
0118 5041 SUBI R20,1
0119 2022 TST R2
011A F661 BNE 0x00E7
(0225) break;
(0226) }
(0227) Stop();//I2C停止
011B E984 LDI R24,0x94
011C BF86 OUT 0x36,R24
(0228) Delay_ms(10);//延时10ms等EEPROM写完
011D E00A LDI R16,0xA
011E E010 LDI R17,0
011F DF3C RCALL _Delay_ms
(0229) return 1;
0120 E001 LDI R16,1
0121 940E017A CALL pop_gset3
0123 9508 RET
_i2c_Read:
number --> R22
temp --> R20
a --> R10
RomAddress --> R16
0124 940E0181 CALL push_gset3
(0230) }
(0231) /******************************************
(0232) I2C总线读一个字节
(0233)
(0234) *******************************************/
(0235) unsigned char i2c_Read(unsigned char RomAddress)
(0236) {char a=0x00;
0126 24AA CLR R10
(0237) unsigned char temp=0;
0127 2744 CLR R20
(0238) unsigned char number=10;
0128 E06A LDI R22,0xA
0129 C044 RJMP 0x016E
(0239)
(0240) while(number--)
(0241) {
(0242) Start();//I2C启动
012A EA84 LDI R24,0xA4
012B BF86 OUT 0x36,R24
(0243) Wait();
012C B626 IN R2,0x36
012D FE27 SBRS R2,7
012E CFFD RJMP 0x012C
(0244) a=TestAck();
012F B181 IN R24,0x01
0130 7F88 ANDI R24,0xF8
0131 2EA8 MOV R10,R24
(0245)
(0246) if (a!=START) continue;//ACK
0132 3088 CPI R24,0x8
0133 F009 BEQ 0x0135
0134 C039 RJMP 0x016E
(0247)
(0248) Write8Bit(wr_device_add);//写I2C从器件地址和写方式
0135 EA80 LDI R24,0xA0
0136 B983 OUT 0x03,R24
0137 E884 LDI R24,0x84
0138 BF86 OUT 0x36,R24
(0249) Wait();
0139 B626 IN R2,0x36
013A FE27 SBRS R2,7
013B CFFD RJMP 0x0139
(0250)
(0251) if (TestAck()!=MT_SLA_ACK) continue;//ACK
013C B181 IN R24,0x01
013D 7F88 ANDI R24,0xF8
013E 3188 CPI R24,0x18
013F F009 BEQ 0x0141
0140 C02D RJMP 0x016E
(0252)
(0253)
(0254) Write8Bit(RomAddress);//写STA013的ROM地址
0141 B903 OUT 0x03,R16
0142 E884 LDI R24,0x84
0143 BF86 OUT 0x36,R24
(0255) Wait();
0144 B626 IN R2,0x36
0145 FE27 SBRS R2,7
0146 CFFD RJMP 0x0144
(0256)
(0257) if (TestAck()!=MT_DATA_ACK) continue;
0147 B181 IN R24,0x01
0148 7F88 ANDI R24,0xF8
0149 3288 CPI R24,0x28
014A F009 BEQ 0x014C
014B C022 RJMP 0x016E
(0258) Start();//I2C重新启动
014C EA84 LDI R24,0xA4
014D BF86 OUT 0x36,R24
(0259) Wait();
014E B626 IN R2,0x36
014F FE27 SBRS R2,7
0150 CFFD RJMP 0x014E
(0260) if (TestAck()!=RE_START) continue;
0151 B181 IN R24,0x01
0152 7F88 ANDI R24,0xF8
0153 3180 CPI R24,0x10
0154 F009 BEQ 0x0156
0155 C018 RJMP 0x016E
(0261)
(0262) Write8Bit(rd_device_add);//写I2C从器件地址和读方式
0156 EA81 LDI R24,0xA1
0157 B983 OUT 0x03,R24
0158 E884 LDI R24,0x84
0159 BF86 OUT 0x36,R24
(0263) Wait();
015A B626 IN R2,0x36
015B FE27 SBRS R2,7
015C CFFD RJMP 0x015A
(0264)
(0265) if(TestAck()!=MR_SLA_ACK) continue;//ACK
015D B181 IN R24,0x01
015E 7F88 ANDI R24,0xF8
015F 3480 CPI R24,0x40
0160 F009 BEQ 0x0162
0161 C00C RJMP 0x016E
(0266) Twi();//启动主I2C读方式
0162 E884 LDI R24,0x84
0163 BF86 OUT 0x36,R24
(0267)
(0268) Wait();
0164 B626 IN R2,0x36
0165 FE27 SBRS R2,7
0166 CFFD RJMP 0x0164
(0269)
(0270) if(TestAck()!=MR_DATA_NOACK) continue;//ACK
0167 B181 IN R24,0x01
0168 7F88 ANDI R24,0xF8
0169 3588 CPI R24,0x58
016A F009 BEQ 0x016C
016B C002 RJMP 0x016E
(0271) temp=TWDR;//读取I2C接收数据
016C B143 IN R20,0x03
(0272)
(0273) break;
016D C006 RJMP 0x0174
016E 2E26 MOV R2,R22
016F 2433 CLR R3
0170 5061 SUBI R22,1
0171 2022 TST R2
0172 F009 BEQ 0x0174
0173 CFB6 RJMP 0x012A
(0274) }
(0275) Stop();//I2C停止
0174 E984 LDI R24,0x94
0175 BF86 OUT 0x36,R24
(0276)
(0277) return temp;
FILE: <library>
0176 2F04 MOV R16,R20
0177 940E017A CALL pop_gset3
0179 9508 RET
pop_gset3:
017A E0E4 LDI R30,4
017B 940C0189 JMP pop
push_gset5:
017D 92FA ST R15,-Y
017E 92EA ST R14,-Y
push_gset4:
017F 92DA ST R13,-Y
0180 92CA ST R12,-Y
push_gset3:
0181 92BA ST R11,-Y
0182 92AA ST R10,-Y
push_gset2:
0183 937A ST R23,-Y
0184 936A ST R22,-Y
push_gset1:
0185 935A ST R21,-Y
0186 934A ST R20,-Y
0187 9508 RET
pop_gset1:
0188 E0E1 LDI R30,1
pop:
0189 9149 LD R20,Y+
018A 9159 LD R21,Y+
018B FDE0 SBRC R30,0
018C 9508 RET
018D 9169 LD R22,Y+
018E 9179 LD R23,Y+
018F FDE1 SBRC R30,1
0190 9508 RET
0191 90A9 LD R10,Y+
0192 90B9 LD R11,Y+
0193 FDE2 SBRC R30,2
0194 9508 RET
0195 90C9 LD R12,Y+
0196 90D9 LD R13,Y+
0197 FDE3 SBRC R30,3
0198 9508 RET
0199 90E9 LD R14,Y+
019A 90F9 LD R15,Y+
019B 9508 RET
push_lset:
019C 93FA ST R31,-Y
019D 93EA ST R30,-Y
019E 93BA ST R27,-Y
019F 93AA ST R26,-Y
01A0 939A ST R25,-Y
01A1 938A ST R24,-Y
01A2 933A ST R19,-Y
01A3 932A ST R18,-Y
01A4 931A ST R17,-Y
01A5 930A ST R16,-Y
01A6 929A ST R9,-Y
01A7 928A ST R8,-Y
01A8 927A ST R7,-Y
01A9 926A ST R6,-Y
01AA 925A ST R5,-Y
01AB 924A ST R4,-Y
01AC 923A ST R3,-Y
01AD 922A ST R2,-Y
01AE 921A ST R1,-Y
01AF 920A ST R0,-Y
01B0 B60F IN R0,0x3F
01B1 920A ST R0,-Y
01B2 9508 RET
pop_lset:
01B3 9009 LD R0,Y+
01B4 BE0F OUT 0x3F,R0
01B5 9009 LD R0,Y+
01B6 9019 LD R1,Y+
01B7 9029 LD R2,Y+
01B8 9039 LD R3,Y+
01B9 9049 LD R4,Y+
01BA 9059 LD R5,Y+
01BB 9069 LD R6,Y+
01BC 9079 LD R7,Y+
01BD 9089 LD R8,Y+
01BE 9099 LD R9,Y+
01BF 9109 LD R16,Y+
01C0 9119 LD R17,Y+
01C1 9129 LD R18,Y+
01C2 9139 LD R19,Y+
01C3 9189 LD R24,Y+
01C4 9199 LD R25,Y+
01C5 91A9 LD R26,Y+
01C6 91B9 LD R27,Y+
01C7 91E9 LD R30,Y+
01C8 91F9 LD R31,Y+
01C9 9508 RET
_putchar:
01CA 940E0185 CALL push_gset1
01CC 2F40 MOV R20,R16
01CD 90200073 LDS R2,_textmode
01CF 90300074 LDS R3,_textmode+1
01D1 2022 TST R2
01D2 F411 BNE 0x01D5
01D3 2033 TST R3
01D4 F021 BEQ 0x01D9
01D5 304A CPI R20,0xA
01D6 F411 BNE 0x01D9
01D7 E00D LDI R16,0xD
01D8 DFF1 RCALL _putchar
01D9 9B5D SBIS 0x0B,5
01DA CFFE RJMP 0x01D9
01DB B94C OUT 0x0C,R20
01DC 2F04 MOV R16,R20
01DD 2711 CLR R17
01DE 940E0188 CALL pop_gset1
01E0 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -