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

📄 main.lst

📁 ATMEGA128的PCF8536驱动程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0076) }
(0077) /*************************************************************************
(0078) ** 函数名称: i2cstop(void)
(0079) ** 功能描述: i2c停止
(0080) ** 输 入: 
(0081) ** 输出	 : 
(0082) ** 全局变量: 无
(0083) ** 调用模块: 
(0084) ** 说明:
(0085) ** 注意:
(0086) **************************************************************************/
(0087) void i2cstop(void)
(0088) { 
(0089)    TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);
_i2cstop:
    01A7 E984      LDI	R24,0x94
    01A8 93800074  STS	0x74,R24
    01AA 9508      RET
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\PCF8563_USART\source\lib\delay.c
(0001) /************************************************
(0002) 文件:delay.c
(0003) 用途:延时函数
(0004) 注意:系统时钟8M
(0005) 创建:2008.1.25
(0006) 修改:2008.1.25
(0007) Copy Right  (c)  www.avrvi.com  AVR与虚拟仪器
(0008) ************************************************/
(0009) 
(0010) void delay_1us(void)                 //1us延时函数
(0011)   {
(0012)    asm("nop");
_delay_1us:
    01AB 0000      NOP
    01AC 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    01AD 940E04DF  CALL	push_gset2
    01AF 01B8      MOVW	R22,R16
(0013)   }
(0014) 
(0015) void delay_nus(unsigned int n)       //N us延时函数
(0016)   {
(0017)    unsigned int i=0;
    01B0 2744      CLR	R20
    01B1 2755      CLR	R21
(0018)    for (i=0;i<n;i++)
    01B2 C003      RJMP	0x01B6
(0019)    delay_1us();
    01B3 DFF7      RCALL	_delay_1us
    01B4 5F4F      SUBI	R20,0xFF
    01B5 4F5F      SBCI	R21,0xFF
    01B6 1746      CP	R20,R22
    01B7 0757      CPC	R21,R23
    01B8 F3D0      BCS	0x01B3
    01B9 940E04D0  CALL	pop_gset2
    01BB 9508      RET
(0020)   }
(0021)   
(0022) void delay_1ms(void)                 //1ms延时函数
(0023)   {
(0024)    unsigned int i;
(0025)    for (i=0;i<1140;i++);
_delay_1ms:
  i                    --> R16
    01BC 2700      CLR	R16
    01BD 2711      CLR	R17
    01BE C002      RJMP	0x01C1
    01BF 5F0F      SUBI	R16,0xFF
    01C0 4F1F      SBCI	R17,0xFF
    01C1 3704      CPI	R16,0x74
    01C2 E0E4      LDI	R30,4
    01C3 071E      CPC	R17,R30
    01C4 F3D0      BCS	0x01BF
    01C5 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    01C6 940E04DF  CALL	push_gset2
    01C8 01B8      MOVW	R22,R16
(0026)   }
(0027)   
(0028) void delay_nms(unsigned int n)       //N ms延时函数
(0029)   {
(0030)    unsigned int i=0;
    01C9 2744      CLR	R20
    01CA 2755      CLR	R21
(0031)    for (i=0;i<n;i++)
    01CB C003      RJMP	0x01CF
(0032)    delay_1ms();
    01CC DFEF      RCALL	_delay_1ms
    01CD 5F4F      SUBI	R20,0xFF
    01CE 4F5F      SBCI	R21,0xFF
    01CF 1746      CP	R20,R22
    01D0 0757      CPC	R21,R23
    01D1 F3D0      BCS	0x01CC
    01D2 940E04D0  CALL	pop_gset2
    01D4 9508      RET
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\PCF8563_USART\source\lib\PCF8563.c
(0001) /************************************************
(0002) 文件:PCF8563.h
(0003) 用途:PCF8563函数头文件
(0004) 注意:系统时钟8M
(0005) 创建:2008.1.25
(0006) 修改:2008.1.25
(0007) Copy Right  (c)  www.avrvi.com  AVR与虚拟仪器
(0008) ************************************************/
(0009) #include "..\config.h"
(0010) unsigned char syserr;
(0011) unsigned char *week_list[7]={
(0012) 	 				 		    "  Sunday ",
(0013) 			 					"  Monday ",
(0014) 			 					" Tuesday ",
(0015) 								"Wednesday",
(0016) 			 					"Thursday ",
(0017) 			 					" Friday  ",
(0018) 			 					"Saturday "
(0019) };
(0020) unsigned char write_buff[8],read_buff[8],time_tmp[]="00:00:00",data_tmp[]="2008.01.01",*week_tmp;
(0021) unsigned char time[7]={
(0022) 		 	  		   0x40/*秒*/,
(0023) 					   0x59/*分*/,
(0024) 					   0x23/*时*/,
(0025) 					   0x29/*天*/,
(0026) 					   0x05/*星期*/,
(0027) 					   0x02/*月/世纪*/,
(0028) 					   0x08/*年*/
(0029) };
(0030) /*************************************************************************
(0031) ** 函数名称: clear(unsigned char *p,unsigned char num)
(0032) ** 功能描述: 清除指定区域指定长度的数据
(0033) ** 输 入: unsigned char *p :起始地址   unsigned char num :零数据长度
(0034) ** 输出	 : 
(0035) ** 全局变量: 
(0036) ** 调用模块: 
(0037) ** 说明:
(0038) ** 注意:
(0039) **************************************************************************/
(0040) void clear(unsigned char *p,unsigned char num)
(0041) {
(0042)  for(;num>0;num--)
_clear:
  num                  --> R18
  p                    --> R16
    01D5 C006      RJMP	0x01DC
(0043)  	{
(0044) 	 *p=0;
    01D6 2422      CLR	R2
    01D7 01F8      MOVW	R30,R16
    01D8 8220      STD	Z+0,R2
(0045) 	 p++;
    01D9 5F0F      SUBI	R16,0xFF
    01DA 4F1F      SBCI	R17,0xFF
    01DB 952A      DEC	R18
    01DC 2422      CLR	R2
    01DD 1622      CP	R2,R18
    01DE F3B8      BCS	0x01D6
    01DF 9508      RET
_PCF8536_wt:
  t                    --> R10
  data                 --> R20
  add                  --> R22
    01E0 940E04DD  CALL	push_gset3
    01E2 2F42      MOV	R20,R18
    01E3 01B8      MOVW	R22,R16
(0046) 	}
(0047) }
(0048) /*************************************************************************
(0049) ** 函数名称: PCF8536_wt(unsigned int add,unsigned char data)
(0050) ** 功能描述: 向PCF8563指定地址写入一条数据
(0051) ** 输 入: unsigned int add    :高八位为器件地址,低八位为内部寄存器地址
(0052)    		   unsigned char data  :需要写入的数据
(0053) ** 输出	 : 
(0054) ** 全局变量: 
(0055) ** 调用模块: 
(0056) ** 说明:
(0057) ** 注意:
(0058) **************************************************************************/
(0059) void PCF8536_wt(unsigned int add,unsigned char data)
(0060) {
(0061)  unsigned char t;
(0062)  t=add>>8;
    01E4 015B      MOVW	R10,R22
    01E5 2CAB      MOV	R10,R11
    01E6 24BB      CLR	R11
(0063)  t<<=1;
    01E7 0CAA      LSL	R10
(0064)  i2cstart();
    01E8 940E0187  CALL	_i2cstart
(0065)  if(i2cwt(W_ADD_COM+t)==SLAW)
    01EA 2D0A      MOV	R16,R10
    01EB 550E      SUBI	R16,0x5E
    01EC 940E018F  CALL	_i2cwt
    01EE 3108      CPI	R16,0x18
    01EF F439      BNE	0x01F7
(0066)  	{
(0067) 	 i2cwt(add);
    01F0 2F06      MOV	R16,R22
    01F1 940E018F  CALL	_i2cwt
(0068) 	 i2cwt(data);
    01F3 2F04      MOV	R16,R20
    01F4 940E018F  CALL	_i2cwt
(0069) 	}
    01F6 C003      RJMP	0x01FA
(0070)  else syserr=ERR_SLAW;
    01F7 E081      LDI	R24,1
    01F8 938001AD  STS	syserr,R24
(0071)  i2cstop();
    01FA 940E01A7  CALL	_i2cstop
    01FC 940E04D3  CALL	pop_gset3
    01FE 9508      RET
_PCF8536_wt_p:
  t                    --> R12
  num                  --> R20
  p                    --> R22
  add                  --> R10
    01FF 940E04DB  CALL	push_gset4
    0201 01B9      MOVW	R22,R18
    0202 0158      MOVW	R10,R16
    0203 8548      LDD	R20,Y+8
(0072) }
(0073) /*************************************************************************
(0074) ** 函数名称: PCF8536_wt_p(unsigned int add,unsigned char *p,unsigned char num)
(0075) ** 功能描述: 向PCF8563地址连续的寄存器写入系列数据
(0076) ** 输 入: unsigned int add    :高八位为器件地址,低八位为内部寄存器地址
(0077)    		   unsigned char *p    :需要写入的数据域的起始地址
(0078) 		   unsigned char num   :写入数据的个数
(0079) ** 输出	 : 
(0080) ** 全局变量: 
(0081) ** 调用模块: 
(0082) ** 说明:写入数据区域为地址连续的寄存器
(0083) ** 注意:
(0084) **************************************************************************/
(0085) void PCF8536_wt_p(unsigned int add,unsigned char *p,unsigned char num)
(0086) {
(0087)  unsigned char t;
(0088)  t=add>>8;
    0204 0165      MOVW	R12,R10
    0205 2CCD      MOV	R12,R13
    0206 24DD      CLR	R13
(0089)  t<<=1;
    0207 0CCC      LSL	R12
(0090)  i2cstart();
    0208 940E0187  CALL	_i2cstart
(0091)  if(i2cwt(W_ADD_COM+t)==SLAW)
    020A 2D0C      MOV	R16,R12
    020B 550E      SUBI	R16,0x5E
    020C 940E018F  CALL	_i2cwt
    020E 3108      CPI	R16,0x18
    020F F481      BNE	0x0220
(0092)  	{
(0093) 	 i2cwt(add);
    0210 2D0A      MOV	R16,R10
    0211 940E018F  CALL	_i2cwt
(0094) 	 for(;num>0;num--)
    0213 C008      RJMP	0x021C
(0095) 	 	{
(0096) 		 i2cwt(*p);
    0214 01FB      MOVW	R30,R22
    0215 8100      LDD	R16,Z+0
    0216 940E018F  CALL	_i2cwt
(0097) 		 p++;
    0218 5F6F      SUBI	R22,0xFF
    0219 4F7F      SBCI	R23,0xFF
(0098) 		 _NOP();
    021A 0000      NOP
    021B 954A      DEC	R20
    021C 2422      CLR	R2
    021D 1624      CP	R2,R20
    021E F3A8      BCS	0x0214
(0099) 		}
(0100) 	}
    021F C003      RJMP	0x0223
(0101)  else syserr=ERR_SLAW;
    0220 E081      LDI	R24,1
    0221 938001AD  STS	syserr,R24
(0102)  i2cstop();
    0223 940E01A7  CALL	_i2cstop
    0225 940E04D6  CALL	pop_gset4
    0227 9508      RET
_PCF8536_rd:
  t                    --> R12
  num                  --> R20
  p                    --> R22
  add                  --> R10
    0228 940E04DB  CALL	push_gset4
    022A 01B9      MOVW	R22,R18
    022B 0158      MOVW	R10,R16
    022C 8548      LDD	R20,Y+8
(0103) }
(0104) /*************************************************************************
(0105) ** 函数名称: PCF8536_rd(unsigned int add,unsigned char *p,unsigned char num)
(0106) ** 功能描述: 读PCF8563
(0107) ** 输 入: unsigned int add    :高八位为器件地址,低八位为内部寄存器地址
(0108)    		   unsigned char *p    :读出的数据存放地址的起始地址
(0109) 		   unsigned char num   :读出数据的个数
(0110) ** 输出	 : 
(0111) ** 全局变量: 
(0112) ** 调用模块: 
(0113) ** 说明:
(0114) ** 注意:
(0115) **************************************************************************/
(0116) void PCF8536_rd(unsigned int add,unsigned char *p,unsigned char num)
(0117) {
(0118)  unsigned char t;
(0119)  t=add>>8;
    022D 0165      MOVW	R12,R10
    022E 2CCD      MOV	R12,R13
    022F 24DD      CLR	R13
(0120)  t<<=1;
    0230 0CCC      LSL	R12
(0121)  i2cstart();
    0231 940E0187  CALL	_i2cstart
(0122)  if(i2cwt(W_ADD_COM+t)==SLAW)
    0233 2D0C      MOV	R16,R12
    0234 550E      SUBI	R16,0x5E
    0235 940E018F  CALL	_i2cwt
    0237 3108      CPI	R16,0x18
    0238 F421      BNE	0x023D
(0123)  	{
(0124) 	 i2cwt(add);
    0239 2D0A      MOV	R16,R10
    023A 940E018F  CALL	_i2cwt
(0125) 	}
    023C C003      RJMP	0x0240
(0126)  else syserr=ERR_SLAW;
    023D E081      LDI	R24,1
    023E 938001AD  STS	syserr,R24
(0127)  
(0128)  i2cstart();
    0240 940E0187  CALL	_i2cstart
(0129)  if(i2cwt(R_ADD_COM+t)==SLAW)
    0242 2D0C      MOV	R16,R12
    0243 550D      SUBI	R16,0x5D
    0244 940E018F  CALL	_i2cwt
    0246 3108      CPI	R16,0x18
    0247 F421      BNE	0x024C
(0130)  	{
(0131) 	 i2cwt(add);
    0248 2D0A      MOV	R16,R10
    0249 940E018F  CALL	_i2cwt
(0132) 	}
    024B C00B      RJMP	0x0257
(0133)  else syserr=ERR_SLAW;
    024C E081      LDI	R24,1
    024D 938001AD  STS	syserr,R24
(0134)  
(0135)  for(;num>0;num--)
    024F C007      RJMP	0x0257
(0136)  	{
(0137) 	 *p=i2crd();
    0250 940E019D  CALL	_i2crd
    0252 01FB      MOVW	R30,R22
    0253 8300      STD	Z+0,R16
(0138) 	 p++;
    0254 5F6F      SUBI	R22,0xFF
    0255 4F7F      SBCI	R23,0xFF
    0256 954A      DEC	R20
    0257 2422      CLR	R2
    0258 1624      CP	R2,R20
    0259 F3B0      BCS	0x0250
    025A 940E04D6  CALL	pop_gset4
    025C 9508      RET
(0139) 	} 
(0140) }
(0141) /*************************************************************************
(0142) ** 函数名称: PCF8563_init(void)
(0143) ** 功能描述: PCF8563初始化
(0144) ** 输 入: 
(0145) ** 输出	 : 
(0146) ** 全局变量: 
(0147) ** 调用模块: 
(0148) ** 说明:
(0149) ** 注意:
(0150) **************************************************************************/
(0151) void PCF8563_init(void)
(0152) {
(0153)  clear(write_buff,8);
_PCF8563_init:
    025D E028      LDI	R18,0x8
    025E EB08      LDI	R16,0xB8
    025F E011      LDI	R17,1
    0260 DF74      RCALL	_clear
(0154)  clear(read_buff,8);
    0261 E028      LDI	R18,0x8
    0262 EB00      LDI	R16,0xB0
    0263 E011      LDI	R17,1
    0264 DF70      RCALL	_clear
(0155)  
(0156)  PCF8536_wt(0x00,0x20);//写寄存器1,停止计时
    0265 E220      LDI	R18,0x20
    0266 2700      CLR	R16

⌨️ 快捷键说明

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