📄 m16uart.lst
字号:
008C 939A ST R25,-Y
008D 93EA ST R30,-Y
008E 93FA ST R31,-Y
008F B62F IN R2,0x3F
0090 922A ST R2,-Y
(0040) }
(0041) /*-----------------------------------------------------------------
(0042) 函数名称: void Uart0Init(void)
(0043) 函数功能: 串口初始化
(0044) 波特率 9600 0.2% 字符长度 8bit 无奇偶校验
(0045) 参 数:
(0046) 返 回 值: 无
(0047) -----------------------------------------------------------------*/
(0048) #pragma interrupt_handler UartRecvData:12
(0049) void UartRecvData(void)
(0050) {
(0051) uchar temp;
(0052) temp = UDR;
0091 B10C IN R16,0x0C
(0053) if( temp == '*') //判断是否是数据开始标志
0092 320A CPI R16,0x2A
0093 F431 BNE 0x009A
(0054) {
(0055) NewBeginFlag = 1;
0094 E081 LDI R24,1
0095 93800061 STS NewBeginFlag,R24
(0056) RecvDataFlag = 1;
0097 93800062 STS RecvDataFlag,R24
(0057) }
0099 C020 RJMP 0x00BA
(0058) else if( RecvDataFlag)
009A 90200062 LDS R2,RecvDataFlag
009C 2022 TST R2
009D F0A9 BEQ 0x00B3
(0059) {
(0060) if( temp == '#') //判断是否是数据结束标志
009E 3203 CPI R16,0x23
009F F421 BNE 0x00A4
(0061) {
(0062) RecvDataFlag = 0; //置接收结束标志
00A0 2422 CLR R2
00A1 92200062 STS RecvDataFlag,R2
(0063) }
00A3 C016 RJMP 0x00BA
(0064) else
(0065) {
(0066) RecvData[i++] = temp; //暂存数据
00A4 90200060 LDS R2,i
00A6 2433 CLR R3
00A7 2D82 MOV R24,R2
00A8 5F8F SUBI R24,0xFF
00A9 93800060 STS i,R24
00AB E684 LDI R24,0x64
00AC E090 LDI R25,0
00AD 2DE2 MOV R30,R2
00AE 27FF CLR R31
00AF 0FE8 ADD R30,R24
00B0 1FF9 ADC R31,R25
00B1 8300 STD Z+0,R16
(0067) }
(0068) }
00B2 C007 RJMP 0x00BA
(0069) else if((temp == 'R')||(temp == 'r'))
00B3 3502 CPI R16,0x52
00B4 F011 BEQ 0x00B7
00B5 3702 CPI R16,0x72
00B6 F419 BNE 0x00BA
(0070) {
(0071) ReadFlag = 1;
00B7 E081 LDI R24,1
00B8 93800063 STS ReadFlag,R24
(0072) }
00BA 9029 LD R2,Y+
00BB BE2F OUT 0x3F,R2
00BC 91F9 LD R31,Y+
00BD 91E9 LD R30,Y+
00BE 9199 LD R25,Y+
00BF 9189 LD R24,Y+
00C0 9109 LD R16,Y+
00C1 9039 LD R3,Y+
00C2 9029 LD R2,Y+
00C3 9518 RETI
_UartTransmitData:
Er --> Y+0
j --> R20
00C4 940E0140 CALL push_gset1
00C6 9726 SBIW R28,6
(0073) }
(0074) /*-----------------------------------------------------------------
(0075) 函数名称: void UartTransmitData(void)
(0076) 函数功能: 发送字符串
(0077) 参 数:
(0078) 返 回 值: 无
(0079) -----------------------------------------------------------------*/
(0080) void UartTransmitData(void)
(0081) {
(0082) uchar j,Er[6] = "ERROR";
00C7 E584 LDI R24,0x54
00C8 E090 LDI R25,0
00C9 01FE MOVW R30,R28
00CA E006 LDI R16,6
00CB E010 LDI R17,0
00CC 93FA ST R31,-Y
00CD 93EA ST R30,-Y
00CE 939A ST R25,-Y
00CF 938A ST R24,-Y
00D0 940E0157 CALL asgncblk
(0083) if( i == 0) //判断接收到的数据是否为空
00D2 90200060 LDS R2,i
00D4 2022 TST R2
00D5 F479 BNE 0x00E5
(0084) {
(0085) for( j = 0;j < 5; j++)
00D6 2744 CLR R20
00D7 C00A RJMP 0x00E2
(0086) {
(0087) while(!(UCSRA&0x20)); //等待数据寄存器为空
00D8 9B5D SBIS 0x0B,5
00D9 CFFE RJMP 0x00D8
(0088) UDR = Er[j]; //发送字符
00DA 01CE MOVW R24,R28
00DB 2FE4 MOV R30,R20
00DC 27FF CLR R31
00DD 0FE8 ADD R30,R24
00DE 1FF9 ADC R31,R25
00DF 8020 LDD R2,Z+0
00E0 B82C OUT 0x0C,R2
00E1 9543 INC R20
00E2 3045 CPI R20,5
00E3 F3A0 BCS 0x00D8
(0089) }
(0090) }
00E4 C011 RJMP 0x00F6
(0091) else
(0092) {
(0093) for( j = 0;j < i; j++)
00E5 2744 CLR R20
00E6 C00B RJMP 0x00F2
(0094) {
(0095) while(!(UCSRA&0x20)); //等待数据寄存器为空
00E7 9B5D SBIS 0x0B,5
00E8 CFFE RJMP 0x00E7
(0096) UDR = RecvData[j]; //发送字符
00E9 E684 LDI R24,0x64
00EA E090 LDI R25,0
00EB 2FE4 MOV R30,R20
00EC 27FF CLR R31
00ED 0FE8 ADD R30,R24
00EE 1FF9 ADC R31,R25
00EF 8020 LDD R2,Z+0
00F0 B82C OUT 0x0C,R2
00F1 9543 INC R20
00F2 90200060 LDS R2,i
00F4 1542 CP R20,R2
00F5 F388 BCS 0x00E7
(0097) }
(0098) }
00F6 9626 ADIW R28,6
00F7 940E0143 CALL pop_gset1
00F9 9508 RET
(0099) }
(0100) /*-----------------------------------------------------------------
(0101) 函数名称: void InitDevices(void)
(0102) 函数功能: 初始化各种信息
(0103) 参 数:
(0104) 返 回 值: 无
(0105) -----------------------------------------------------------------*/
(0106) void InitDevices(void)
(0107) {
(0108) CLI(); //关全部中断
_InitDevices:
00FA 94F8 BCLR 7
(0109) Uart0Init();
00FB DF81 RCALL _Uart0Init
(0110)
(0111) MCUCR = 0x00;
00FC 2422 CLR R2
00FD BE25 OUT 0x35,R2
(0112) SEI();
00FE 9478 BSET 7
00FF 9508 RET
(0113) }
(0114)
(0115) void main( void)
(0116) {
(0117) uchar j;
(0118) InitDevices();
_main:
j --> R20
0100 DFF9 RCALL _InitDevices
0101 C01C RJMP 0x011E
(0119) while(1)
(0120) {
(0121) if( NewBeginFlag) //有新的数据接收,清除原有数据
0102 90200061 LDS R2,NewBeginFlag
0104 2022 TST R2
0105 F081 BEQ 0x0116
(0122) {
(0123) NewBeginFlag = 0;
0106 2422 CLR R2
0107 92200061 STS NewBeginFlag,R2
(0124) for( j = 1; j ; j++ )
0109 E041 LDI R20,1
010A C009 RJMP 0x0114
(0125) {
(0126) RecvData[j] = 0;
010B E684 LDI R24,0x64
010C E090 LDI R25,0
010D 2FE4 MOV R30,R20
010E 27FF CLR R31
010F 0FE8 ADD R30,R24
0110 1FF9 ADC R31,R25
0111 2422 CLR R2
0112 8220 STD Z+0,R2
0113 9543 INC R20
0114 2344 TST R20
0115 F7A9 BNE 0x010B
(0127) }
(0128) }
(0129) if( ReadFlag)
0116 90200063 LDS R2,ReadFlag
0118 2022 TST R2
0119 F021 BEQ 0x011E
(0130) {
(0131) UartTransmitData();
011A DFA9 RCALL _UartTransmitData
(0132) ReadFlag = 0;
FILE: <library>
011B 2422 CLR R2
011C 92200063 STS ReadFlag,R2
011E CFE3 RJMP 0x0102
011F 9508 RET
mod8u:
0120 9468 BSET 6
0121 C001 RJMP xdiv8u
div8u:
0122 94E8 BCLR 6
xdiv8u:
0123 932A ST R18,-Y
0124 92FA ST R15,-Y
0125 92EA ST R14,-Y
0126 24FF CLR R15
0127 24EE CLR R14
0128 E120 LDI R18,0x10
0129 0F00 LSL R16
012A 1CFF ROL R15
012B 1CEE ROL R14
012C 16E1 CP R14,R17
012D F010 BCS 0x0130
012E 1AE1 SUB R14,R17
012F 9503 INC R16
0130 952A DEC R18
0131 F7B9 BNE 0x0129
0132 F40E BRTC 0x0134
0133 2D0E MOV R16,R14
0134 90E9 LD R14,Y+
0135 90F9 LD R15,Y+
0136 9129 LD R18,Y+
0137 9508 RET
push_gset5:
0138 92FA ST R15,-Y
0139 92EA ST R14,-Y
push_gset4:
013A 92DA ST R13,-Y
013B 92CA ST R12,-Y
push_gset3:
013C 92BA ST R11,-Y
013D 92AA ST R10,-Y
push_gset2:
013E 937A ST R23,-Y
013F 936A ST R22,-Y
push_gset1:
0140 935A ST R21,-Y
0141 934A ST R20,-Y
0142 9508 RET
pop_gset1:
0143 E0E1 LDI R30,1
pop:
0144 9149 LD R20,Y+
0145 9159 LD R21,Y+
0146 FDE0 SBRC R30,0
0147 9508 RET
0148 9169 LD R22,Y+
0149 9179 LD R23,Y+
014A FDE1 SBRC R30,1
014B 9508 RET
014C 90A9 LD R10,Y+
014D 90B9 LD R11,Y+
014E FDE2 SBRC R30,2
014F 9508 RET
0150 90C9 LD R12,Y+
0151 90D9 LD R13,Y+
0152 FDE3 SBRC R30,3
0153 9508 RET
0154 90E9 LD R14,Y+
0155 90F9 LD R15,Y+
0156 9508 RET
asgncblk:
0157 93AA ST R26,-Y
0158 93BA ST R27,-Y
0159 93EA ST R30,-Y
015A 93FA ST R31,-Y
015B 920A ST R0,-Y
015C 81AF LDD R26,Y+7
015D 85B8 LDD R27,Y+8
015E 81ED LDD R30,Y+5
015F 81FE LDD R31,Y+6
0160 3000 CPI R16,0
0161 0701 CPC R16,R17
0162 F031 BEQ 0x0169
0163 95C8 LPM
0164 920D ST R0,X+
0165 9631 ADIW R30,1
0166 5001 SUBI R16,1
0167 4010 SBCI R17,0
0168 CFF7 RJMP 0x0160
0169 9009 LD R0,Y+
016A 91F9 LD R31,Y+
016B 91E9 LD R30,Y+
016C 91B9 LD R27,Y+
016D 91A9 LD R26,Y+
016E 9624 ADIW R28,4
016F 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -