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

📄 24c01.lst

📁 通过MEGA128的串口对I2C芯片24c01的读写程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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 + -