📄 24c01.lst
字号:
(0068) UCSR1C = 0x06;
(0069) UCSR1B = 0xD8;
(0070) #endif
(0071) Com_baudrate (9600); //
0213 E800 LDI R16,0x80
0214 E215 LDI R17,0x25
0215 D001 RCALL _Com_baudrate
0216 9508 RET
_Com_baudrate:
tmp --> R10
baudrate --> R10
0217 940E04AC CALL push_gset3
0219 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;
021A 0115 MOVW R2,R10
021B 2444 CLR R4
021C 2455 CLR R5
021D E040 LDI R20,0
021E E152 LDI R21,0x12
021F E76A LDI R22,0x7A
0220 E070 LDI R23,0
0221 925A ST R5,-Y
0222 924A ST R4,-Y
0223 923A ST R3,-Y
0224 922A ST R2,-Y
0225 018A MOVW R16,R20
0226 019B MOVW R18,R22
0227 940E03E9 CALL div32s
0229 E140 LDI R20,0x10
022A E050 LDI R21,0
022B E060 LDI R22,0
022C E070 LDI R23,0
022D 937A ST R23,-Y
022E 936A ST R22,-Y
022F 935A ST R21,-Y
0230 934A ST R20,-Y
0231 940E03E9 CALL div32s
0233 0118 MOVW R2,R16
0234 0129 MOVW R4,R18
0235 E041 LDI R20,1
0236 E050 LDI R21,0
0237 E060 LDI R22,0
0238 E070 LDI R23,0
0239 1A24 SUB R2,R20
023A 0A35 SBC R3,R21
023B 0A46 SBC R4,R22
023C 0A57 SBC R5,R23
023D 0151 MOVW R10,R2
(0087) #if USEUART0
(0088) UBRR0H=(unsigned char)(tmp>>8);
023E 2C23 MOV R2,R3
023F 2433 CLR R3
0240 92200090 STS 0x90,R2
(0089) UBRR0L=(unsigned char)tmp;
0242 B8A9 OUT 0x09,R10
0243 940E049F CALL pop_gset3
0245 9508 RET
_Com_putchar:
RTbuf --> R22
c --> R20
0246 940E04AE CALL push_gset2
0248 01B9 MOVW R22,R18
0249 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))
024A 018B MOVW R16,R22
024B D099 RCALL _Tbuf_full
024C 2300 TST R16
024D F011 BEQ 0x0250
(0109) return(0);
024E 2700 CLR R16
024F C004 RJMP 0x0254
(0110) else{
(0111) Tbuf_putchar(c,RTbuf); // 将数据加入到发送缓冲区并开中断
0250 019B MOVW R18,R22
0251 2F04 MOV R16,R20
0252 D0A3 RCALL _Tbuf_putchar
(0112) return(1);
0253 E001 LDI R16,1
0254 940E049C CALL pop_gset2
0256 9508 RET
_Com_putstring:
i --> R12
RTbuf --> R22
len --> R10
p --> R20
0257 940E04AA CALL push_gset4
0259 2EA2 MOV R10,R18
025A 01A8 MOVW R20,R16
025B 8568 LDD R22,Y+8
025C 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 ){
025D 20AA TST R10
025E F079 BEQ 0x026E
(0129) for(i=0;i<len;i++)
025F 24CC CLR R12
0260 C00A RJMP 0x026B
(0130) while(Com_putchar(p[i],RTbuf)==0);//WDR(); //喂狗;
0261 019B MOVW R18,R22
0262 2DEC MOV R30,R12
0263 27FF CLR R31
0264 0FE4 ADD R30,R20
0265 1FF5 ADC R31,R21
0266 8100 LDD R16,Z+0
0267 DFDE RCALL _Com_putchar
0268 2300 TST R16
0269 F3B9 BEQ 0x0261
026A 94C3 INC R12
026B 14CA CP R12,R10
026C F3A0 BCS 0x0261
(0131) }
026D C00B RJMP 0x0279
(0132) else {
(0133) do{
(0134) while(Com_putchar(*p,RTbuf)==0);//WDR(); //喂狗;
026E 019B MOVW R18,R22
026F 01FA MOVW R30,R20
0270 8100 LDD R16,Z+0
0271 DFD4 RCALL _Com_putchar
0272 2300 TST R16
0273 F3D1 BEQ 0x026E
(0135) }while(*p++!='\n');
0274 01FA MOVW R30,R20
0275 9181 LD R24,Z+
0276 01AF MOVW R20,R30
0277 308A CPI R24,0xA
0278 F7A9 BNE 0x026E
(0136) }
0279 940E04A2 CALL pop_gset4
027B 9508 RET
_Com_getchar:
RTbuf --> R20
mode --> R22
027C 940E04AE CALL push_gset2
027E 01A9 MOVW R20,R18
027F 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));
0280 018A MOVW R16,R20
0281 D035 RCALL _Com_R_count
0282 2300 TST R16
0283 F3E1 BEQ 0x0280
(0160) return (Rbuf_getchar(RTbuf));// 串行口输入正确,返回输入的字符
0284 018A MOVW R16,R20
0285 D0A9 RCALL _Rbuf_getchar
0286 940E049C CALL pop_gset2
0288 9508 RET
_Com_Rbuf_Clear:
RTbuf --> R20
0289 940E04B0 CALL push_gset1
028B 01A8 MOVW R20,R16
(0161) }
(0162)
(0163)
(0164)
(0165) void Com_Rbuf_Clear(siocirqueue *RTbuf){
(0166) Rbuf_init(RTbuf);
028C 018A MOVW R16,R20
028D D02C RCALL _Rbuf_init
028E 940E04B3 CALL pop_gset1
0290 9508 RET
_Com_getstring:
i --> R20
RTbuf --> R22
len --> R12
p --> R10
0291 940E04AA CALL push_gset4
0293 2EC2 MOV R12,R18
0294 0158 MOVW R10,R16
0295 8568 LDD R22,Y+8
0296 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;
0297 2744 CLR R20
(0173) //WDR(); //喂狗
(0174) if (len>0 ){
0298 2422 CLR R2
0299 142C CP R2,R12
029A F460 BCC 0x02A7
(0175) for(i=0;i<len;i++){
029B C007 RJMP 0x02A3
(0176) //WDR(); //喂狗
(0177) *p++=Com_getchar(1,RTbuf);
029C 019B MOVW R18,R22
029D E001 LDI R16,1
029E DFDD RCALL _Com_getchar
029F 01F5 MOVW R30,R10
02A0 9301 ST R16,Z+
02A1 015F MOVW R10,R30
02A2 9543 INC R20
02A3 154C CP R20,R12
02A4 F3B8 BCS 0x029C
(0178) }
(0179) return(len);
02A5 2D0C MOV R16,R12
02A6 C00D RJMP 0x02B4
(0180) }
(0181) else{
(0182)
(0183)
(0184) do{
(0185) *p++=Com_getchar(1,RTbuf);
02A7 019B MOVW R18,R22
02A8 E001 LDI R16,1
02A9 DFD2 RCALL _Com_getchar
02AA 01F5 MOVW R30,R10
02AB 9301 ST R16,Z+
02AC 015F MOVW R10,R30
(0186) i++;
02AD 9543 INC R20
(0187) //WDR(); //喂狗
(0188) }while(*(p-1)!='\n');
02AE 01F5 MOVW R30,R10
02AF 9731 SBIW R30,1
02B0 8180 LDD R24,Z+0
02B1 308A CPI R24,0xA
02B2 F7A1 BNE 0x02A7
(0189) // *p++=Com_getchar(1,RTbuf);
(0190) // *(p)=0;
(0191) return(i);
02B3 2F04 MOV R16,R20
02B4 940E04A2 CALL pop_gset4
02B6 9508 RET
(0192) }
(0193)
(0194) }
(0195)
(0196)
(0197) /*********************************************************************************************************
(0198) ** 函数名称: Com_R_count
(0199) ** 功能描述: 返回接收缓冲区字符个数函数
(0200) ** 输 入:
(0201) ** 输出 : 字符个数
(0202) ** 全局变量: 无
(0203) ** 调用模块:
(0204) ** 说明:
(0205) ** 注意:
(0206) ********************************************************************************************************/
(0207) unsigned char Com_R_count(siocirqueue *RTbuf){
(0208) return RTbuf->R_count;
_Com_R_count:
RTbuf --> R16
02B7 01F8 MOVW R30,R16
02B8 8102 LDD R16,Z+2
02B9 9508 RET
(0209) }
(0210) /*********************************************************************************************************
(0211) ** 函数名称: Rbuf_init
(0212) ** 功能描述: 接收缓冲区初始化
(0213) ** 输 入:
(0214) ** 输出 :
(0215) ** 全局变量: 无
(0216) ** 调用模块:
(0217) ** 说明:
(0218) ** 注意:
(0219) ********************************************************************************************************/
(0220) void Rbuf_init(siocirqueue *RTbuf){
(0221) RTbuf->R_front=0;
_Rbuf_init:
RTbuf --> R16
02BA 2422 CLR R2
02BB 01F8 MOVW R30,R16
02BC 8220 STD Z+0,R2
(0222) RTbuf->R_rear=0;
02BD 8221 STD Z+1,R2
(0223) RTbuf->R_count=0;
02BE 01F8 MOVW R30,R16
02BF 8222 STD Z+2,R2
(0224) RTbuf->R_overflow=0;
02C0 01F8 MOVW R30,R16
02C1 8223 STD Z+3,R2
02C2 9508 RET
(0225) }
(0226) /*********************************************************************************************************
(0227) ** 函数名称: Tbuf_init
(0228) ** 功能描述: 发送缓冲区初始化
(0229) ** 输 入:
(0230) ** 输出 :
(0231) ** 全局变量: 无
(0232) ** 调用模块:
(0233) ** 说明:
(0234) ** 注意:
(0235) ********************************************************************************************************/
(0236) void Tbuf_init(siocirqueue *RTbuf){
(0237) RTbuf->T_front=0;
_Tbuf_init:
RTbuf --> R16
02C3 2422 CLR R2
02C4 01F8 MOVW R30,R16
02C5 59E8 SUBI R30,0x98
02C6 4FFF SBCI R31,0xFF
02C7 8220 STD Z+0,R2
(0238) RTbuf->T_rear=0;
02C8 01F8 MOVW R30,R16
02C9 59E7 SUBI R30,0x97
02CA 4FFF SBCI R31,0xFF
02CB 8220 STD Z+0,R2
(0239) RTbuf->T_count=0;
02CC 01F8 MOVW R30,R16
02CD 59E6 SUBI R30,0x96
02CE 4FFF SBCI R31,0xFF
02CF 8220 STD Z+0,R2
(0240) RTbuf->T_disabled=1;
02D0 E081 LDI R24,1
02D1 01F8 MOVW R30,R16
02D2 53E1 SUBI R30,0x31
02D3 4FFF SBCI R31,0xFF
02D4 8380 STD Z+0,R24
02D5 9508 RET
_Rbuf_empty:
RTbuf --> R16
02D6 940E04B0 CALL push_gset1
(0241) }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -