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

📄 chuankou.lst

📁 ATMAGE128串口通信程序-中断方式
💻 LST
字号:
__text_start:
__start:
      47 EFCF      LDI	R28,0xFF
      48 E1D0      LDI	R29,0x10
      49 BFCD      OUT	0x3D,R28
      4A BFDE      OUT	0x3E,R29
      4B 51C0      SUBI	R28,0x10
      4C 40D0      SBCI	R29,0
      4D EA0A      LDI	R16,0xAA
      4E 8308      ST	Y,R16
      4F 2400      CLR	R0
      50 E0E1      LDI	R30,1
      51 E0F1      LDI	R31,1
      52 E011      LDI	R17,1
      53 30E2      CPI	R30,2
      54 07F1      CPC	R31,R17
      55 F011      BEQ	0x0058
      56 9201      ST	Z+,R0
      57 CFFB      RJMP	0x0053
      58 8300      ST	Z,R16
      59 E8EC      LDI	R30,0x8C
      5A E0F0      LDI	R31,0
      5B E0A0      LDI	R26,0
      5C E0B1      LDI	R27,1
      5D E010      LDI	R17,0
      5E E000      LDI	R16,0
      5F BF0B      OUT	0x3B,R16
      60 38ED      CPI	R30,0x8D
      61 07F1      CPC	R31,R17
      62 F021      BEQ	0x0067
      63 95C8      LPM
      64 9631      ADIW	R30,1
      65 920D      ST	X+,R0
      66 CFF9      RJMP	0x0060
      67 940E 00D7 CALL	_main
_exit:
      69 CFFF      RJMP	_exit
FILE: C:\DOCUME~1\wangqinbo\MYDOCU~1\avrc\chuankou.c
(0001) /***********************************************************/
(0002) //Title:ATMAGE128串口通信程序-中断方式
(0003) //ICC-AVR : 2009-2-20 15:30:43
(0004) // Target : M16
(0005) // Crystal: 8.0000Mhz
(0006) //Author  :borlittle
(0007) //Function:UART test
(0008) //备注	  :本程序经调试好使,如果程序不好使,请注意检查
(0009) //更改波特率和晶振频率以及检查调试助手和单片机的熔丝位
(0010) //设置,尤其是103兼容模式的熔丝位不编程M128和M16串口通
(0011) //信程序大同小异,M128有两个串口UART0、UART1而M16只有一
(0012) //个串口UART,只需要修改相应的寄存器和引脚设置即可
(0013) /***********************************************************/
(0014) /*********************************************/
(0015) #include <iom128v.h>
(0016) #include <macros.h>
(0017) 
(0018) #define uchar unsigned char      //定义无符号字符为 uchar
(0019) #define uint  unsigned int       //定义无符号整型
(0020) #define Crystal 8000000   //晶振8MHZ 
(0021) #define Baud 9600         //波特率
(0022) 
(0023) volatile uchar data_temp;
(0024) volatile uchar data=59; //‘;’号的ASCII码
(0025) 
(0026) //函数声明
(0027) void port_init(void);
(0028) void uart0_init(void);
(0029) void init_devices(void);
(0030) void usart0_char_send(uchar i);
(0031) void usart0_str_send(char *s);
(0032) void usart0_str_sendArray(uchar *p,uchar len);
(0033) 
(0034) //****************发送一个字符******************************
(0035) void usart0_char_send(uchar i)
(0036) {
(0037) while(!(UCSR0A&(1<<UDRE0)));
_usart0_char_send:
  i                    --> R16
      6A 9B5D      SBIS	0x0B,5
      6B CFFE      RJMP	_usart0_char_send
(0038) UDR0=i;
      6C B90C      OUT	0x0C,R16
      6D 9508      RET
_usart0_str_send:
  s                    --> R20
      6E 934A      ST	-Y,R20
      6F 935A      ST	-Y,R21
      70 01A8      MOVW	R20,R16
(0039) }
(0040) /******************发送一个字符串*************************/
(0041) void usart0_str_send(char *s) 
(0042) {
      71 C005      RJMP	0x0077
(0043)  while(*s)
(0044)  {
(0045)  usart0_char_send(*s); 
      72 01FA      MOVW	R30,R20
      73 8100      LD	R16,Z
      74 DFF5      RCALL	_usart0_char_send
(0046)  s++;
      75 5F4F      SUBI	R20,0xFF
      76 4F5F      SBCI	R21,0xFF
      77 01FA      MOVW	R30,R20
      78 8020      LD	R2,Z
      79 2022      TST	R2
      7A F7B9      BNE	0x0072
      7B 9159      LD	R21,Y+
      7C 9149      LD	R20,Y+
      7D 9508      RET
_usart0_str_sendArray:
  i                    --> R10
  len                  --> R12
  p                    --> R20
      7E 940E 00DC CALL	push_xgset303C
      80 2EC2      MOV	R12,R18
      81 01A8      MOVW	R20,R16
(0047)  }
(0048) }
(0049) /*********************发送一个字符串**********************/
(0050) void usart0_str_sendArray(uchar *p,uchar len)
(0051) {
(0052)   uchar i;
(0053)   for(i=0;i<len;i++)  //控制字符个数
      82 24AA      CLR	R10
      83 C006      RJMP	0x008A
(0054)   {
(0055)     usart0_char_send(*p);
      84 01FA      MOVW	R30,R20
      85 8100      LD	R16,Z
      86 DFE3      RCALL	_usart0_char_send
(0056)     p++;
      87 5F4F      SUBI	R20,0xFF
      88 4F5F      SBCI	R21,0xFF
      89 94A3      INC	R10
      8A 14AC      CP	R10,R12
      8B F3C0      BCS	0x0084
      8C 940C 00E3 JMP	pop_xgset303C
(0057)   }
(0058) }
(0059) 
(0060) 
(0061) /******************端口初始化*******************************/
(0062) void port_init(void) 
(0063) {
(0064)  PORTA = 0xFF; 
_port_init:
      8E EF8F      LDI	R24,0xFF
      8F BB8B      OUT	0x1B,R24
(0065)  DDRA  = 0x00; 
      90 2422      CLR	R2
      91 BA2A      OUT	0x1A,R2
(0066)  PORTB = 0xFF; 
      92 BB88      OUT	0x18,R24
(0067)  DDRB  = 0xFF; 
      93 BB87      OUT	0x17,R24
(0068)  PORTC = 0xFF; 
      94 BB85      OUT	0x15,R24
(0069)  DDRC  = 0x00;
      95 BA24      OUT	0x14,R2
(0070)   
(0071)  PORTE = 0xFF;   //设置RXD0和TXD0
      96 B983      OUT	0x03,R24
(0072)  DDRE  = 0x02;
      97 E082      LDI	R24,2
      98 B982      OUT	0x02,R24
(0073)  
(0074)  PORTF = 0xFF; 
      99 EF8F      LDI	R24,0xFF
      9A 9380 0062 STS	0x0062,R24
(0075)  DDRF  = 0xFF; 
      9C 9380 0061 STS	0x0061,R24
(0076)  PORTG = 0xFF; 
      9E 9380 0065 STS	0x0065,R24
(0077)  DDRG  = 0x00;
      A0 9220 0064 STS	0x0064,R2
      A2 9508      RET
(0078) }
(0079) /*****************串口初始化*********************************/
(0080) void usart0_init(void) 
(0081) {
(0082)  UCSR0B = 0x00;                     //禁止发送和接收
_usart0_init:
      A3 2422      CLR	R2
      A4 B82A      OUT	0x0A,R2
(0083)  UCSR0A = 0x02;                     //倍速异步模式USX0=1
      A5 E082      LDI	R24,2
      A6 B98B      OUT	0x0B,R24
(0084)  UCSR0C = 0x06;                     //0000 0110,UCSZ01=1,UCSZ00=1;8位字符,1位停止位 
      A7 E086      LDI	R24,6
      A8 9380 0095 STS	0x0095,R24
(0085)  UBRR0L=(Crystal/8/(Baud+1))%256;   //若为正常异步模式USX0=0则位(Crystal/16/(Baud+1))%256
      AA E688      LDI	R24,0x68
      AB B989      OUT	0x09,R24
(0086)  UBRR0H=(Crystal/8/(Baud+1))/256;   //参见ATMAGE128使用手册
      AC 9220 0090 STS	0x0090,R2
(0087)  UCSR0B=0xD8 ;					   //允许发送和接收,接收和发送结束中断使能
      AE ED88      LDI	R24,0xD8
      AF B98A      OUT	0x0A,R24
      B0 9508      RET
(0088) }
(0089) /******************初始器件**************************************/
(0090) void init_devices(void) 
(0091) {
(0092)  port_init();
_init_devices:
      B1 DFDC      RCALL	_port_init
(0093)  usart0_init();
      B2 CFF0      RJMP	_usart0_init
_usart0_RX_interrupt:
      B3 922A      ST	-Y,R2
      B4 938A      ST	-Y,R24
      B5 B62F      IN	R2,0x3F
      B6 922A      ST	-Y,R2
(0094)  }
(0095) 
(0096) /****************中断接收服务处理子程序*******************************/
(0097) #pragma interrupt_handler usart0_RX_interrupt:iv_USART0_RX  //  19
(0098) void usart0_RX_interrupt(void)
(0099) {
(0100)     
(0101)     UCSR0B=0x00;                         //禁止发送和接收
      B7 2422      CLR	R2
      B8 B82A      OUT	0x0A,R2
(0102)     data_temp = UDR0;                    //从数据缓冲器中接收数据
      B9 B02C      IN	R2,0x0C
      BA 9220 0101 STS	data_temp,R2
(0103) 	UCSR0B=0xD8 ;                        //允许发送和接收,接收和发送结束中断使能
      BC ED88      LDI	R24,0xD8
      BD B98A      OUT	0x0A,R24
(0104) 	if(data_temp=='0')                  //如果接收到的字符为'0'
      BE 9180 0101 LDS	R24,data_temp
      C0 3380      CPI	R24,0x30
      C1 F421      BNE	0x00C6
(0105)     UDR0 = data;    	   					//将数据data放入缓冲器,发送数据
      C2 9020 0100 LDS	R2,data
      C4 B82C      OUT	0x0C,R2
      C5 C003      RJMP	0x00C9
(0106) 	else
(0107) 	UDR0=data_temp; 						//否则将接收到的数据返回
      C6 9020 0101 LDS	R2,data_temp
      C8 B82C      OUT	0x0C,R2
      C9 9029      LD	R2,Y+
      CA BE2F      OUT	0x3F,R2
      CB 9189      LD	R24,Y+
      CC 9029      LD	R2,Y+
      CD 9518      RETI
_usart0_TX_interrupt:
      CE 920A      ST	-Y,R0
      CF B60F      IN	R0,0x3F
      D0 920A      ST	-Y,R0
(0108) 	
(0109) }  
(0110)  
(0111) /*********************中断发送服务处理子程序**************************/
(0112) #pragma interrupt_handler usart0_TX_interrupt:iv_USART0_TX  //  21
(0113) void usart0_TX_interrupt(void)
(0114) {
(0115)   _NOP();
      D1 0000      NOP
(0116)  UCSR0A |= (1<<6);                      //发送结束清零
      D2 9A5E      SBI	0x0B,6
      D3 9009      LD	R0,Y+
      D4 BE0F      OUT	0x3F,R0
      D5 9009      LD	R0,Y+
      D6 9518      RETI
(0117) }  
(0118) /*******************主程序****************************/
(0119) void  main(void)
(0120)  {
(0121)    
(0122)   CLI();     		                  //总中断禁止							   
_main:
      D7 94F8      BCLR	7
(0123)   init_devices();
      D8 DFD8      RCALL	_init_devices
(0124)   SEI();                              //总中断允许
      D9 9478      BSET	7
(0125) 
(0126)     while(1)                          //循环等待中断处理
FILE: <library>
      DA CFFF      RJMP	0x00DA
      DB 9508      RET
push_xgset303C:
      DC 935A      ST	-Y,R21
      DD 934A      ST	-Y,R20
      DE 92DA      ST	-Y,R13
      DF 92CA      ST	-Y,R12
      E0 92BA      ST	-Y,R11
      E1 92AA      ST	-Y,R10
      E2 9508      RET
pop_xgset303C:
      E3 90A9      LD	R10,Y+
      E4 90B9      LD	R11,Y+
      E5 90C9      LD	R12,Y+
      E6 90D9      LD	R13,Y+
      E7 9149      LD	R20,Y+
      E8 9159      LD	R21,Y+
      E9 9508      RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -