📄 main.lst
字号:
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 + -