📄 com2iic.lss
字号:
960: 99 27 eor r25, r25
962: 8f 70 andi r24, 0x0F ; 15
964: 90 70 andi r25, 0x00 ; 0
966: 8a 83 std Y+2, r24 ; 0x02
968: 9b 83 std Y+3, r25 ; 0x03
PutByte(hex_[ch]);
96a: 8a 81 ldd r24, Y+2 ; 0x02
96c: 9b 81 ldd r25, Y+3 ; 0x03
96e: fc 01 movw r30, r24
970: e4 59 subi r30, 0x94 ; 148
972: ff 4f sbci r31, 0xFF ; 255
974: 80 81 ld r24, Z
976: 0e 94 9d 03 call 0x73a
ch=c&0x0f;
97a: 89 81 ldd r24, Y+1 ; 0x01
97c: 99 27 eor r25, r25
97e: 8f 70 andi r24, 0x0F ; 15
980: 90 70 andi r25, 0x00 ; 0
982: 8a 83 std Y+2, r24 ; 0x02
984: 9b 83 std Y+3, r25 ; 0x03
PutByte(hex_[ch]);
986: 8a 81 ldd r24, Y+2 ; 0x02
988: 9b 81 ldd r25, Y+3 ; 0x03
98a: fc 01 movw r30, r24
98c: e4 59 subi r30, 0x94 ; 148
98e: ff 4f sbci r31, 0xFF ; 255
990: 80 81 ld r24, Z
992: 0e 94 9d 03 call 0x73a
996: 23 96 adiw r28, 0x03 ; 3
998: 0f b6 in r0, 0x3f ; 63
99a: f8 94 cli
99c: de bf out 0x3e, r29 ; 62
99e: 0f be out 0x3f, r0 ; 63
9a0: cd bf out 0x3d, r28 ; 61
9a2: df 91 pop r29
9a4: cf 91 pop r28
9a6: 08 95 ret
000009a8 <GetByte>:
// SPACE;
}
//**********************************************************************
//函 数 名: U8 GetByte (void)
//功 能: 从接收缓冲区取一个U8
//说 明: 如不想等待则在调用前检测inbufsign是否为1
//参 数: 无
//返 回 值: 接收到的数据
//示 范: i=GetByte();
//***********************************************************************
U8 GetByte (void)
{
9a8: cf 93 push r28
9aa: df 93 push r29
9ac: cd b7 in r28, 0x3d ; 61
9ae: de b7 in r29, 0x3e ; 62
9b0: 21 97 sbiw r28, 0x01 ; 1
9b2: 0f b6 in r0, 0x3f ; 63
9b4: f8 94 cli
9b6: de bf out 0x3e, r29 ; 62
9b8: 0f be out 0x3f, r0 ; 63
9ba: cd bf out 0x3d, r28 ; 61
char c ;
while (!inbufsign); //缓冲区空等待
9bc: 80 91 c3 00 lds r24, 0x00C3
9c0: 88 23 and r24, r24
9c2: 09 f4 brne .+2 ; 0x9c6
9c4: fb cf rjmp .-10 ; 0x9bc
cli();
9c6: f8 94 cli
c=*getlast; //取数据
9c8: e0 91 6a 00 lds r30, 0x006A
9cc: f0 91 6b 00 lds r31, 0x006B
9d0: 80 81 ld r24, Z
9d2: 89 83 std Y+1, r24 ; 0x01
getlast++; //最后取走的数据位置加1
9d4: 80 91 6a 00 lds r24, 0x006A
9d8: 90 91 6b 00 lds r25, 0x006B
9dc: 01 96 adiw r24, 0x01 ; 1
9de: 90 93 6b 00 sts 0x006B, r25
9e2: 80 93 6a 00 sts 0x006A, r24
inbufful=0; //输入缓冲区的满标志清零
9e6: 80 91 b6 00 lds r24, 0x00B6
9ea: 8b 7f andi r24, 0xFB ; 251
9ec: 80 93 b6 00 sts 0x00B6, r24
if (getlast==inbuf+ILEN) getlast=inbuf; //地址到顶部回到底部
9f0: 80 91 6a 00 lds r24, 0x006A
9f4: 90 91 6b 00 lds r25, 0x006B
9f8: 20 e0 ldi r18, 0x00 ; 0
9fa: 86 3b cpi r24, 0xB6 ; 182
9fc: 92 07 cpc r25, r18
9fe: 31 f4 brne .+12 ; 0xa0c
a00: 8a ea ldi r24, 0xAA ; 170
a02: 90 e0 ldi r25, 0x00 ; 0
a04: 90 93 6b 00 sts 0x006B, r25
a08: 80 93 6a 00 sts 0x006A, r24
if (getlast==inlast) inbufsign=0; //地址相等置接收缓冲区空空标志,再取数前要检该标志
a0c: 20 91 6a 00 lds r18, 0x006A
a10: 30 91 6b 00 lds r19, 0x006B
a14: 80 91 68 00 lds r24, 0x0068
a18: 90 91 69 00 lds r25, 0x0069
a1c: 28 17 cp r18, r24
a1e: 39 07 cpc r19, r25
a20: 11 f4 brne .+4 ; 0xa26
a22: 10 92 c3 00 sts 0x00C3, r1
sei();
a26: 78 94 sei
return (c); //取回数据
a28: 89 81 ldd r24, Y+1 ; 0x01
a2a: 99 27 eor r25, r25
a2c: 21 96 adiw r28, 0x01 ; 1
a2e: 0f b6 in r0, 0x3f ; 63
a30: f8 94 cli
a32: de bf out 0x3e, r29 ; 62
a34: 0f be out 0x3f, r0 ; 63
a36: cd bf out 0x3d, r28 ; 61
a38: df 91 pop r29
a3a: cf 91 pop r28
a3c: 08 95 ret
00000a3e <__vector_13>:
}
//**********************************************************************
//函 数 名: void SerialSend_handler (void)
//功 能: 串口发送中断处理
//说 明:
//参 数:
//返 回 值:
//***********************************************************************
SIGNAL(SIG_UART_TRANS)
{
a3e: 1f 92 push r1
a40: 0f 92 push r0
a42: 0f b6 in r0, 0x3f ; 63
a44: 0f 92 push r0
a46: 11 24 eor r1, r1
a48: 2f 93 push r18
a4a: 3f 93 push r19
a4c: 8f 93 push r24
a4e: 9f 93 push r25
a50: ef 93 push r30
a52: ff 93 push r31
a54: cf 93 push r28
a56: df 93 push r29
a58: cd b7 in r28, 0x3d ; 61
a5a: de b7 in r29, 0x3e ; 62
UCSRA|=(1<<TXC); //清发送中断标志
a5c: 80 91 2b 00 lds r24, 0x002B
a60: 80 64 ori r24, 0x40 ; 64
a62: 80 93 2b 00 sts 0x002B, r24
if (outbufsign)
a66: 80 91 b6 00 lds r24, 0x00B6
a6a: 86 95 lsr r24
a6c: 99 27 eor r25, r25
a6e: 81 70 andi r24, 0x01 ; 1
a70: 90 70 andi r25, 0x00 ; 0
a72: 00 97 sbiw r24, 0x00 ; 0
a74: 79 f1 breq .+94 ; 0xad4
{
UDR=*outlast; //未发送完继续发送
a76: e0 91 64 00 lds r30, 0x0064
a7a: f0 91 65 00 lds r31, 0x0065
a7e: 80 81 ld r24, Z
a80: 80 93 2c 00 sts 0x002C, r24
outlast++; //最后传出去的字节位置加1
a84: 80 91 64 00 lds r24, 0x0064
a88: 90 91 65 00 lds r25, 0x0065
a8c: 01 96 adiw r24, 0x01 ; 1
a8e: 90 93 65 00 sts 0x0065, r25
a92: 80 93 64 00 sts 0x0064, r24
if (outlast==outbuf+OLEN) outlast=outbuf;//地址到顶部回到底部
a96: 80 91 64 00 lds r24, 0x0064
a9a: 90 91 65 00 lds r25, 0x0065
a9e: 20 e0 ldi r18, 0x00 ; 0
aa0: 83 3c cpi r24, 0xC3 ; 195
aa2: 92 07 cpc r25, r18
aa4: 31 f4 brne .+12 ; 0xab2
aa6: 87 eb ldi r24, 0xB7 ; 183
aa8: 90 e0 ldi r25, 0x00 ; 0
aaa: 90 93 65 00 sts 0x0065, r25
aae: 80 93 64 00 sts 0x0064, r24
if (putlast==outlast) outbufsign=0; //数据发送完置发送缓冲区空标志
ab2: 20 91 66 00 lds r18, 0x0066
ab6: 30 91 67 00 lds r19, 0x0067
aba: 80 91 64 00 lds r24, 0x0064
abe: 90 91 65 00 lds r25, 0x0065
ac2: 28 17 cp r18, r24
ac4: 39 07 cpc r19, r25
ac6: 59 f4 brne .+22 ; 0xade
ac8: 80 91 b6 00 lds r24, 0x00B6
acc: 8d 7f andi r24, 0xFD ; 253
ace: 80 93 b6 00 sts 0x00B6, r24
ad2: 05 c0 rjmp .+10 ; 0xade
}
else
{
outbufsign0=0;
ad4: 80 91 b6 00 lds r24, 0x00B6
ad8: 8e 7f andi r24, 0xFE ; 254
ada: 80 93 b6 00 sts 0x00B6, r24
ade: df 91 pop r29
ae0: cf 91 pop r28
ae2: ff 91 pop r31
ae4: ef 91 pop r30
ae6: 9f 91 pop r25
ae8: 8f 91 pop r24
aea: 3f 91 pop r19
aec: 2f 91 pop r18
aee: 0f 90 pop r0
af0: 0f be out 0x3f, r0 ; 63
af2: 0f 90 pop r0
af4: 1f 90 pop r1
af6: 18 95 reti
00000af8 <__vector_11>:
}
}
//**********************************************************************
//函 数 名: void SerialIncept_handler (void)
//功 能: 串口接收中断处理
//说 明:
//参 数:
//返 回 值:
//***********************************************************************
SIGNAL(SIG_UART_RECV)
//void SerialIncept_handler (void)
{
af8: 1f 92 push r1
afa: 0f 92 push r0
afc: 0f b6 in r0, 0x3f ; 63
afe: 0f 92 push r0
b00: 11 24 eor r1, r1
b02: 2f 93 push r18
b04: 3f 93 push r19
b06: 8f 93 push r24
b08: 9f 93 push r25
b0a: ef 93 push r30
b0c: ff 93 push r31
b0e: cf 93 push r28
b10: df 93 push r29
b12: cd b7 in r28, 0x3d ; 61
b14: de b7 in r29, 0x3e ; 62
if(!inbufful) //接收缓冲区未满
b16: 80 91 b6 00 lds r24, 0x00B6
b1a: 86 95 lsr r24
b1c: 86 95 lsr r24
b1e: 99 27 eor r25, r25
b20: 81 70 andi r24, 0x01 ; 1
b22: 90 70 andi r25, 0x00 ; 0
b24: 00 97 sbiw r24, 0x00 ; 0
b26: 89 f5 brne .+98 ; 0xb8a
{
*inlast= UDR; //放入数据
b28: e0 91 68 00 lds r30, 0x0068
b2c: f0 91 69 00 lds r31, 0x0069
b30: 80 91 2c 00 lds r24, 0x002C
b34: 80 83 st Z, r24
inlast++; //最后放入的位置加1
b36: 80 91 68 00 lds r24, 0x0068
b3a: 90 91 69 00 lds r25, 0x0069
b3e: 01 96 adiw r24, 0x01 ; 1
b40: 90 93 69 00 sts 0x0069, r25
b44: 80 93 68 00 sts 0x0068, r24
inbufsign=1;
b48: 81 e0 ldi r24, 0x01 ; 1
b4a: 80 93 c3 00 sts 0x00C3, r24
if (inlast==inbuf+ILEN) inlast=inbuf; //地址到顶部回到底部
b4e: 80 91 68 00 lds r24, 0x0068
b52: 90 91 69 00 lds r25, 0x0069
b56: 20 e0 ldi r18, 0x00 ; 0
b58: 86 3b cpi r24, 0xB6 ; 182
b5a: 92 07 cpc r25, r18
b5c: 31 f4 brne .+12 ; 0xb6a
b5e: 8a ea ldi r24, 0xAA ; 170
b60: 90 e0 ldi r25, 0x00 ; 0
b62: 90 93 69 00 sts 0x0069, r25
b66: 80 93 68 00 sts 0x0068, r24
if (inlast==getlast) inbufful=1; //接收缓冲区满置满标志
b6a: 20 91 68 00 lds r18, 0x0068
b6e: 30 91 69 00 lds r19, 0x0069
b72: 80 91 6a 00 lds r24, 0x006A
b76: 90 91 6b 00 lds r25, 0x006B
b7a: 28 17 cp r18, r24
b7c: 39 07 cpc r19, r25
b7e: 29 f4 brne .+10 ; 0xb8a
b80: 80 91 b6 00 lds r24, 0x00B6
b84: 84 60 ori r24, 0x04 ; 4
b86: 80 93 b6 00 sts 0x00B6, r24
b8a: df 91 pop r29
b8c: cf 91 pop r28
b8e: ff 91 pop r31
b90: ef 91 pop r30
b92: 9f 91 pop r25
b94: 8f 91 pop r24
b96: 3f 91 pop r19
b98: 2f 91 pop r18
b9a: 0f 90 pop r0
b9c: 0f be out 0x3f, r0 ; 63
b9e: 0f 90 pop r0
ba0: 1f 90 pop r1
ba2: 18 95 reti
00000ba4 <SerialInit>:
}
}
/**********************************************************************
函 数 名: void SerialInit (unsigned long)
功 能: 串口初始化
说 明: 串口初始化成指定波特率,开接收,发送并开相应中断
参 数: 需要初始化的波特率
返 回 值: 无
示 范: SerialInit (38400);
***********************************************************************/
void SerialInit (void)
{
ba4: cf 93 push r28
ba6: df 93 push r29
ba8: cd b7 in r28, 0x3d ; 61
baa: de b7 in r29, 0x3e ; 62
cli();
bac: f8 94 cli
UCSRC&=(~(1<<URSEL));
bae: 9f e7 ldi r25, 0x7F ; 127
bb0: 80 91 40 00 lds r24, 0x0040
bb4: 89 23 and r24, r25
bb6: 80 93 40 00 sts 0x0040, r24
// UBRRH=(U8)(baud>>8);
UBRRH=0x00;
bba: 10 92 40 00 sts 0x0040, r1
// UBRRL=(U8)baud;
UBRRL=0x5; // 115200 @ 11.0592M
bbe: 85 e0 ldi r24, 0x05 ; 5
bc0: 80 93 29 00 sts 0x0029, r24
UCSRB=(1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);
bc4: 88 ed ldi r24, 0xD8 ; 216
bc6: 80 93 2a 00 sts 0x002A, r24
//接收中断使能,发送中断使能,接收器与发送器使能
UCSRC=(1<<URSEL)|(3<<UCSZ0); //设置帧格式: 8 个数据位, 1 个停止位*/
bca: 86 e8 ldi r24, 0x86 ; 134
bcc: 80 93 40 00 sts 0x0040, r24
sei(); //开全局中断
bd0: 78 94 sei
bd2: df 91 pop r29
bd4: cf 91 pop r28
bd6: 08 95 ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -