⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hjmcu.lss

📁 很实用的单片机例程
💻 LSS
📖 第 1 页 / 共 2 页
字号:
	{
		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 + -