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

📄 rs232.lst

📁 mega16的rs232通讯程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -