📄 m16i2c.lst
字号:
(0345)
(0346) if( I2C_SendDat(wordAdr)==I2C_ERR )
016D 2F04 MOV R16,R20
016E DF73 RCALL _I2C_SendDat
016F 2300 TST R16
0170 F411 BNE 0x0173
(0347) return I2C_ERR;
0171 2700 CLR R16
0172 C015 RJMP 0x0188
(0348)
(0349) if( I2C_Restart()==I2C_ERR )
0173 DF11 RCALL _I2C_Restart
0174 2300 TST R16
0175 F411 BNE 0x0178
(0350) return I2C_ERR;
0176 2700 CLR R16
0177 C010 RJMP 0x0188
(0351)
(0352) if( I2C_SendRdDAdr(rdDAdr)==I2C_ERR )
0178 810C LDD R16,Y+4
0179 DF40 RCALL _I2C_SendRdDAdr
017A 2300 TST R16
017B F411 BNE 0x017E
(0353) return I2C_ERR;
017C 2700 CLR R16
017D C00A RJMP 0x0188
(0354)
(0355) if( I2C_RcvNAckDat(pRdDat)==I2C_ERR )
017E 810E LDD R16,Y+6
017F 811F LDD R17,Y+7
0180 DF6F RCALL _I2C_RcvNAckDat
0181 2300 TST R16
0182 F411 BNE 0x0185
(0356) return I2C_ERR;
0183 2700 CLR R16
0184 C003 RJMP 0x0188
(0357)
(0358) I2C_Stop();
0185 E984 LDI R24,0x94
0186 BF86 OUT 0x36,R24
(0359)
(0360) return I2C_CRR;
0187 E001 LDI R16,1
0188 940E0245 CALL pop_gset2
018A 9508 RET
_I2C_Read_:
i --> R20
num --> R22
pRdDat --> R10
rdDAdr --> Y+8
wordAdr --> R20
wrDAdr --> R12
018B 940E024D CALL push_gset4
018D 2F42 MOV R20,R18
018E 0168 MOVW R12,R16
018F 84AA LDD R10,Y+10
0190 84BB LDD R11,Y+11
0191 856C LDD R22,Y+12
(0361) }
(0362) /*--------------------------------------------------------------------
(0363) 函数名称:I2C读器件,读N个数据
(0364) 函数功能:
(0365) 注意事项:
(0366) 提示说明:
(0367) 输 入:wrDAdr: write device-address 写器件地址
(0368) wordAdr: word address 字地址
(0369) rdDAdr: read device-address 读器件地址
(0370) *pRdDat: p->read data 读取数据指针
(0371) num: number 读取数据个数
(0372) 返 回:
(0373) --------------------------------------------------------------------*/
(0374) bool I2C_Read_(uint16 wrDAdr,uint8 wordAdr,
(0375) uint8 rdDAdr,uint8 *pRdDat,uint8 num)
(0376) {
(0377) uint8 i;
(0378)
(0379) if( I2C_Start()==I2C_ERR )
0192 DEE5 RCALL _I2C_Start
0193 2300 TST R16
0194 F411 BNE 0x0197
(0380) return I2C_ERR;
0195 2700 CLR R16
0196 C033 RJMP 0x01CA
(0381)
(0382) if( I2C_SendWrDAdr_(wrDAdr)==I2C_ERR )
0197 0186 MOVW R16,R12
0198 DF07 RCALL _I2C_SendWrDAdr_
0199 2300 TST R16
019A F411 BNE 0x019D
(0383) return I2C_ERR;
019B 2700 CLR R16
019C C02D RJMP 0x01CA
(0384)
(0385) if( I2C_SendDat(wordAdr)==I2C_ERR )
019D 2F04 MOV R16,R20
019E DF43 RCALL _I2C_SendDat
019F 2300 TST R16
01A0 F411 BNE 0x01A3
(0386) return I2C_ERR;
01A1 2700 CLR R16
01A2 C027 RJMP 0x01CA
(0387)
(0388) if( I2C_Restart()==I2C_ERR )
01A3 DEE1 RCALL _I2C_Restart
01A4 2300 TST R16
01A5 F411 BNE 0x01A8
(0389) return I2C_ERR;
01A6 2700 CLR R16
01A7 C022 RJMP 0x01CA
(0390)
(0391) if( I2C_SendRdDAdr(rdDAdr)==I2C_ERR )
01A8 8508 LDD R16,Y+8
01A9 DF10 RCALL _I2C_SendRdDAdr
01AA 2300 TST R16
01AB F411 BNE 0x01AE
(0392) return I2C_ERR;
01AC 2700 CLR R16
01AD C01C RJMP 0x01CA
(0393)
(0394) for(i=0;i<num-1;i++)
01AE 2744 CLR R20
01AF C00A RJMP 0x01BA
(0395) if( I2C_RcvAckDat(pRdDat+i)==I2C_ERR )
01B0 2F04 MOV R16,R20
01B1 2711 CLR R17
01B2 0D0A ADD R16,R10
01B3 1D1B ADC R17,R11
01B4 DF4B RCALL _I2C_RcvAckDat
01B5 2300 TST R16
01B6 F411 BNE 0x01B9
(0396) return I2C_ERR;
01B7 2700 CLR R16
01B8 C011 RJMP 0x01CA
01B9 9543 INC R20
01BA 2F86 MOV R24,R22
01BB 5081 SUBI R24,1
01BC 1748 CP R20,R24
01BD F390 BCS 0x01B0
(0397)
(0398) if( I2C_RcvNAckDat(pRdDat+i)==I2C_ERR )
01BE 2F04 MOV R16,R20
01BF 2711 CLR R17
01C0 0D0A ADD R16,R10
01C1 1D1B ADC R17,R11
01C2 DF2D RCALL _I2C_RcvNAckDat
01C3 2300 TST R16
01C4 F411 BNE 0x01C7
(0399) return I2C_ERR;
01C5 2700 CLR R16
01C6 C003 RJMP 0x01CA
(0400)
(0401) I2C_Stop();
01C7 E984 LDI R24,0x94
01C8 BF86 OUT 0x36,R24
(0402)
(0403) return I2C_CRR;
01C9 E001 LDI R16,1
01CA 940E0248 CALL pop_gset4
01CC 9508 RET
FILE: F:\job\M16学习板\I2C读写24C02(实验十)\M16I2CRW24C02.c
(0001) /*******************************************************************
(0002) 实验十
(0003) 实验名称: I2C读写24C02实验
(0004) 实验目的: 学习AVR单片机的TWI功能
(0005) 实验现象: 先在24C02中写入一段数据,然后断电,再送电,将EEPROM中的数据发
(0006) 送给PC机
(0007) 环 境: ICCAVR6.31A
(0008) 设 计 者: shinea8868
(0009) 说 明: 部分程序原型源自网络,经本人修改调试可用,请尊重知识产权,如
(0010) 作商业用途请保留本段文字
(0011) 完成日期: 2007年4月10日
(0012) *******************************************************************/
(0013) #include <iom16v.h>
(0014) #include <macros.h>
(0015) #include "..\ICC_H\SOFTWARE.H"
(0016) #include "..\ICC_H\I2C.H"
(0017)
(0018) //设定读写地址
(0019) #define WADD24C02 0xa0 //写字节命令及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 0
(0020) #define RADD24C02 0xa1 //读命令字节及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 1
(0021) /*-----------------------------------------------------------------
(0022) 函数名称: void Uart0Init(void)
(0023) 函数功能: 串口初始化
(0024) 波特率 600 0.2% 字符长度 8bit 无奇偶校验
(0025) 参 数:
(0026) 返 回 值: 无
(0027) -----------------------------------------------------------------*/
(0028) void Uart0Init(void)
(0029) {
(0030) UCSRB = 0x00; //关串口
_Uart0Init:
01CD 2422 CLR R2
01CE B82A OUT 0x0A,R2
(0031) UCSRA = 0x02; //倍速模式 M16中文P151
01CF E082 LDI R24,2
01D0 B98B OUT 0x0B,R24
(0032) UCSRC = BIT(URSEL) | 0x06; //写UCSRC寄存器,设定8个bit
01D1 E886 LDI R24,0x86
01D2 BD80 OUT 0x20,R24
(0033) UBRR = 12; //设定串口波特率为600
01D3 E08C LDI R24,0xC
01D4 B989 OUT 0x09,R24
(0034) UCSRB = 0x98; //开串口
01D5 E988 LDI R24,0x98
01D6 B98A OUT 0x0A,R24
01D7 9508 RET
_UartRecvData:
temp1 --> R16
01D8 930A ST R16,-Y
01D9 B70F IN R16,0x3F
01DA 930A ST R16,-Y
(0035) }
(0036) /*-----------------------------------------------------------------
(0037) 函数名称: void UartRecvData(void)
(0038) 函数功能:
(0039) 参 数:
(0040) 返 回 值: 无
(0041) -----------------------------------------------------------------*/
(0042) #pragma interrupt_handler UartRecvData:12
(0043) void UartRecvData(void)
(0044) {
(0045) uchar temp1;
(0046) temp1 = UDR;
01DB B10C IN R16,0x0C
01DC 9109 LD R16,Y+
01DD BF0F OUT 0x3F,R16
01DE 9109 LD R16,Y+
01DF 9518 RETI
_UartTransmitData:
i --> R20
len --> R18
SendData --> R16
01E0 940E0253 CALL push_gset1
(0047) }
(0048) /*-----------------------------------------------------------------
(0049) 函数名称: void UartTransmitData(uchar *SendData, uchar len)
(0050) 函数功能: 发送字符串
(0051) 参 数: SendData 发送字符串的首地址
(0052) len 发送字符串的长度
(0053) 返 回 值: 无
(0054) -----------------------------------------------------------------*/
(0055) void UartTransmitData(uchar *SendData, uint len)
(0056) {
(0057) uint i;
(0058) for( i = 0; i < len; i++)
01E2 2744 CLR R20
01E3 2755 CLR R21
01E4 C009 RJMP 0x01EE
(0059) {
(0060) while(!(UCSRA&0x20)); //判断数据寄存器是否为空
01E5 9B5D SBIS 0x0B,5
01E6 CFFE RJMP 0x01E5
(0061) UDR = SendData[i];
01E7 01FA MOVW R30,R20
01E8 0FE0 ADD R30,R16
01E9 1FF1 ADC R31,R17
01EA 8020 LDD R2,Z+0
01EB B82C OUT 0x0C,R2
01EC 5F4F SUBI R20,0xFF
01ED 4F5F SBCI R21,0xFF
01EE 1742 CP R20,R18
01EF 0753 CPC R21,R19
01F0 F3A0 BCS 0x01E5
01F1 940E0256 CALL pop_gset1
01F3 9508 RET
(0062) }
(0063) }
(0064) /*-----------------------------------------------------------------
(0065) 函数名称: void InitDevices(void)
(0066) 函数功能: 初始化各种信息
(0067) 参 数:
(0068) 返 回 值: 无
(0069) -----------------------------------------------------------------*/
(0070) void InitDevices(void)
(0071) {
(0072) CLI(); //关全部中断
_InitDevices:
01F4 94F8 BCLR 7
(0073) Uart0Init();
01F5 DFD7 RCALL _Uart0Init
(0074) SEI(); //开全中断
01F6 9478 BSET 7
01F7 9508 RET
_main:
temp2 --> Y+5
j --> R20
i --> R22
01F8 972D SBIW R28,0xD
(0075) }
(0076)
(0077) void main(void)
(0078) {
(0079)
(0080) /*第一次写程序*/
(0081) /* uchar temp[] = "abcdefgh"; //上电初始化24C02中的数据,
(0082) I2C_Write_(WADD24C02,0,temp,8); //断电后屏蔽初始化程序,打开下面的程序*/
(0083) uchar i,temp2[8];
(0084) uint j;
(0085) j = 2000;
01F9 ED40 LDI R20,0xD0
01FA E057 LDI R21,7
(0086) InitDevices();
01FB DFF8 RCALL _InitDevices
(0087) while(j --);
01FC 011A MOVW R2,R20
01FD 5041 SUBI R20,1
01FE 4050 SBCI R21,0
01FF 2022 TST R2
0200 F7D9 BNE 0x01FC
0201 2033 TST R3
0202 F7C9 BNE 0x01FC
(0088) {
(0089) i = 167;
0203 EA67 LDI R22,0xA7
(0090) while(i--);
0204 2E26 MOV R2,R22
0205 2433 CLR R3
0206 5061 SUBI R22,1
0207 2022 TST R2
0208 F7D9 BNE 0x0204
(0091) }
(0092) I2C_Read_(WADD24C02,0x00,RADD24C02,temp2,8);
0209 E088 LDI R24,0x8
020A 838C STD Y+4,R24
020B 01CE MOVW R24,R28
020C 9605 ADIW R24,5
020D 839B STD Y+3,R25
020E 838A STD Y+2,R24
020F EA81 LDI R24,0xA1
0210 8388 STD Y+0,R24
0211 2722 CLR R18
0212 EA00 LDI R16,0xA0
0213 E010 LDI R17,0
0214 DF76 RCALL _I2C_Read_
(0093) j = 2000;
0215 ED40 LDI R20,0xD0
0216 E057 LDI R21,7
(0094) while(j --);
0217 011A MOVW R2,R20
0218 5041 SUBI R20,1
0219 4050 SBCI R21,0
021A 2022 TST R2
021B F7D9 BNE 0x0217
021C 2033 TST R3
021D F7C9 BNE 0x0217
(0095) {
(0096) i = 167;
021E EA67 LDI R22,0xA7
(0097) while(i--);
021F 2E26 MOV R2,R22
0220 2433 CLR R3
0221 5061 SUBI R22,1
0222 2022 TST R2
0223 F7D9 BNE 0x021F
(0098) }
(0099) UartTransmitData(temp2, 8);
0224 E028 LDI R18,0x8
0225 E030 LDI R19,0
0226 018E MOVW R16,R28
0227 5F0B SUBI R16,0xFB
0228 4F1F SBCI R17,0xFF
0229 DFB6 RCALL _UartTransmitData
(0100) while(1);
FILE: <library>
022A CFFF RJMP 0x022A
022B 962D ADIW R28,0xD
022C 9508 RET
mod8u:
022D 9468 BSET 6
022E C001 RJMP xdiv8u
div8u:
022F 94E8 BCLR 6
xdiv8u:
0230 932A ST R18,-Y
0231 92FA ST R15,-Y
0232 92EA ST R14,-Y
0233 24FF CLR R15
0234 24EE CLR R14
0235 E120 LDI R18,0x10
0236 0F00 LSL R16
0237 1CFF ROL R15
0238 1CEE ROL R14
0239 16E1 CP R14,R17
023A F010 BCS 0x023D
023B 1AE1 SUB R14,R17
023C 9503 INC R16
023D 952A DEC R18
023E F7B9 BNE 0x0236
023F F40E BRTC 0x0241
0240 2D0E MOV R16,R14
0241 90E9 LD R14,Y+
0242 90F9 LD R15,Y+
0243 9129 LD R18,Y+
0244 9508 RET
pop_gset2:
0245 E0E2 LDI R30,2
0246 940C0257 JMP pop
pop_gset4:
0248 E0E8 LDI R30,0x8
0249 940C0257 JMP pop
push_gset5:
024B 92FA ST R15,-Y
024C 92EA ST R14,-Y
push_gset4:
024D 92DA ST R13,-Y
024E 92CA ST R12,-Y
push_gset3:
024F 92BA ST R11,-Y
0250 92AA ST R10,-Y
push_gset2:
0251 937A ST R23,-Y
0252 936A ST R22,-Y
push_gset1:
0253 935A ST R21,-Y
0254 934A ST R20,-Y
0255 9508 RET
pop_gset1:
0256 E0E1 LDI R30,1
pop:
0257 9149 LD R20,Y+
0258 9159 LD R21,Y+
0259 FDE0 SBRC R30,0
025A 9508 RET
025B 9169 LD R22,Y+
025C 9179 LD R23,Y+
025D FDE1 SBRC R30,1
025E 9508 RET
025F 90A9 LD R10,Y+
0260 90B9 LD R11,Y+
0261 FDE2 SBRC R30,2
0262 9508 RET
0263 90C9 LD R12,Y+
0264 90D9 LD R13,Y+
0265 FDE3 SBRC R30,3
0266 9508 RET
0267 90E9 LD R14,Y+
0268 90F9 LD R15,Y+
0269 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -