📄 hjmcu.lss
字号:
{
ack = 0; //如果此时SDA为高,说明没有应答信号
166: c0 e0 ldi r28, 0x00 ; 0
PORTB |= 0x04; //没有应答信号,点亮LED2
168: c2 9a sbi 0x18, 2 ; 24
16a: 02 c0 rjmp .+4 ; 0x170 <I2C_WriteByte+0x58>
}
else
{
ack = 1; //如果此时SDA为低,说明有应答信号
16c: c1 e0 ldi r28, 0x01 ; 1
PORTB |= 0x08; //有应答信号,点亮LED3
16e: c3 9a sbi 0x18, 3 ; 24
}
SCL_OUTPUT; //SCL拉低
170: a1 9a sbi 0x14, 1 ; 20
Delayus(10);
172: 8a e0 ldi r24, 0x0A ; 10
174: 90 e0 ldi r25, 0x00 ; 0
176: 0e 94 47 00 call 0x8e <Delayus>
return ack; //返回应答信号
}
17a: 8c 2f mov r24, r28
17c: 99 27 eor r25, r25
17e: cf 91 pop r28
180: 1f 91 pop r17
182: 08 95 ret
00000184 <I2C_ReadByte>:
//从I2C读一个字节
unsigned char I2C_ReadByte(unsigned char ack)
{
184: 0f 93 push r16
186: 1f 93 push r17
188: cf 93 push r28
18a: 08 2f mov r16, r24
unsigned char i,dat = 0; //dat为读出的数据
18c: 10 e0 ldi r17, 0x00 ; 0
SDA_INPUT; //SDA变为输入口
18e: a0 98 cbi 0x14, 0 ; 20
190: c7 e0 ldi r28, 0x07 ; 7
for(i = 0;i < 8;i++) //读出8位(1个字节)数据
{
Delayus(10);
192: 8a e0 ldi r24, 0x0A ; 10
194: 90 e0 ldi r25, 0x00 ; 0
196: 0e 94 47 00 call 0x8e <Delayus>
SCL_OUTPUT; //SCL低,这时允许从I2C发送数据到SDA上
19a: a1 9a sbi 0x14, 1 ; 20
Delayus(10);
19c: 8a e0 ldi r24, 0x0A ; 10
19e: 90 e0 ldi r25, 0x00 ; 0
1a0: 0e 94 47 00 call 0x8e <Delayus>
SCL_INPUT; //SCL高,准备读取SDA上的数据
1a4: a1 98 cbi 0x14, 1 ; 20
Delayus(10);
1a6: 8a e0 ldi r24, 0x0A ; 10
1a8: 90 e0 ldi r25, 0x00 ; 0
1aa: 0e 94 47 00 call 0x8e <Delayus>
dat <<= 1; //读取的数据左移一位,从最高位读起
1ae: 11 0f add r17, r17
if(SDA_INDATA)
1b0: 98 99 sbic 0x13, 0 ; 19
{
dat++; //如果DSA为高,则读取的数据加1
1b2: 1f 5f subi r17, 0xFF ; 255
}
Delayus(10);
1b4: 8a e0 ldi r24, 0x0A ; 10
1b6: 90 e0 ldi r25, 0x00 ; 0
1b8: 0e 94 47 00 call 0x8e <Delayus>
1bc: c1 50 subi r28, 0x01 ; 1
1be: c7 ff sbrs r28, 7
1c0: e8 cf rjmp .-48 ; 0x192 <I2C_ReadByte+0xe>
}
SCL_OUTPUT; //SCL拉低,准备下一个数据变化
1c2: a1 9a sbi 0x14, 1 ; 20
Delayus(10);
1c4: 8a e0 ldi r24, 0x0A ; 10
1c6: 90 e0 ldi r25, 0x00 ; 0
1c8: 0e 94 47 00 call 0x8e <Delayus>
if(!ack) //
1cc: 00 23 and r16, r16
1ce: 11 f4 brne .+4 ; 0x1d4 <I2C_ReadByte+0x50>
{
SDA_INPUT; //发送NACK
1d0: a0 98 cbi 0x14, 0 ; 20
1d2: 01 c0 rjmp .+2 ; 0x1d6 <I2C_ReadByte+0x52>
}
else
{
SDA_OUTPUT; //发送ACK
1d4: a0 9a sbi 0x14, 0 ; 20
}
Delayus(10);
1d6: 8a e0 ldi r24, 0x0A ; 10
1d8: 90 e0 ldi r25, 0x00 ; 0
1da: 0e 94 47 00 call 0x8e <Delayus>
SCL_INPUT; //SCL高
1de: a1 98 cbi 0x14, 1 ; 20
Delayus(10);
1e0: 8a e0 ldi r24, 0x0A ; 10
1e2: 90 e0 ldi r25, 0x00 ; 0
1e4: 0e 94 47 00 call 0x8e <Delayus>
SCL_OUTPUT; //SCL低
1e8: a1 9a sbi 0x14, 1 ; 20
Delayus(10);
1ea: 8a e0 ldi r24, 0x0A ; 10
1ec: 90 e0 ldi r25, 0x00 ; 0
1ee: 0e 94 47 00 call 0x8e <Delayus>
return (dat); //返回读到的数据
}
1f2: 81 2f mov r24, r17
1f4: 99 27 eor r25, r25
1f6: cf 91 pop r28
1f8: 1f 91 pop r17
1fa: 0f 91 pop r16
1fc: 08 95 ret
000001fe <EEPROM_ReadByte>:
//从固定地址读一字节
unsigned char EEPROM_ReadByte(unsigned int add)
{
1fe: 0f 93 push r16
200: 1f 93 push r17
202: 8c 01 movw r16, r24
unsigned char data;
I2C_Start(); //发送起始信号
204: 0e 94 5d 00 call 0xba <I2C_Start>
I2C_WriteByte(EEPROM_BUS_ADDRESS | ((add >> 8) << 1)); //写器件地址和页地址的高3位
208: 81 2f mov r24, r17
20a: 99 27 eor r25, r25
20c: 88 0f add r24, r24
20e: 80 6a ori r24, 0xA0 ; 160
210: 0e 94 8c 00 call 0x118 <I2C_WriteByte>
I2C_WriteByte(add); //写页地址的低4位和页地址内部偏移量
214: 80 2f mov r24, r16
216: 0e 94 8c 00 call 0x118 <I2C_WriteByte>
I2C_Start(); //发送起始信号
21a: 0e 94 5d 00 call 0xba <I2C_Start>
I2C_WriteByte(EEPROM_BUS_ADDRESS | 0x01); //发送读命令
21e: 81 ea ldi r24, 0xA1 ; 161
220: 0e 94 8c 00 call 0x118 <I2C_WriteByte>
data = I2C_ReadByte(0); //读一个字节
224: 80 e0 ldi r24, 0x00 ; 0
226: 0e 94 c2 00 call 0x184 <I2C_ReadByte>
22a: 18 2f mov r17, r24
I2C_Stop(); //发送结束信号
22c: 0e 94 78 00 call 0xf0 <I2C_Stop>
return data;
}
230: 81 2f mov r24, r17
232: 99 27 eor r25, r25
234: 1f 91 pop r17
236: 0f 91 pop r16
238: 08 95 ret
0000023a <Delayms>:
//向固定地址写一字节
void EEPROM_WriteByte(unsigned int add,unsigned char data)
{
I2C_Start(); //发送起始信号
I2C_WriteByte(EEPROM_BUS_ADDRESS | ((add >> 8) << 1)); //写器件地址和页地址的高3位
I2C_WriteByte(add); //写页地址的低4位和页地址内部偏移量
I2C_WriteByte(data); //写一个字节数据
I2C_Stop(); //发送结束信号
Delayms(10);
}
//us级别的延时函数
void Delayus(unsigned int lus)
{
while(lus--)
{
_delay_loop_2(3); //_delay_loop_2(1)是延时4个时钟周期,参数为3则延时12
//个时钟周期,本实验用12M晶体,则12个时钟周期为12/12=1us
}
}
//ms级别的延时函数
void Delayms(unsigned int lms)
{
23a: cf 93 push r28
23c: df 93 push r29
while(lms--)
{
Delayus(1000); //延时1ms
23e: ec 01 movw r28, r24
240: 21 97 sbiw r28, 0x01 ; 1
242: 8f ef ldi r24, 0xFF ; 255
244: cf 3f cpi r28, 0xFF ; 255
246: d8 07 cpc r29, r24
248: 49 f0 breq .+18 ; 0x25c <Delayms+0x22>
24a: 88 ee ldi r24, 0xE8 ; 232
24c: 93 e0 ldi r25, 0x03 ; 3
24e: 0e 94 47 00 call 0x8e <Delayus>
252: 21 97 sbiw r28, 0x01 ; 1
254: 8f ef ldi r24, 0xFF ; 255
256: cf 3f cpi r28, 0xFF ; 255
258: d8 07 cpc r29, r24
25a: b9 f7 brne .-18 ; 0x24a <Delayms+0x10>
25c: df 91 pop r29
25e: cf 91 pop r28
260: 08 95 ret
00000262 <EEPROM_WriteByte>:
262: ff 92 push r15
264: 0f 93 push r16
266: 1f 93 push r17
268: 8c 01 movw r16, r24
26a: f6 2e mov r15, r22
26c: 0e 94 5d 00 call 0xba <I2C_Start>
270: 81 2f mov r24, r17
272: 99 27 eor r25, r25
274: 88 0f add r24, r24
276: 80 6a ori r24, 0xA0 ; 160
278: 0e 94 8c 00 call 0x118 <I2C_WriteByte>
27c: 80 2f mov r24, r16
27e: 0e 94 8c 00 call 0x118 <I2C_WriteByte>
282: 8f 2d mov r24, r15
284: 0e 94 8c 00 call 0x118 <I2C_WriteByte>
288: 0e 94 78 00 call 0xf0 <I2C_Stop>
28c: 8a e0 ldi r24, 0x0A ; 10
28e: 90 e0 ldi r25, 0x00 ; 0
290: 0e 94 1d 01 call 0x23a <Delayms>
294: 1f 91 pop r17
296: 0f 91 pop r16
298: ff 90 pop r15
29a: 08 95 ret
0000029c <main>:
29c: cf e5 ldi r28, 0x5F ; 95
29e: d4 e0 ldi r29, 0x04 ; 4
2a0: de bf out 0x3e, r29 ; 62
2a2: cd bf out 0x3d, r28 ; 61
2a4: 18 ba out 0x18, r1 ; 24
2a6: 8f ef ldi r24, 0xFF ; 255
2a8: 87 bb out 0x17, r24 ; 23
2aa: 0e 94 54 00 call 0xa8 <I2C_Init>
2ae: 6a e5 ldi r22, 0x5A ; 90
2b0: 8a ea ldi r24, 0xAA ; 170
2b2: 91 e0 ldi r25, 0x01 ; 1
2b4: 0e 94 31 01 call 0x262 <EEPROM_WriteByte>
2b8: 8a ea ldi r24, 0xAA ; 170
2ba: 91 e0 ldi r25, 0x01 ; 1
2bc: 0e 94 ff 00 call 0x1fe <EEPROM_ReadByte>
2c0: 8a 35 cpi r24, 0x5A ; 90
2c2: 21 f4 brne .+8 ; 0x2cc <main+0x30>
2c4: 88 b3 in r24, 0x18 ; 24
2c6: 8e 6f ori r24, 0xFE ; 254
2c8: 88 bb out 0x18, r24 ; 24
2ca: 03 c0 rjmp .+6 ; 0x2d2 <main+0x36>
2cc: 88 b3 in r24, 0x18 ; 24
2ce: 8d 6f ori r24, 0xFD ; 253
2d0: 88 bb out 0x18, r24 ; 24
2d2: ff cf rjmp .-2 ; 0x2d2 <main+0x36>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -