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

📄 main.lst

📁 ATMEGA128的串口驱动程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
    0046 EFCF      LDI	R28,0xFF
    0047 E1D0      LDI	R29,0x10
    0048 BFCD      OUT	0x3D,R28
    0049 BFDE      OUT	0x3E,R29
    004A 51C0      SUBI	R28,0x10
    004B 40D0      SBCI	R29,0
    004C EA0A      LDI	R16,0xAA
    004D 8308      STD	Y+0,R16
    004E 2400      CLR	R0
    004F E0E0      LDI	R30,0
    0050 E0F1      LDI	R31,1
    0051 E011      LDI	R17,1
    0052 3DE0      CPI	R30,0xD0
    0053 07F1      CPC	R31,R17
    0054 F011      BEQ	0x0057
    0055 9201      ST	R0,Z+
    0056 CFFB      RJMP	0x0052
    0057 8300      STD	Z+0,R16
    0058 E8EC      LDI	R30,0x8C
    0059 E0F0      LDI	R31,0
    005A E0A0      LDI	R26,0
    005B E0B1      LDI	R27,1
    005C E010      LDI	R17,0
    005D 38EC      CPI	R30,0x8C
    005E 07F1      CPC	R31,R17
    005F F021      BEQ	0x0064
    0060 95C8      LPM
    0061 9631      ADIW	R30,1
    0062 920D      ST	R0,X+
    0063 CFF9      RJMP	0x005D
    0064 940E0067  CALL	_main
_exit:
    0066 CFFF      RJMP	_exit
_main:
  SIO_buff             --> Y+2
    0067 9726      SBIW	R28,6
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\USART\source\main.c
(0001) /************************************************
(0002) 文件:main.c
(0003) 用途:
(0004) 注意:内部8M晶振
(0005) 创建:2008.4.1
(0006) 修改:2008.4.1
(0007) Copy Right  (c)  www.avrvi.com  AVR与虚拟仪器
(0008) ************************************************/
(0009) 
(0010) #include "config.h"
(0011) 
(0012) void main(void)
(0013) {
(0014) 	 unsigned char SIO_buff[4];
(0015) 	 CLI();
    0068 94F8      BCLR	7
(0016) 	 Com_init();
    0069 940E0084  CALL	_Com_init
(0017) 	 SEI();	 
    006B 9478      BSET	7
    006C C014      RJMP	0x0081
(0018) 	 while(1)
(0019) 	 {
(0020) 	     Com_getstring (SIO_buff,1,&RTbuf_UART0);
    006D E080      LDI	R24,0
    006E E091      LDI	R25,1
    006F 8399      STD	Y+1,R25
    0070 8388      STD	Y+0,R24
    0071 E021      LDI	R18,1
    0072 018E      MOVW	R16,R28
    0073 5F0E      SUBI	R16,0xFE
    0074 4F1F      SBCI	R17,0xFF
    0075 940E0110  CALL	_Com_getstring
(0021) 		 Com_putstring (SIO_buff,1,&RTbuf_UART0); //输出一个字符串到串行口
    0077 E080      LDI	R24,0
    0078 E091      LDI	R25,1
    0079 8399      STD	Y+1,R25
    007A 8388      STD	Y+0,R24
    007B E021      LDI	R18,1
    007C 018E      MOVW	R16,R28
    007D 5F0E      SUBI	R16,0xFE
    007E 4F1F      SBCI	R17,0xFF
    007F 940E00D6  CALL	_Com_putstring
    0081 CFEB      RJMP	0x006D
    0082 9626      ADIW	R28,6
    0083 9508      RET
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\USART\source\lib\sio.c
(0001) /************************************************
(0002) 文件:sio.c
(0003) 用途:结构化串口通信程序
(0004) 注意:
(0005) 创建:2008.1.26
(0006) 修改:2008.1.26
(0007) Copy Right  (c)  www.avrvi.com  AVR与虚拟仪器
(0008) ************************************************/
(0009) #include "..\config.h"
(0010) 
(0011) #if USEUART0
(0012) siocirqueue RTbuf_UART0;
(0013) #endif
(0014) #if USEUART1
(0015) siocirqueue RTbuf_UART1;
(0016) #endif
(0017) 
(0018) #if (CPU_TYPE == M32)||(CPU_TYPE == M16)||(CPU_TYPE == M8)
(0019) #define USEUART0  TRUE
(0020) #define USEUART1  FALSE
(0021) #define iv_USART0_RXC   iv_USART_RXC
(0022) #define iv_USART0_TXC   iv_USART_TXC
(0023) #define UDR0  	  UDR 
(0024) #define UCSR0A    UCSRA
(0025) #define UCSR0B    UCSRB
(0026) #define UCSR0C	  UCSRC
(0027) #define UBRR0H	  UBRRH
(0028) #define UBRR0L	  UBRRL
(0029) #define RXCIE0	  RXCIE
(0030) #define TXCIE0	  TXCIE
(0031) #endif
(0032) 
(0033) 
(0034) /*********************************************************************************************************
(0035) ** 函数名称: Com_init
(0036) ** 功能描述: 初始化串行口
(0037) ** 输 入: 
(0038) ** 全局变量: 无
(0039) ** 调用模块: Com_baudrate
(0040) ** 说明:
(0041) ** 注意:
(0042) ********************************************************************************************************/
(0043) void Com_init (void) {
(0044) //WDR(); //喂狗 
(0045) //CLI();                     // 关中断
(0046) #if USEUART0
(0047) Tbuf_init(&RTbuf_UART0);              //初始化接收缓冲
_Com_init:
    0084 E000      LDI	R16,0
    0085 E011      LDI	R17,1
    0086 D0BB      RCALL	_Tbuf_init
(0048) Rbuf_init(&RTbuf_UART0);
    0087 E000      LDI	R16,0
    0088 E011      LDI	R17,1
    0089 D0AF      RCALL	_Rbuf_init
(0049) UCSR0B = 0x00; //disable while setting baud rate
    008A 2422      CLR	R2
    008B B82A      OUT	0x0A,R2
(0050) UCSR0A=0x00;
    008C B82B      OUT	0x0B,R2
(0051) 
(0052) #if CPU_TYPE <= M32
(0053) UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
(0054) UCSR0B = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);  // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
(0055) #else
(0056) UCSR0C=0x06;  //8 DATA ,1 STOP, NO PARITY
    008D E086      LDI	R24,6
    008E 93800095  STS	0x95,R24
(0057) UCSR0B = (1<<RXCIE0)|(1<<TXCIE0)|(1<<RXEN0)|(1<<TXEN0);  // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
    0090 ED88      LDI	R24,0xD8
    0091 B98A      OUT	0x0A,R24
(0058) #endif
(0059) 
(0060) #endif
(0061) 
(0062) 
(0063) #if USEUART1
(0064) Tbuf_init(&RTbuf_B);              //初始化接收缓冲
(0065) Rbuf_init(&RTbuf_B);
(0066) UCSR1B = 0x00; //disable while setting baud rate
(0067) UCSR1A = 0x00;
(0068) UCSR1C = 0x06;
(0069) UCSR1B = 0xD8;
(0070) #endif
(0071) Com_baudrate (9600);		 // 
    0092 E800      LDI	R16,0x80
    0093 E215      LDI	R17,0x25
    0094 D001      RCALL	_Com_baudrate
    0095 9508      RET
_Com_baudrate:
  tmp                  --> R10
  baudrate             --> R10
    0096 940E031D  CALL	push_gset3
    0098 0158      MOVW	R10,R16
(0072) 
(0073) //SEI();                     // 开中断
(0074) }
(0075) /*********************************************************************************************************
(0076) ** 函数名称: Com_baudrate
(0077) ** 功能描述: 利用定时器T1产生由参数baudrate指定的波特率
(0078) ** 输 入: baudrate指定的波特率
(0079) ** 全局变量: 无
(0080) ** 调用模块: 无
(0081) ** 说明:
(0082) ** 注意:
(0083) ********************************************************************************************************/
(0084) void Com_baudrate (unsigned int baudrate) {
(0085) unsigned int tmp;
(0086) tmp= F_CPU/baudrate/16-1;
    0099 0115      MOVW	R2,R10
    009A 2444      CLR	R4
    009B 2455      CLR	R5
    009C E040      LDI	R20,0
    009D E152      LDI	R21,0x12
    009E E76A      LDI	R22,0x7A
    009F E070      LDI	R23,0
    00A0 925A      ST	R5,-Y
    00A1 924A      ST	R4,-Y
    00A2 923A      ST	R3,-Y
    00A3 922A      ST	R2,-Y
    00A4 018A      MOVW	R16,R20
    00A5 019B      MOVW	R18,R22
    00A6 940E028D  CALL	div32s
    00A8 E140      LDI	R20,0x10
    00A9 E050      LDI	R21,0
    00AA E060      LDI	R22,0
    00AB E070      LDI	R23,0
    00AC 937A      ST	R23,-Y
    00AD 936A      ST	R22,-Y
    00AE 935A      ST	R21,-Y
    00AF 934A      ST	R20,-Y
    00B0 940E028D  CALL	div32s
    00B2 0118      MOVW	R2,R16
    00B3 0129      MOVW	R4,R18
    00B4 E041      LDI	R20,1
    00B5 E050      LDI	R21,0
    00B6 E060      LDI	R22,0
    00B7 E070      LDI	R23,0
    00B8 1A24      SUB	R2,R20
    00B9 0A35      SBC	R3,R21
    00BA 0A46      SBC	R4,R22
    00BB 0A57      SBC	R5,R23
    00BC 0151      MOVW	R10,R2
(0087) #if USEUART0
(0088) UBRR0H=(unsigned char)(tmp>>8);
    00BD 2C23      MOV	R2,R3
    00BE 2433      CLR	R3
    00BF 92200090  STS	0x90,R2
(0089) UBRR0L=(unsigned char)tmp;
    00C1 B8A9      OUT	0x09,R10
    00C2 940E0313  CALL	pop_gset3
    00C4 9508      RET
_Com_putchar:
  RTbuf                --> R22
  c                    --> R20
    00C5 940E031F  CALL	push_gset2
    00C7 01B9      MOVW	R22,R18
    00C8 2F40      MOV	R20,R16
(0090) #endif
(0091) #if USEUART1
(0092) UBRR1H=(unsigned char)(tmp>>8);
(0093) UBRR1L=(unsigned char)tmp;
(0094) #endif
(0095) }
(0096) /*********************************************************************************************************
(0097) ** 函数名称: Com_putchar
(0098) ** 功能描述: 从串行口输出一个字符c
(0099) ** 输 入: c:输出字符
(0100) ** 输出	 : 0:失败 1:成功
(0101) ** 全局变量: 无
(0102) ** 调用模块: 
(0103) ** 说明:
(0104) ** 注意:
(0105) ********************************************************************************************************/
(0106) unsigned char Com_putchar (unsigned char c,siocirqueue *RTbuf) {
(0107) //WDR(); //喂狗
(0108) if (Tbuf_full(RTbuf)) 
    00C9 018B      MOVW	R16,R22
    00CA D099      RCALL	_Tbuf_full
    00CB 2300      TST	R16
    00CC F011      BEQ	0x00CF
(0109)    return(0);
    00CD 2700      CLR	R16
    00CE C004      RJMP	0x00D3
(0110) else{
(0111) 	Tbuf_putchar(c,RTbuf);				// 将数据加入到发送缓冲区并开中断
    00CF 019B      MOVW	R18,R22
    00D0 2F04      MOV	R16,R20
    00D1 D0A3      RCALL	_Tbuf_putchar
(0112) 	return(1);
    00D2 E001      LDI	R16,1
    00D3 940E0310  CALL	pop_gset2
    00D5 9508      RET
_Com_putstring:
  i                    --> R12
  RTbuf                --> R22
  len                  --> R10
  p                    --> R20
    00D6 940E031B  CALL	push_gset4
    00D8 2EA2      MOV	R10,R18
    00D9 01A8      MOVW	R20,R16
    00DA 8568      LDD	R22,Y+8
    00DB 8579      LDD	R23,Y+9
(0113) 	}
(0114) }
(0115) /*********************************************************************************************************
(0116) ** 函数名称: Com_putstring
(0117) ** 功能描述: 从串行口输出一个字符串
(0118) ** 输 入: p:指向输出字符串 len:输出长度
(0119) ** 输出	 : 
(0120) ** 全局变量: 无
(0121) ** 调用模块: 
(0122) ** 说明:
(0123) ** 注意:
(0124) ********************************************************************************************************/
(0125) void Com_putstring (unsigned char *p,unsigned char len,siocirqueue *RTbuf) {
(0126) unsigned char i;
(0127) //WDR(); //喂狗
(0128) if (len!=0 ){
    00DC 20AA      TST	R10
    00DD F079      BEQ	0x00ED
(0129) 	for(i=0;i<len;i++)
    00DE 24CC      CLR	R12
    00DF C00A      RJMP	0x00EA
(0130) 	while(Com_putchar(p[i],RTbuf)==0);//WDR(); //喂狗;
    00E0 019B      MOVW	R18,R22
    00E1 2DEC      MOV	R30,R12
    00E2 27FF      CLR	R31
    00E3 0FE4      ADD	R30,R20
    00E4 1FF5      ADC	R31,R21
    00E5 8100      LDD	R16,Z+0
    00E6 DFDE      RCALL	_Com_putchar
    00E7 2300      TST	R16
    00E8 F3B9      BEQ	0x00E0
    00E9 94C3      INC	R12
    00EA 14CA      CP	R12,R10
    00EB F3A0      BCS	0x00E0
(0131) 	}
    00EC C00B      RJMP	0x00F8
(0132) 	else {
(0133) 		do{
(0134) 			while(Com_putchar(*p,RTbuf)==0);//WDR(); //喂狗;
    00ED 019B      MOVW	R18,R22
    00EE 01FA      MOVW	R30,R20
    00EF 8100      LDD	R16,Z+0
    00F0 DFD4      RCALL	_Com_putchar
    00F1 2300      TST	R16
    00F2 F3D1      BEQ	0x00ED
(0135) 			}while(*p++!='\n');
    00F3 01FA      MOVW	R30,R20
    00F4 9181      LD	R24,Z+
    00F5 01AF      MOVW	R20,R30
    00F6 308A      CPI	R24,0xA
    00F7 F7A9      BNE	0x00ED
(0136) 	}
    00F8 940E0316  CALL	pop_gset4
    00FA 9508      RET
_Com_getchar:
  RTbuf                --> R20
  mode                 --> R22
    00FB 940E031F  CALL	push_gset2
    00FD 01A9      MOVW	R20,R18
    00FE 2F60      MOV	R22,R16
(0137) 	
(0138) }
(0139) /*********************************************************************************************************
(0140) ** 函数名称: Com_getchar
(0141) ** 功能描述: 从串行口输入一个字符
(0142) ** 输 入: mode:0不需等待,在调用函数前检测Com_R_count的值
(0143) **              1 等待数据到来
(0144) ** 输出	 : 读入的字符
(0145) ** 全局变量: 无
(0146) ** 调用模块: 
(0147) ** 说明:
(0148) ** 注意:
(0149) ********************************************************************************************************/
(0150) 
(0151) unsigned char Com_getchar (unsigned char mode,siocirqueue *RTbuf) {
(0152) //WDR(); //喂狗
(0153) //    Delay(Delay_Comget,MaxLimit_Comget_Delay);
(0154) //	if (mode>0) while(Com_R_count(RTbuf)==0 && !DelayOvf(Delay_Comget))//WDR(); //喂狗;
(0155) //	if (DelayOvf(Delay_Comget))
(0156) //	    return 0;    //时间超时
(0157) //	else 
(0158) 	    
(0159) 		while(!Com_R_count(RTbuf));
    00FF 018A      MOVW	R16,R20
    0100 D035      RCALL	_Com_R_count
    0101 2300      TST	R16
    0102 F3E1      BEQ	0x00FF
(0160) 		return (Rbuf_getchar(RTbuf));// 串行口输入正确,返回输入的字符
    0103 018A      MOVW	R16,R20
    0104 D0A9      RCALL	_Rbuf_getchar
    0105 940E0310  CALL	pop_gset2
    0107 9508      RET
_Com_Rbuf_Clear:
  RTbuf                --> R20
    0108 940E0321  CALL	push_gset1
    010A 01A8      MOVW	R20,R16
(0161) }
(0162) 
(0163) 
(0164) 
(0165) void Com_Rbuf_Clear(siocirqueue *RTbuf){
(0166) 	Rbuf_init(RTbuf);
    010B 018A      MOVW	R16,R20
    010C D02C      RCALL	_Rbuf_init
    010D 940E0324  CALL	pop_gset1
    010F 9508      RET
_Com_getstring:
  i                    --> R20
  RTbuf                --> R22
  len                  --> R12
  p                    --> R10
    0110 940E031B  CALL	push_gset4
    0112 2EC2      MOV	R12,R18
    0113 0158      MOVW	R10,R16
    0114 8568      LDD	R22,Y+8
    0115 8579      LDD	R23,Y+9
(0167) }
(0168) 
(0169) 
(0170) 
(0171) unsigned char Com_getstring (unsigned char *p,unsigned char len,siocirqueue *RTbuf) {
(0172) unsigned char i=0;
    0116 2744      CLR	R20
(0173) //WDR(); //喂狗
(0174) if (len>0 ){
    0117 2422      CLR	R2
    0118 142C      CP	R2,R12
    0119 F460      BCC	0x0126
(0175) 	for(i=0;i<len;i++){
    011A C007      RJMP	0x0122
(0176) 		//WDR(); //喂狗
(0177) 		*p++=Com_getchar(1,RTbuf);
    011B 019B      MOVW	R18,R22
    011C E001      LDI	R16,1
    011D DFDD      RCALL	_Com_getchar
    011E 01F5      MOVW	R30,R10
    011F 9301      ST	R16,Z+
    0120 015F      MOVW	R10,R30
    0121 9543      INC	R20
    0122 154C      CP	R20,R12
    0123 F3B8      BCS	0x011B
(0178) 		}
(0179) 	return(len);
    0124 2D0C      MOV	R16,R12
    0125 C00D      RJMP	0x0133

⌨️ 快捷键说明

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