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

📄 main.lss

📁 MAXIM的DS3231时钟,温度都具备的芯片.驱动IC为AVRmega16或者mega32.全功能.内附全部驱动程序.绝对原创.
💻 LSS
📖 第 1 页 / 共 3 页
字号:
{
	__asm__ volatile (
 21a:	e0 e0       	ldi	r30, 0x00	; 0
 21c:	f6 e3       	ldi	r31, 0x36	; 54
 21e:	31 97       	sbiw	r30, 0x01	; 1
 220:	f1 f7       	brne	.-4      	; 0x21e <DS3231TWIRead+0xbe>
	_delay_ms(5);
	return data;
}
 222:	99 27       	eor	r25, r25
 224:	08 95       	ret

00000226 <DS3231TWIWrite>:

void DS3231TWIWrite(unsigned int addr,unsigned char data)	//从设备接收模式 DS3231写模式
{
 226:	9c 01       	movw	r18, r24
	TWIStart();			//发开始信号
 228:	84 ea       	ldi	r24, 0xA4	; 164
 22a:	86 bf       	out	0x36, r24	; 54
	CheckTWINT();		//等待结束
 22c:	06 b6       	in	r0, 0x36	; 54
 22e:	07 fe       	sbrs	r0, 7
 230:	fd cf       	rjmp	.-6      	; 0x22c <DS3231TWIWrite+0x6>
	if((TWSR&0xF8)!=0x08)ERROR();
 232:	81 b1       	in	r24, 0x01	; 1
 234:	88 7f       	andi	r24, 0xF8	; 248
 236:	88 30       	cpi	r24, 0x08	; 8
 238:	29 f0       	breq	.+10     	; 0x244 <DS3231TWIWrite+0x1e>
 23a:	81 e0       	ldi	r24, 0x01	; 1
 23c:	80 93 34 01 	sts	0x0134, r24
 240:	84 e9       	ldi	r24, 0x94	; 148
 242:	86 bf       	out	0x36, r24	; 54
	TWDR=DS3231ADDR;	//TWDR=DS3231ADDR+CMD_WRITE;//发送SLA设备地址+写命令
 244:	80 ed       	ldi	r24, 0xD0	; 208
 246:	83 b9       	out	0x03, r24	; 3
	TWCR=(1<<TWINT)|(1<<TWEN);
 248:	84 e8       	ldi	r24, 0x84	; 132
 24a:	86 bf       	out	0x36, r24	; 54
	CheckTWINT();		//等待结束
 24c:	06 b6       	in	r0, 0x36	; 54
 24e:	07 fe       	sbrs	r0, 7
 250:	fd cf       	rjmp	.-6      	; 0x24c <DS3231TWIWrite+0x26>
	if((TWSR&0xF8)!=0x18)ERROR();
 252:	81 b1       	in	r24, 0x01	; 1
 254:	88 7f       	andi	r24, 0xF8	; 248
 256:	88 31       	cpi	r24, 0x18	; 24
 258:	29 f0       	breq	.+10     	; 0x264 <DS3231TWIWrite+0x3e>
 25a:	81 e0       	ldi	r24, 0x01	; 1
 25c:	80 93 34 01 	sts	0x0134, r24
 260:	84 e9       	ldi	r24, 0x94	; 148
 262:	86 bf       	out	0x36, r24	; 54
	TWDR=addr;			//发送读取地址
 264:	23 b9       	out	0x03, r18	; 3
	TWCR=(1<<TWINT)|(1<<TWEN);
 266:	84 e8       	ldi	r24, 0x84	; 132
 268:	86 bf       	out	0x36, r24	; 54
	CheckTWINT();
 26a:	06 b6       	in	r0, 0x36	; 54
 26c:	07 fe       	sbrs	r0, 7
 26e:	fd cf       	rjmp	.-6      	; 0x26a <DS3231TWIWrite+0x44>
	if((TWSR&0xF8)!=0x28)ERROR();
 270:	81 b1       	in	r24, 0x01	; 1
 272:	88 7f       	andi	r24, 0xF8	; 248
 274:	88 32       	cpi	r24, 0x28	; 40
 276:	29 f0       	breq	.+10     	; 0x282 <DS3231TWIWrite+0x5c>
 278:	81 e0       	ldi	r24, 0x01	; 1
 27a:	80 93 34 01 	sts	0x0134, r24
 27e:	84 e9       	ldi	r24, 0x94	; 148
 280:	86 bf       	out	0x36, r24	; 54
	TWDR=data;
 282:	63 b9       	out	0x03, r22	; 3
	TWCR=(1<<TWINT)|(1<<TWEN);
 284:	84 e8       	ldi	r24, 0x84	; 132
 286:	86 bf       	out	0x36, r24	; 54
	CheckTWINT();
 288:	06 b6       	in	r0, 0x36	; 54
 28a:	07 fe       	sbrs	r0, 7
 28c:	fd cf       	rjmp	.-6      	; 0x288 <DS3231TWIWrite+0x62>
	if((TWSR&0xF8)!=0x28)ERROR();
 28e:	81 b1       	in	r24, 0x01	; 1
 290:	88 7f       	andi	r24, 0xF8	; 248
 292:	88 32       	cpi	r24, 0x28	; 40
 294:	29 f0       	breq	.+10     	; 0x2a0 <DS3231TWIWrite+0x7a>
 296:	81 e0       	ldi	r24, 0x01	; 1
 298:	80 93 34 01 	sts	0x0134, r24
 29c:	84 e9       	ldi	r24, 0x94	; 148
 29e:	86 bf       	out	0x36, r24	; 54
	TWIStop();			//发送STOP 信号
 2a0:	84 e9       	ldi	r24, 0x94	; 148
 2a2:	86 bf       	out	0x36, r24	; 54
 */
void
_delay_loop_2(uint16_t __count)
{
	__asm__ volatile (
 2a4:	80 e0       	ldi	r24, 0x00	; 0
 2a6:	96 e3       	ldi	r25, 0x36	; 54
 2a8:	01 97       	sbiw	r24, 0x01	; 1
 2aa:	f1 f7       	brne	.-4      	; 0x2a8 <DS3231TWIWrite+0x82>
 2ac:	08 95       	ret

000002ae <DS3231Init>:
 2ae:	8b e0       	ldi	r24, 0x0B	; 11
 2b0:	80 b9       	out	0x00, r24	; 0
 2b2:	11 b8       	out	0x01, r1	; 1
 2b4:	6c e1       	ldi	r22, 0x1C	; 28
 2b6:	8e e0       	ldi	r24, 0x0E	; 14
 2b8:	90 e0       	ldi	r25, 0x00	; 0
 2ba:	0e 94 13 01 	call	0x226	; 0x226 <DS3231TWIWrite>
 2be:	60 e0       	ldi	r22, 0x00	; 0
 2c0:	8f e0       	ldi	r24, 0x0F	; 15
 2c2:	90 e0       	ldi	r25, 0x00	; 0
 2c4:	0e 94 13 01 	call	0x226	; 0x226 <DS3231TWIWrite>
 2c8:	08 95       	ret

000002ca <DS3231ReadTime>:
	_delay_ms(5);
}

void DS3231ReadTime(void)		//此处需要连续读写
{
 2ca:	1f 93       	push	r17
 2cc:	cf 93       	push	r28
 2ce:	df 93       	push	r29
 2d0:	16 e0       	ldi	r17, 0x06	; 6
 2d2:	ce e3       	ldi	r28, 0x3E	; 62
 2d4:	d1 e0       	ldi	r29, 0x01	; 1
	unsigned char i;
	unsigned char command=CMD_YEAR;
	for(i=0;i<7;i++)CURDATE[i]=DS3231TWIRead(command--);		//依次读取:年\月\日\周\时\分\秒
 2d6:	81 2f       	mov	r24, r17
 2d8:	99 27       	eor	r25, r25
 2da:	11 50       	subi	r17, 0x01	; 1
 2dc:	0e 94 b0 00 	call	0x160	; 0x160 <DS3231TWIRead>
 2e0:	89 93       	st	Y+, r24
 2e2:	1f 3f       	cpi	r17, 0xFF	; 255
 2e4:	c1 f7       	brne	.-16     	; 0x2d6 <DS3231ReadTime+0xc>
 2e6:	df 91       	pop	r29
 2e8:	cf 91       	pop	r28
 2ea:	1f 91       	pop	r17
 2ec:	08 95       	ret

000002ee <DS3231WriteTime>:
}

void DS3231WriteTime(void)		//此处需要连续读写
{
 2ee:	1f 93       	push	r17
 2f0:	cf 93       	push	r28
 2f2:	df 93       	push	r29
 2f4:	16 e0       	ldi	r17, 0x06	; 6
 2f6:	cc ec       	ldi	r28, 0xCC	; 204
 2f8:	d0 e0       	ldi	r29, 0x00	; 0
	unsigned char i;
	unsigned char command=CMD_YEAR;
	for(i=0;i<7;i++)DS3231TWIWrite(command--,RealTimeDate[i]);//依次写入:年\周\月\日\时\分\秒
 2fa:	81 2f       	mov	r24, r17
 2fc:	99 27       	eor	r25, r25
 2fe:	11 50       	subi	r17, 0x01	; 1
 300:	69 91       	ld	r22, Y+
 302:	0e 94 13 01 	call	0x226	; 0x226 <DS3231TWIWrite>
 306:	1f 3f       	cpi	r17, 0xFF	; 255
 308:	c1 f7       	brne	.-16     	; 0x2fa <DS3231WriteTime+0xc>
 30a:	df 91       	pop	r29
 30c:	cf 91       	pop	r28
 30e:	1f 91       	pop	r17
 310:	08 95       	ret

00000312 <ReadDate>:
}

//读取当前时间并解释
void ReadDate(void)
{
 312:	0f 93       	push	r16
 314:	1f 93       	push	r17
	DS3231ReadTime();						//读取当前时间
 316:	0e 94 65 01 	call	0x2ca	; 0x2ca <DS3231ReadTime>
	BCDtoASCII(CURDATE[0],&NowDATE[2]);	//年 ,00~10
 31a:	04 ee       	ldi	r16, 0xE4	; 228
 31c:	10 e0       	ldi	r17, 0x00	; 0
 31e:	b8 01       	movw	r22, r16
 320:	80 91 3e 01 	lds	r24, 0x013E
 324:	0e 94 73 00 	call	0xe6	; 0xe6 <BCDtoASCII>
	BCDtoASCII(CURDATE[1],&NowDATE[6]);	//月 ,01~12
 328:	0c 5f       	subi	r16, 0xFC	; 252
 32a:	1f 4f       	sbci	r17, 0xFF	; 255
 32c:	b8 01       	movw	r22, r16
 32e:	80 91 3f 01 	lds	r24, 0x013F
 332:	0e 94 73 00 	call	0xe6	; 0xe6 <BCDtoASCII>
	BCDtoASCII(CURDATE[2],&NowDATE[10]);	//日 ,01~31(28/30/31)
 336:	0c 5f       	subi	r16, 0xFC	; 252
 338:	1f 4f       	sbci	r17, 0xFF	; 255
 33a:	b8 01       	movw	r22, r16
 33c:	80 91 40 01 	lds	r24, 0x0140
 340:	0e 94 73 00 	call	0xe6	; 0xe6 <BCDtoASCII>
	BCDtoASCII(CURDATE[4],&NowDATE[14]);	//时 ,00~23
 344:	0c 5f       	subi	r16, 0xFC	; 252
 346:	1f 4f       	sbci	r17, 0xFF	; 255
 348:	b8 01       	movw	r22, r16
 34a:	80 91 42 01 	lds	r24, 0x0142
 34e:	0e 94 73 00 	call	0xe6	; 0xe6 <BCDtoASCII>
	BCDtoASCII(CURDATE[5],&NowDATE[18]);	//分 ,00~59
 352:	0c 5f       	subi	r16, 0xFC	; 252
 354:	1f 4f       	sbci	r17, 0xFF	; 255
 356:	b8 01       	movw	r22, r16
 358:	80 91 43 01 	lds	r24, 0x0143
 35c:	0e 94 73 00 	call	0xe6	; 0xe6 <BCDtoASCII>
	BCDtoASCII(CURDATE[6],&NowDATE[22]);	//秒 ,00~59
 360:	0c 5f       	subi	r16, 0xFC	; 252
 362:	1f 4f       	sbci	r17, 0xFF	; 255
 364:	b8 01       	movw	r22, r16
 366:	80 91 44 01 	lds	r24, 0x0144
 36a:	0e 94 73 00 	call	0xe6	; 0xe6 <BCDtoASCII>
	decodeWEEK(CURDATE[3],&NowDATE[31]);	//星期 ,1~7 一~日
 36e:	07 5f       	subi	r16, 0xF7	; 247
 370:	1f 4f       	sbci	r17, 0xFF	; 255
 372:	b8 01       	movw	r22, r16
 374:	80 91 41 01 	lds	r24, 0x0141
 378:	0e 94 7d 00 	call	0xfa	; 0xfa <decodeWEEK>
 37c:	1f 91       	pop	r17
 37e:	0f 91       	pop	r16
 380:	08 95       	ret

00000382 <DS3231TWIReadTemperature>:
}

unsigned char DS3231TWIReadTemperature(void)	//读取时间
{
 382:	8f e0       	ldi	r24, 0x0F	; 15
 384:	90 e0       	ldi	r25, 0x00	; 0
 386:	0e 94 b0 00 	call	0x160	; 0x160 <DS3231TWIRead>
	unsigned char temph=0;	//温度高字节
//	unsigned char templ=0;	//温度低字节
	unsigned char temp=DS3231TWIRead(CMD_STATUS);
	temp&=~(1<<BSY);
	if(!temp)
 38a:	8b 7f       	andi	r24, 0xFB	; 251
 38c:	11 f0       	breq	.+4      	; 0x392 <DS3231TWIReadTemperature+0x10>
 38e:	80 e0       	ldi	r24, 0x00	; 0
 390:	04 c0       	rjmp	.+8      	; 0x39a <DS3231TWIReadTemperature+0x18>
	{
		temph=DS3231TWIRead(CMD_TEMPERATUREH);
 392:	81 e1       	ldi	r24, 0x11	; 17
 394:	90 e0       	ldi	r25, 0x00	; 0
 396:	0e 94 b0 00 	call	0x160	; 0x160 <DS3231TWIRead>
		/*templ=DS3231TWIRead(CMD_TEMPERATUREL);
		//温度处理
		temph<<=2;
		templ>>=6;
		temph=temph+templ;*/
	}
	return temph;
}
 39a:	99 27       	eor	r25, r25
 39c:	08 95       	ret

0000039e <ReadTemperature>:

void ReadTemperature(void)
{
 39e:	80 91 35 01 	lds	r24, 0x0135
 3a2:	88 23       	and	r24, r24
 3a4:	81 f0       	breq	.+32     	; 0x3c6 <ReadTemperature+0x28>
	if(ReadTemperatureflag)
	{
		temperature=DS3231TWIReadTemperature();
 3a6:	0e 94 c1 01 	call	0x382	; 0x382 <DS3231TWIReadTemperature>
 3aa:	80 93 36 01 	sts	0x0136, r24
		if(temperature)
 3ae:	88 23       	and	r24, r24
 3b0:	51 f0       	breq	.+20     	; 0x3c6 <ReadTemperature+0x28>
		{
			ReadTemperatureflag=0;
 3b2:	10 92 35 01 	sts	0x0135, r1
			//temperature=DS3231TWIReadTemperature();
			BCDtoASCII(temperature,&NowTemperature[10]);
 3b6:	6d ed       	ldi	r22, 0xDD	; 221
 3b8:	70 e0       	ldi	r23, 0x00	; 0
 3ba:	0e 94 73 00 	call	0xe6	; 0xe6 <BCDtoASCII>
			UARTSendString(NowTemperature);
 3be:	83 ed       	ldi	r24, 0xD3	; 211
 3c0:	90 e0       	ldi	r25, 0x00	; 0
 3c2:	0e 94 f4 01 	call	0x3e8	; 0x3e8 <UARTSendString>
 3c6:	08 95       	ret

000003c8 <UartIntit>:
volatile unsigned char ReceiveBuffer[InLEN];	//UART接收缓冲区
volatile unsigned char SendBuffer[OutLEN];	//UART发送缓冲区

void UartIntit(void)	//UART初始化
{
 3c8:	80 b5       	in	r24, 0x20	; 32
 3ca:	8f 77       	andi	r24, 0x7F	; 127
 3cc:	80 bd       	out	0x20, r24	; 32
	UCSRC&=~(1<<URSEL); 
    UBRRH=(unsigned char)(ubrr>>8); 
 3ce:	10 bc       	out	0x20, r1	; 32
    UBRRL=(unsigned char)ubrr; 
 3d0:	85 e0       	ldi	r24, 0x05	; 5
 3d2:	89 b9       	out	0x09, r24	; 9
	UCSRA=0x00;
 3d4:	1b b8       	out	0x0b, r1	; 11
	UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);		//使能接收中断、接收器与发送器使能
 3d6:	88 e9       	ldi	r24, 0x98	; 152
 3d8:	8a b9       	out	0x0a, r24	; 10
	UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);	//设置帧格式:8个数据位,1个停止位
 3da:	86 e8       	ldi	r24, 0x86	; 134
 3dc:	80 bd       	out	0x20, r24	; 32
 3de:	08 95       	ret

000003e0 <UARTSend>:
}

void UARTSend(unsigned char data)	//发送8位的帧数据
{
 3e0:	5d 9b       	sbis	0x0b, 5	; 11
 3e2:	fe cf       	rjmp	.-4      	; 0x3e0 <UARTSend>
	while(!(UCSRA&(1<<UDRE)))		//等待发送缓冲器为空
	{
		;//此处可以去刷新显示或者读一次按键,等等
	}
	UDR=data;						//将数据放入缓冲器,发送数据
 3e4:	8c b9       	out	0x0c, r24	; 12
 3e6:	08 95       	ret

000003e8 <UARTSendString>:
}

void UARTSendArray(unsigned char *SendStartAddress,unsigned char SendByte)	//发送SendBuffer数据
{
	while(SendByte--)UARTSend(*SendStartAddress++);
	UARTSend(0x0D);
	UARTSend(0x0A);	//结尾发送回车换行
}

void UARTSendString(unsigned char *ptr)
{
 3e8:	fc 01       	movw	r30, r24
 3ea:	04 c0       	rjmp	.+8      	; 0x3f4 <UARTSendString+0xc>
 3ec:	5d 9b       	sbis	0x0b, 5	; 11
 3ee:	fe cf       	rjmp	.-4      	; 0x3ec <UARTSendString+0x4>
	while (*ptr)UARTSend(*ptr++);
 3f0:	31 96       	adiw	r30, 0x01	; 1
 3f2:	8c b9       	out	0x0c, r24	; 12
 3f4:	80 81       	ld	r24, Z
 3f6:	88 23       	and	r24, r24
 3f8:	c9 f7       	brne	.-14     	; 0x3ec <UARTSendString+0x4>
 3fa:	5d 9b       	sbis	0x0b, 5	; 11
 3fc:	fe cf       	rjmp	.-4      	; 0x3fa <UARTSendString+0x12>
 3fe:	8d e0       	ldi	r24, 0x0D	; 13
 400:	8c b9       	out	0x0c, r24	; 12
 402:	5d 9b       	sbis	0x0b, 5	; 11
 404:	fe cf       	rjmp	.-4      	; 0x402 <UARTSendString+0x1a>
 406:	8a e0       	ldi	r24, 0x0A	; 10
 408:	8c b9       	out	0x0c, r24	; 12
 40a:	08 95       	ret

0000040c <ResponseErro>:
	UARTSend(0x0D);
	UARTSend(0x0A);	//结尾发送回车换行
}

void uart(void)
{
	if(firstinflag/*|timechangeflag|temperaturechangeflag|radiomodechangeflag|mp3modechangeflag*/)
	{
		if(firstinflag)
		{
			firstinflag=0;
			return;
		}
	}
	ProcessReceiveData();
}


//---------------------------------------------------------------
//
//			串口接收中断服务程序
//
//	1.接收PC机发来的快捷键读命令:
//	S:读取当前时间;	T:读取当前温度;	M:读取当前工作模式;	E:读取系统错误号
//	用户无论按下哪种快捷键,紧接着再次按下J键都会显示其具体的工作状态;
//
//	2.接收PC机发来的读写命令
//	用户需按照通讯协议:
//	写命令:数据头+写功能码+编号+内容;
//	读命令:数据头+读功能码+编号;
//	编号如下:
//	01:时间;	02:温度;	03:工作模式;	04:未定义
//
//---------------------------------------------------------------
ISR(USART_RXC_vect)	  	//串口接收中断服务程序
{
	ReceiveBuffer[ReceiveCounter++]=UDR;
	if(UDR!='a')
	{
		ReadDate();
	UARTSendString(NowDATE);	//发送到电脑
	}
	switch(ReceiveBuffer[0])
	{
		case 'S':
		case 's':
		case 'T':
		case 't':
		case 'M':
		case 'm':
		case 'E':
		case 'e':

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -