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

📄 main.lst

📁 ATMEGA128的PCF8536驱动程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0267 2711      CLR	R17
    0268 DF77      RCALL	_PCF8536_wt
(0157)  //PCF8536_wt_p(0x02,time,7);//设定时间
(0158)  PCF8536_wt(0x00,0x00);//写寄存器1,开始计时
    0269 2722      CLR	R18
    026A 2700      CLR	R16
    026B 2711      CLR	R17
    026C DF73      RCALL	_PCF8536_wt
    026D 9508      RET
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\PCF8563_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:
    026E EC00      LDI	R16,0xC0
    026F E011      LDI	R17,1
    0270 D0BB      RCALL	_Tbuf_init
(0048) Rbuf_init(&RTbuf_UART0);
    0271 EC00      LDI	R16,0xC0
    0272 E011      LDI	R17,1
    0273 D0AF      RCALL	_Rbuf_init
(0049) UCSR0B = 0x00; //disable while setting baud rate
    0274 2422      CLR	R2
    0275 B82A      OUT	0x0A,R2
(0050) UCSR0A=0x00;
    0276 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
    0277 E086      LDI	R24,6
    0278 93800095  STS	0x95,R24
(0057) UCSR0B = (1<<RXCIE0)|(1<<TXCIE0)|(1<<RXEN0)|(1<<TXEN0);  // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
    027A ED88      LDI	R24,0xD8
    027B 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);		 // 
    027C E800      LDI	R16,0x80
    027D E215      LDI	R17,0x25
    027E D001      RCALL	_Com_baudrate
    027F 9508      RET
_Com_baudrate:
  tmp                  --> R10
  baudrate             --> R10
    0280 940E04DD  CALL	push_gset3
    0282 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;
    0283 0115      MOVW	R2,R10
    0284 2444      CLR	R4
    0285 2455      CLR	R5
    0286 E040      LDI	R20,0
    0287 E152      LDI	R21,0x12
    0288 E76A      LDI	R22,0x7A
    0289 E070      LDI	R23,0
    028A 925A      ST	R5,-Y
    028B 924A      ST	R4,-Y
    028C 923A      ST	R3,-Y
    028D 922A      ST	R2,-Y
    028E 018A      MOVW	R16,R20
    028F 019B      MOVW	R18,R22
    0290 940E044D  CALL	div32s
    0292 E140      LDI	R20,0x10
    0293 E050      LDI	R21,0
    0294 E060      LDI	R22,0
    0295 E070      LDI	R23,0
    0296 937A      ST	R23,-Y
    0297 936A      ST	R22,-Y
    0298 935A      ST	R21,-Y
    0299 934A      ST	R20,-Y
    029A 940E044D  CALL	div32s
    029C 0118      MOVW	R2,R16
    029D 0129      MOVW	R4,R18
    029E E041      LDI	R20,1
    029F E050      LDI	R21,0
    02A0 E060      LDI	R22,0
    02A1 E070      LDI	R23,0
    02A2 1A24      SUB	R2,R20
    02A3 0A35      SBC	R3,R21
    02A4 0A46      SBC	R4,R22
    02A5 0A57      SBC	R5,R23
    02A6 0151      MOVW	R10,R2
(0087) #if USEUART0
(0088) UBRR0H=(unsigned char)(tmp>>8);
    02A7 2C23      MOV	R2,R3
    02A8 2433      CLR	R3
    02A9 92200090  STS	0x90,R2
(0089) UBRR0L=(unsigned char)tmp;
    02AB B8A9      OUT	0x09,R10
    02AC 940E04D3  CALL	pop_gset3
    02AE 9508      RET
_Com_putchar:
  RTbuf                --> R22
  c                    --> R20
    02AF 940E04DF  CALL	push_gset2
    02B1 01B9      MOVW	R22,R18
    02B2 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)) 
    02B3 018B      MOVW	R16,R22
    02B4 D099      RCALL	_Tbuf_full
    02B5 2300      TST	R16
    02B6 F011      BEQ	0x02B9
(0109)    return(0);
    02B7 2700      CLR	R16
    02B8 C004      RJMP	0x02BD
(0110) else{
(0111) 	Tbuf_putchar(c,RTbuf);				// 将数据加入到发送缓冲区并开中断
    02B9 019B      MOVW	R18,R22
    02BA 2F04      MOV	R16,R20
    02BB D0A3      RCALL	_Tbuf_putchar
(0112) 	return(1);
    02BC E001      LDI	R16,1
    02BD 940E04D0  CALL	pop_gset2
    02BF 9508      RET
_Com_putstring:
  i                    --> R12
  RTbuf                --> R22
  len                  --> R10
  p                    --> R20
    02C0 940E04DB  CALL	push_gset4
    02C2 2EA2      MOV	R10,R18
    02C3 01A8      MOVW	R20,R16
    02C4 8568      LDD	R22,Y+8
    02C5 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 ){
    02C6 20AA      TST	R10
    02C7 F079      BEQ	0x02D7
(0129) 	for(i=0;i<len;i++)
    02C8 24CC      CLR	R12
    02C9 C00A      RJMP	0x02D4
(0130) 	while(Com_putchar(p[i],RTbuf)==0);//WDR(); //喂狗;
    02CA 019B      MOVW	R18,R22
    02CB 2DEC      MOV	R30,R12
    02CC 27FF      CLR	R31
    02CD 0FE4      ADD	R30,R20
    02CE 1FF5      ADC	R31,R21
    02CF 8100      LDD	R16,Z+0
    02D0 DFDE      RCALL	_Com_putchar
    02D1 2300      TST	R16
    02D2 F3B9      BEQ	0x02CA
    02D3 94C3      INC	R12
    02D4 14CA      CP	R12,R10
    02D5 F3A0      BCS	0x02CA
(0131) 	}
    02D6 C00B      RJMP	0x02E2
(0132) 	else {
(0133) 		do{
(0134) 			while(Com_putchar(*p,RTbuf)==0);//WDR(); //喂狗;
    02D7 019B      MOVW	R18,R22
    02D8 01FA      MOVW	R30,R20
    02D9 8100      LDD	R16,Z+0
    02DA DFD4      RCALL	_Com_putchar
    02DB 2300      TST	R16
    02DC F3D1      BEQ	0x02D7
(0135) 			}while(*p++!='\n');
    02DD 01FA      MOVW	R30,R20
    02DE 9181      LD	R24,Z+
    02DF 01AF      MOVW	R20,R30
    02E0 308A      CPI	R24,0xA
    02E1 F7A9      BNE	0x02D7
(0136) 	}
    02E2 940E04D6  CALL	pop_gset4
    02E4 9508      RET
_Com_getchar:
  RTbuf                --> R20
  mode                 --> R22
    02E5 940E04DF  CALL	push_gset2
    02E7 01A9      MOVW	R20,R18
    02E8 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));
    02E9 018A      MOVW	R16,R20
    02EA D035      RCALL	_Com_R_count
    02EB 2300      TST	R16
    02EC F3E1      BEQ	0x02E9
(0160) 		return (Rbuf_getchar(RTbuf));// 串行口输入正确,返回输入的字符
    02ED 018A      MOVW	R16,R20
    02EE D0A9      RCALL	_Rbuf_getchar
    02EF 940E04D0  CALL	pop_gset2
    02F1 9508      RET
_Com_Rbuf_Clear:
  RTbuf                --> R20
    02F2 940E04E1  CALL	push_gset1
    02F4 01A8      MOVW	R20,R16
(0161) }
(0162) 
(0163) 
(0164) 
(0165) void Com_Rbuf_Clear(siocirqueue *RTbuf){
(0166) 	Rbuf_init(RTbuf);
    02F5 018A      MOVW	R16,R20
    02F6 D02C      RCALL	_Rbuf_init
    02F7 940E04E4  CALL	pop_gset1
    02F9 9508      RET
_Com_getstring:
  i                    --> R20
  RTbuf                --> R22
  len                  --> R12
  p                    --> R10
    02FA 940E04DB  CALL	push_gset4
    02FC 2EC2      MOV	R12,R18
    02FD 0158      MOVW	R10,R16
    02FE 8568      LDD	R22,Y+8
    02FF 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;
    0300 2744      CLR	R20
(0173) //WDR(); //喂狗
(0174) if (len>0 ){
    0301 2422      CLR	R2
    0302 142C      CP	R2,R12
    0303 F460      BCC	0x0310
(0175) 	for(i=0;i<len;i++){
    0304 C007      RJMP	0x030C
(0176) 		//WDR(); //喂狗
(0177) 		*p++=Com_getchar(1,RTbuf);
    0305 019B      MOVW	R18,R22
    0306 E001      LDI	R16,1
    0307 DFDD      RCALL	_Com_getchar
    0308 01F5      MOVW	R30,R10
    0309 9301      ST	R16,Z+
    030A 015F      MOVW	R10,R30
    030B 9543      INC	R20
    030C 154C      CP	R20,R12
    030D F3B8      BCS	0x0305
(0178) 		}
(0179) 	return(len);
    030E 2D0C      MOV	R16,R12
    030F C00D      RJMP	0x031D
(0180) 	}
(0181) 	else{
(0182) 		
(0183) 		
(0184) 		do{
(0185) 				*p++=Com_getchar(1,RTbuf);
    0310 019B      MOVW	R18,R22
    0311 E001      LDI	R16,1
    0312 DFD2      RCALL	_Com_getchar
    0313 01F5      MOVW	R30,R10
    0314 9301      ST	R16,Z+
    0315 015F      MOVW	R10,R30
(0186) 				i++;
    0316 9543      INC	R20
(0187) 				//WDR(); //喂狗
(0188) 			}while(*(p-1)!='\n');
    0317 01F5      MOVW	R30,R10
    0318 9731      SBIW	R30,1
    0319 8180      LDD	R24,Z+0
    031A 308A      CPI	R24,0xA
    031B F7A1      BNE	0x0310
(0189) //			*p++=Com_getchar(1,RTbuf);
(0190) //			*(p)=0;
(0191) 		return(i);
    031C 2F04      MOV	R16,R20
    031D 940E04D6  CALL	pop_gset4
    031F 9508      RET
(0192) 		}
(0193) 	
(0194) }
(0195) 
(0196) 
(0197) /*********************************************************************************************************
(0198) ** 函数名称: Com_R_count

⌨️ 快捷键说明

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