📄 twi_slaver.lst
字号:
00FD 3188 CPI R24,0x18
00FE F029 BEQ 0x0104
00FF B101 IN R16,0x01
0100 7F08 ANDI R16,0xF8
0101 DFE6 RCALL _ERROR
0102 2700 CLR R16
0103 C00D RJMP 0x0111
(0059) /*
(0060) //发送EEPROM地址,等待回应,错误检测
(0061) Load(addr);
(0062) if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
(0063) */
(0064) //发送数据,等待回应,错误检测
(0065) Load(data);
0104 2F04 MOV R16,R20
0105 DFD8 RCALL _Load
(0066) if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
0106 B181 IN R24,0x01
0107 7F88 ANDI R24,0xF8
0108 3288 CPI R24,0x28
0109 F029 BEQ 0x010F
010A B101 IN R16,0x01
010B 7F08 ANDI R16,0xF8
010C DFDB RCALL _ERROR
010D 2700 CLR R16
010E C002 RJMP 0x0111
(0067)
(0068) Stop();
010F DFCB RCALL _Stop
(0069) return 1;//发送成功,返回1;
0110 E001 LDI R16,1
0111 D08D RCALL pop_gset1
0112 9508 RET
_ReadByte:
p_data --> R20
addr --> R22
0113 D09F RCALL push_gset2
0114 01A9 MOVW R20,R18
0115 2F60 MOV R22,R16
(0070)
(0071)
(0072)
(0073) }
(0074)
(0075) unsigned char ReadByte(unsigned char addr,
(0076) unsigned char *p_data)
(0077) {
(0078) //启动I2C
(0079) Start();
0116 DFC1 RCALL _Start
(0080) if(STATUS!=START) {ERROR(STATUS);return 0;}
0117 B181 IN R24,0x01
0118 7F88 ANDI R24,0xF8
0119 3088 CPI R24,0x8
011A F029 BEQ 0x0120
011B B101 IN R16,0x01
011C 7F08 ANDI R16,0xF8
011D DFCA RCALL _ERROR
011E 2700 CLR R16
011F C038 RJMP 0x0158
(0081)
(0082) //发送从机地址(写),等待回应, 错误检测
(0083) Load(SLA_W);
0120 E302 LDI R16,0x32
0121 DFBC RCALL _Load
(0084) if(STATUS!=MT_SLA_WRITE_ACK) {ERROR(STATUS);return 0;}
0122 B181 IN R24,0x01
0123 7F88 ANDI R24,0xF8
0124 3188 CPI R24,0x18
0125 F029 BEQ 0x012B
0126 B101 IN R16,0x01
0127 7F08 ANDI R16,0xF8
0128 DFBF RCALL _ERROR
0129 2700 CLR R16
012A C02D RJMP 0x0158
(0085)
(0086) //发送EEPROM地址,等待回应,错误检测
(0087) Load(addr);
012B 2F06 MOV R16,R22
012C DFB1 RCALL _Load
(0088) if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
012D B181 IN R24,0x01
012E 7F88 ANDI R24,0xF8
012F 3288 CPI R24,0x28
0130 F029 BEQ 0x0136
0131 B101 IN R16,0x01
0132 7F08 ANDI R16,0xF8
0133 DFB4 RCALL _ERROR
0134 2700 CLR R16
0135 C022 RJMP 0x0158
(0089)
(0090) //再次启动I2C
(0091) Start();
0136 DFA1 RCALL _Start
(0092) if(STATUS!=RE_START) {ERROR(STATUS);return 0;}
0137 B181 IN R24,0x01
0138 7F88 ANDI R24,0xF8
0139 3180 CPI R24,0x10
013A F029 BEQ 0x0140
013B B101 IN R16,0x01
013C 7F08 ANDI R16,0xF8
013D DFAA RCALL _ERROR
013E 2700 CLR R16
013F C018 RJMP 0x0158
(0093)
(0094) //发送从机地址(读),等待回应, 错误检测
(0095) Load(SLA_R);
0140 E303 LDI R16,0x33
0141 DF9C RCALL _Load
(0096) if(STATUS!=MT_SLA_READ_ACK) {ERROR(STATUS);return 0;}
0142 B181 IN R24,0x01
0143 7F88 ANDI R24,0xF8
0144 3480 CPI R24,0x40
0145 F029 BEQ 0x014B
0146 B101 IN R16,0x01
0147 7F08 ANDI R16,0xF8
0148 DF9F RCALL _ERROR
0149 2700 CLR R16
014A C00D RJMP 0x0158
(0097)
(0098) //读取I2C数据
(0099) Get(p_data);
014B 018A MOVW R16,R20
014C DF95 RCALL _Get
(0100) if(STATUS!=MT_READ_ACK) {ERROR(STATUS);return 0;}
014D B181 IN R24,0x01
014E 7F88 ANDI R24,0xF8
014F 3588 CPI R24,0x58
0150 F029 BEQ 0x0156
0151 B101 IN R16,0x01
0152 7F08 ANDI R16,0xF8
0153 DF94 RCALL _ERROR
0154 2700 CLR R16
0155 C002 RJMP 0x0158
(0101)
(0102) //发送Stop,结束读I2C操作。
(0103) Stop();
0156 DF84 RCALL _Stop
(0104) return 1;
0157 E001 LDI R16,1
0158 D041 RCALL pop_gset2
0159 9508 RET
(0105)
(0106)
(0107)
(0108) }/**/
(0109) void Init_Io(void)
(0110) {
(0111) DDRC&=~((1<<PC4)&(1<<PC5)&(1<<PC2));
_Init_Io:
015A B384 IN R24,0x14
015B 7F8F ANDI R24,0xFF
015C BB84 OUT 0x14,R24
(0112) PORTC|= (1<<PC4)|(1<<PC5)|(1<<PC2);
015D B385 IN R24,0x15
015E 6384 ORI R24,0x34
015F BB85 OUT 0x15,R24
(0113)
(0114) //TWI接口初始化,从器件模式
(0115) TWAR=TWI_ADDRESS | (1<<TWGCE);
0160 E383 LDI R24,0x33
0161 B982 OUT 0x02,R24
(0116) TWCR=(1<<TWEA) | (1<<TWEN)|(1<<TWIE);
0162 E485 LDI R24,0x45
0163 BF86 OUT 0x36,R24
(0117) asm("SEI");
0164 9478 BSET 7
(0118) }
0165 9508 RET
(0119) void main()
(0120) {
(0121) // uchar temp1,temp2;
(0122) Init_Io();
_main:
0166 DFF3 RCALL _Init_Io
(0123) uart_init();
0167 DF67 RCALL _uart_init
(0124) puts("串口正常工作");
0168 E60C LDI R16,0x6C
0169 E010 LDI R17,0
016A DF44 RCALL _puts
(0125) while(1)
016B CFFF RJMP 0x016B
(0126) { /*
(0127) TWCR=(1<<TWINT)|(1<<TWEA) | (1<<TWEN); //启动一次接收
(0128) while((TWCR&(1<<TWINT))==0); //等待有数据被接收
(0129) //Delay_nms(100);
(0130) temp1=STATUS;
(0131) temp2=TWDR;
(0132) //putchar(temp1);
(0133) if(temp1==0x90)
(0134) {
(0135) puts("接受到:");
(0136) putchar(temp2);
(0137) }
(0138) */
(0139)
(0140) }
(0141)
(0142) }
016C 9508 RET
_TWI_ISR:
temp2 --> R20
temp1 --> R22
016D D048 RCALL push_lset
016E D044 RCALL push_gset2
(0143) #pragma interrupt_handler TWI_ISR:18
(0144) void TWI_ISR(void)
(0145) {
(0146) uchar temp1,temp2;
(0147) temp1=STATUS;
016F B161 IN R22,0x01
0170 7F68 ANDI R22,0xF8
(0148) temp2=TWDR;
0171 B143 IN R20,0x03
(0149) if(temp1==0x90)
0172 3960 CPI R22,0x90
0173 F429 BNE 0x0179
(0150) {
(0151) puts("接受到:");
0174 E604 LDI R16,0x64
0175 E010 LDI R17,0
0176 DF38 RCALL _puts
(0152) putchar(temp2);
0177 2F04 MOV R16,R20
0178 DF2E RCALL _putchar
(0153) }
(0154) TWCR=(1<<TWINT)|(1<<TWEA) | (1<<TWEN)|(1<<TWIE); //启动一次接收
0179 EC85 LDI R24,0xC5
017A BF86 OUT 0x36,R24
(0155)
(0156) }
FILE: <library>
017B D01E RCALL pop_gset2
017C D050 RCALL pop_lset
017D 9518 RETI
mod16u:
017E 9468 BSET 6
017F C001 RJMP xdiv16u
div16u:
0180 94E8 BCLR 6
xdiv16u:
0181 92EA ST R14,-Y
0182 92FA ST R15,-Y
0183 938A ST R24,-Y
0184 24EE CLR R14
0185 24FF CLR R15
0186 E180 LDI R24,0x10
0187 0F00 LSL R16
0188 1F11 ROL R17
0189 1CEE ROL R14
018A 1CFF ROL R15
018B 16E2 CP R14,R18
018C 06F3 CPC R15,R19
018D F018 BCS 0x0191
018E 1AE2 SUB R14,R18
018F 0AF3 SBC R15,R19
0190 9503 INC R16
0191 958A DEC R24
0192 F7A1 BNE 0x0187
0193 F416 BRTC 0x0196
0194 2D0E MOV R16,R14
0195 2D1F MOV R17,R15
0196 9189 LD R24,Y+
0197 90F9 LD R15,Y+
0198 90E9 LD R14,Y+
0199 9508 RET
pop_gset2:
019A E0E2 LDI R30,2
019B C004 RJMP pop
push_gset1:
019C 935A ST R21,-Y
019D 934A ST R20,-Y
019E 9508 RET
pop_gset1:
019F E0E1 LDI R30,1
pop:
01A0 9149 LD R20,Y+
01A1 9159 LD R21,Y+
01A2 FDE0 SBRC R30,0
01A3 9508 RET
01A4 9169 LD R22,Y+
01A5 9179 LD R23,Y+
01A6 FDE1 SBRC R30,1
01A7 9508 RET
01A8 90A9 LD R10,Y+
01A9 90B9 LD R11,Y+
01AA FDE2 SBRC R30,2
01AB 9508 RET
01AC 90C9 LD R12,Y+
01AD 90D9 LD R13,Y+
01AE FDE3 SBRC R30,3
01AF 9508 RET
01B0 90E9 LD R14,Y+
01B1 90F9 LD R15,Y+
01B2 9508 RET
push_gset2:
01B3 937A ST R23,-Y
01B4 936A ST R22,-Y
01B5 CFE6 RJMP push_gset1
push_lset:
01B6 93FA ST R31,-Y
01B7 93EA ST R30,-Y
01B8 93BA ST R27,-Y
01B9 93AA ST R26,-Y
01BA 939A ST R25,-Y
01BB 938A ST R24,-Y
01BC 933A ST R19,-Y
01BD 932A ST R18,-Y
01BE 931A ST R17,-Y
01BF 930A ST R16,-Y
01C0 929A ST R9,-Y
01C1 928A ST R8,-Y
01C2 927A ST R7,-Y
01C3 926A ST R6,-Y
01C4 925A ST R5,-Y
01C5 924A ST R4,-Y
01C6 923A ST R3,-Y
01C7 922A ST R2,-Y
01C8 921A ST R1,-Y
01C9 920A ST R0,-Y
01CA B60F IN R0,0x3F
01CB 920A ST R0,-Y
01CC 9508 RET
pop_lset:
01CD 9009 LD R0,Y+
01CE BE0F OUT 0x3F,R0
01CF 9009 LD R0,Y+
01D0 9019 LD R1,Y+
01D1 9029 LD R2,Y+
01D2 9039 LD R3,Y+
01D3 9049 LD R4,Y+
01D4 9059 LD R5,Y+
01D5 9069 LD R6,Y+
01D6 9079 LD R7,Y+
01D7 9089 LD R8,Y+
01D8 9099 LD R9,Y+
01D9 9109 LD R16,Y+
01DA 9119 LD R17,Y+
01DB 9129 LD R18,Y+
01DC 9139 LD R19,Y+
01DD 9189 LD R24,Y+
01DE 9199 LD R25,Y+
01DF 91A9 LD R26,Y+
01E0 91B9 LD R27,Y+
01E1 91E9 LD R30,Y+
01E2 91F9 LD R31,Y+
01E3 9508 RET
asgncblk:
01E4 93AA ST R26,-Y
01E5 93BA ST R27,-Y
01E6 93EA ST R30,-Y
01E7 93FA ST R31,-Y
01E8 920A ST R0,-Y
01E9 81AF LDD R26,Y+7
01EA 85B8 LDD R27,Y+8
01EB 81ED LDD R30,Y+5
01EC 81FE LDD R31,Y+6
01ED 3000 CPI R16,0
01EE 0701 CPC R16,R17
01EF F031 BEQ 0x01F6
01F0 95C8 LPM
01F1 920D ST R0,X+
01F2 9631 ADIW R30,1
01F3 5001 SUBI R16,1
01F4 4010 SBCI R17,0
01F5 CFF7 RJMP 0x01ED
01F6 9009 LD R0,Y+
01F7 91F9 LD R31,Y+
01F8 91E9 LD R30,Y+
01F9 91B9 LD R27,Y+
01FA 91A9 LD R26,Y+
01FB 9624 ADIW R28,4
01FC 9508 RET
<created procedures>:
01FD BF86 OUT 0x36,R24
01FE B626 IN R2,0x36
01FF FE27 SBRS R2,7
0200 CFFD RJMP 0x01FE
0201 9508 RET
0202 E081 LDI R24,1
0203 E090 LDI R25,0
0204 1784 CP R24,R20
0205 0795 CPC R25,R21
0206 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -