📄 main.lss
字号:
{
__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 + -