📄 rs232.lst
字号:
__text_start:
__start:
0033 E5CF LDI R28,0x5F
0034 E0D4 LDI R29,4
0035 BFCD OUT 0x3D,R28
0036 BFDE OUT 0x3E,R29
0037 51C0 SUBI R28,0x10
0038 40D0 SBCI R29,0
0039 EA0A LDI R16,0xAA
003A 8308 STD Y+0,R16
003B 2400 CLR R0
003C E7E1 LDI R30,0x71
003D E0F0 LDI R31,0
003E E010 LDI R17,0
003F 37E8 CPI R30,0x78
0040 07F1 CPC R31,R17
0041 F011 BEQ 0x0044
0042 9201 ST R0,Z+
0043 CFFB RJMP 0x003F
0044 8300 STD Z+0,R16
0045 E5E4 LDI R30,0x54
0046 E0F0 LDI R31,0
0047 E6A0 LDI R26,0x60
0048 E0B0 LDI R27,0
0049 E010 LDI R17,0
004A 36E5 CPI R30,0x65
004B 07F1 CPC R31,R17
004C F021 BEQ 0x0051
004D 95C8 LPM
004E 9631 ADIW R30,1
004F 920D ST R0,X+
0050 CFF9 RJMP 0x004A
0051 940E0208 CALL _main
_exit:
0053 CFFF RJMP _exit
FILE: G:\ly\mega\m16rs\main.c
(0001) //ICC-AVR application builder : 2008-4-9 17:20:49
(0002) // Target : M16
(0003) // Crystal: 16.000Mhz
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007)
(0008) #define DataR 0x90
(0009) #define RSTA1 0x4a
(0010) #define RSTA2 0x30
(0011)
(0012) #define TSTA1 0x6b
(0013) #define TSTA2 0x4c
(0014) #define DataT 0xaf
(0015)
(0016) #define En 0xe0
(0017) #define Run 0x83
(0018) #define Stop 0x7d
(0019)
(0020) #define OK 1
(0021) #define NG 0
(0022) #define ONE 0x90
(0023) #define TWO 0x91
(0024) #define THREE 0x92
(0025) #define FOUR 0x93
(0026) #define COMM 0x94
(0027)
(0028) unsigned char Enter[4] = {En,0x3e,0xe3,0xee};
(0029) unsigned char RunBuffer[4] = {Run,0x44,0x35,0x7e};
(0030) unsigned char StopBuffer[4] = {Stop,0x5e,0xe5,0x9e};
(0031)
(0032) static unsigned char n = 0;
(0033) static unsigned char len;
(0034) static unsigned char flag;
(0035)
(0036) unsigned char RxBuffer[4] = {0,0,0,0};
(0037) unsigned char TxBuffer[4];
(0038)
(0039) enum COMCHE{ENTER,RUN,STOP}comcheck;
(0040)
(0041) void port_init(void)
(0042) {
(0043) PORTA = 0x00;
_port_init:
0054 2422 CLR R2
0055 BA2B OUT 0x1B,R2
(0044) DDRA = 0xff;
0056 EF8F LDI R24,0xFF
0057 BB8A OUT 0x1A,R24
(0045) PORTB = 0x00;
0058 BA28 OUT 0x18,R2
(0046) DDRB = 0x00;
0059 BA27 OUT 0x17,R2
(0047) PORTC = 0x00; //m103 output only
005A BA25 OUT 0x15,R2
(0048) DDRC = 0xff;
005B BB84 OUT 0x14,R24
(0049) PORTD = 0x00;
005C BA22 OUT 0x12,R2
(0050) DDRD = 0x00;
005D BA21 OUT 0x11,R2
005E 9508 RET
(0051) }
(0052)
(0053) //UART0 initialize
(0054) // desired baud rate: 9600
(0055) // actual: baud rate:9615 (0.2%)
(0056) // char size: 8 bit
(0057) // parity: Disabled
(0058) void uart0_init(void)
(0059) {
(0060) UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
005F 2422 CLR R2
0060 B82A OUT 0x0A,R2
(0061) UCSRA = 0x00;
0061 B82B OUT 0x0B,R2
(0062) UCSRC = BIT(URSEL) | 0x06;
0062 E886 LDI R24,0x86
0063 BD80 OUT 0x20,R24
(0063) UBRRL = 0x67; //set baud rate lo
0064 E687 LDI R24,0x67
0065 B989 OUT 0x09,R24
(0064) UBRRH = 0x00; //set baud rate hi
0066 BC20 OUT 0x20,R2
(0065) UCSRB = 0xD8;
0067 ED88 LDI R24,0xD8
0068 B98A OUT 0x0A,R24
0069 9508 RET
_uart0_rx_isr:
temp --> Y+1
006A 922A ST R2,-Y
006B 930A ST R16,-Y
006C 931A ST R17,-Y
006D 938A ST R24,-Y
006E 939A ST R25,-Y
006F 93EA ST R30,-Y
0070 B62F IN R2,0x3F
0071 922A ST R2,-Y
(0066) }
(0067)
(0068) #pragma interrupt_handler uart0_rx_isr:12
(0069) void uart0_rx_isr(void)
(0070) {unsigned char temp;
(0071) if (flag == NG){
0072 90200076 LDS R2,flag
0074 2022 TST R2
0075 F009 BEQ 0x0077
0076 C079 RJMP 0x00F0
(0072) switch (n){
0077 9100006C LDS R16,n
0079 2711 CLR R17
007A 3000 CPI R16,0
007B 0701 CPC R16,R17
007C F0E9 BEQ 0x009A
007D 3001 CPI R16,1
007E E0E0 LDI R30,0
007F 071E CPC R17,R30
0080 F119 BEQ 0x00A4
0081 3002 CPI R16,2
0082 E0E0 LDI R30,0
0083 071E CPC R17,R30
0084 F161 BEQ 0x00B1
0085 3003 CPI R16,3
0086 E0E0 LDI R30,0
0087 071E CPC R17,R30
0088 F409 BNE 0x008A
0089 C03B RJMP 0x00C5
008A 3004 CPI R16,4
008B E0E0 LDI R30,0
008C 071E CPC R17,R30
008D F409 BNE 0x008F
008E C03F RJMP 0x00CE
008F 3005 CPI R16,5
0090 E0E0 LDI R30,0
0091 071E CPC R17,R30
0092 F409 BNE 0x0094
0093 C043 RJMP 0x00D7
0094 3006 CPI R16,6
0095 E0E0 LDI R30,0
0096 071E CPC R17,R30
0097 F409 BNE 0x0099
0098 C047 RJMP 0x00E0
0099 C056 RJMP 0x00F0
(0073) case 0: if (UDR == RSTA1) n++;break; //头1
009A B18C IN R24,0x0C
009B 348A CPI R24,0x4A
009C F009 BEQ 0x009E
009D C052 RJMP 0x00F0
009E 9180006C LDS R24,n
00A0 5F8F SUBI R24,0xFF
00A1 9380006C STS n,R24
00A3 C04C RJMP 0x00F0
(0074) case 1: if (UDR == RSTA2) n++; //头2
00A4 B18C IN R24,0x0C
00A5 3380 CPI R24,0x30
00A6 F431 BNE 0x00AD
00A7 9180006C LDS R24,n
00A9 5F8F SUBI R24,0xFF
00AA 9380006C STS n,R24
00AC C043 RJMP 0x00F0
(0075) else n = 0; break;
00AD 2422 CLR R2
00AE 9220006C STS n,R2
00B0 C03F RJMP 0x00F0
(0076) case 2: if (UDR >= ONE && UDR <= COMM)//长度
00B1 B18C IN R24,0x0C
00B2 3980 CPI R24,0x90
00B3 F068 BCS 0x00C1
00B4 E984 LDI R24,0x94
00B5 B02C IN R2,0x0C
00B6 1582 CP R24,R2
00B7 F048 BCS 0x00C1
(0077) {len = UDR; n++;}
00B8 B02C IN R2,0x0C
00B9 92200077 STS len,R2
00BB 9180006C LDS R24,n
00BD 5F8F SUBI R24,0xFF
00BE 9380006C STS n,R24
00C0 C02F RJMP 0x00F0
(0078) else n = 0;
00C1 2422 CLR R2
00C2 9220006C STS n,R2
(0079) break;
00C4 C02B RJMP 0x00F0
(0080) case 3: RxBuffer[0] = UDR; n++; break;
00C5 B02C IN R2,0x0C
00C6 9220006D STS RxBuffer,R2
00C8 9180006C LDS R24,n
00CA 5F8F SUBI R24,0xFF
00CB 9380006C STS n,R24
00CD C022 RJMP 0x00F0
(0081) case 4: RxBuffer[1] = UDR; n++; break;
00CE B02C IN R2,0x0C
00CF 9220006E STS RxBuffer+1,R2
00D1 9180006C LDS R24,n
00D3 5F8F SUBI R24,0xFF
00D4 9380006C STS n,R24
00D6 C019 RJMP 0x00F0
(0082) case 5: RxBuffer[2] = UDR; n++; break;
00D7 B02C IN R2,0x0C
00D8 9220006F STS RxBuffer+2,R2
00DA 9180006C LDS R24,n
00DC 5F8F SUBI R24,0xFF
00DD 9380006C STS n,R24
00DF C010 RJMP 0x00F0
(0083) case 6: RxBuffer[3] = UDR; n++; //data
00E0 B02C IN R2,0x0C
00E1 92200070 STS RxBuffer+3,R2
00E3 9180006C LDS R24,n
00E5 5F8F SUBI R24,0xFF
00E6 9380006C STS n,R24
(0084) // break;
(0085) /* case 7: temp = RxBuffer[0]%16 + RxBuffer[1]%16 + RxBuffer[2]%16 +RxBuffer[3]%16 +len;
(0086) if (UDR == temp) { //校验*/
(0087) flag = OK;
00E8 E081 LDI R24,1
00E9 93800076 STS flag,R24
(0088) PORTA = 0xff;
00EB EF8F LDI R24,0xFF
00EC BB8B OUT 0x1B,R24
(0089) //CLI();
(0090) // UCSRB = 0xC8; //关接受中断
(0091) // SEI();
(0092) // }
(0093) n = 0;
00ED 2422 CLR R2
00EE 9220006C STS n,R2
(0094) break;
(0095) default: break;
(0096) }
(0097) }
00F0 9029 LD R2,Y+
00F1 BE2F OUT 0x3F,R2
00F2 91E9 LD R30,Y+
00F3 9199 LD R25,Y+
00F4 9189 LD R24,Y+
00F5 9119 LD R17,Y+
00F6 9109 LD R16,Y+
00F7 9029 LD R2,Y+
00F8 9518 RETI
_uart0_tx_isr:
00F9 922A ST R2,-Y
00FA 923A ST R3,-Y
00FB 930A ST R16,-Y
00FC 931A ST R17,-Y
00FD 938A ST R24,-Y
00FE 939A ST R25,-Y
00FF 93EA ST R30,-Y
0100 B62F IN R2,0x3F
0101 922A ST R2,-Y
(0098)
(0099) }
(0100)
(0101) #pragma interrupt_handler uart0_tx_isr:14
(0102) void uart0_tx_isr(void)
(0103) {
(0104) if (flag == OK){
0102 91800076 LDS R24,flag
0104 3081 CPI R24,1
0105 F009 BEQ 0x0107
0106 C057 RJMP 0x015E
(0105) PORTC = 0xff;
0107 EF8F LDI R24,0xFF
0108 BB85 OUT 0x15,R24
(0106) switch (n){
0109 9100006C LDS R16,n
010B 2711 CLR R17
010C 3001 CPI R16,1
010D E0E0 LDI R30,0
010E 071E CPC R17,R30
010F F0A9 BEQ 0x0125
0110 3002 CPI R16,2
0111 E0E0 LDI R30,0
0112 071E CPC R17,R30
0113 F0C9 BEQ 0x012D
0114 3003 CPI R16,3
0115 E0E0 LDI R30,0
0116 071E CPC R17,R30
0117 F119 BEQ 0x013B
0118 3004 CPI R16,4
0119 E0E0 LDI R30,0
011A 071E CPC R17,R30
011B F141 BEQ 0x0144
011C 3005 CPI R16,5
011D E0E0 LDI R30,0
011E 071E CPC R17,R30
011F F169 BEQ 0x014D
0120 3006 CPI R16,6
0121 E0E0 LDI R30,0
0122 071E CPC R17,R30
0123 F191 BEQ 0x0156
0124 C039 RJMP 0x015E
(0107) case 1: n++;UDR = TSTA2; break; //头2
0125 9180006C LDS R24,n
0127 5F8F SUBI R24,0xFF
0128 9380006C STS n,R24
012A E48C LDI R24,0x4C
012B B98C OUT 0x0C,R24
012C C031 RJMP 0x015E
(0108) case 2: n++;UDR = DataT - len; break; //长度
012D 9180006C LDS R24,n
012F 5F8F SUBI R24,0xFF
0130 9380006C STS n,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -