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

📄 ds1302.lst

📁 我自己编写的atmega16的ds1302源程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    002E E5CF      LDI	R28,0x5F
    002F E0D4      LDI	R29,4
    0030 BFCD      OUT	0x3D,R28
    0031 BFDE      OUT	0x3E,R29
    0032 51C0      SUBI	R28,0x10
    0033 40D0      SBCI	R29,0
    0034 EA0A      LDI	R16,0xAA
    0035 8308      STD	Y+0,R16
    0036 2400      CLR	R0
    0037 E6E8      LDI	R30,0x68
    0038 E0F0      LDI	R31,0
    0039 E010      LDI	R17,0
    003A 36EA      CPI	R30,0x6A
    003B 07F1      CPC	R31,R17
    003C F011      BEQ	0x003F
    003D 9201      ST	R0,Z+
    003E CFFB      RJMP	0x003A
    003F 8300      STD	Z+0,R16
    0040 E5E4      LDI	R30,0x54
    0041 E0F0      LDI	R31,0
    0042 E6A0      LDI	R26,0x60
    0043 E0B0      LDI	R27,0
    0044 E010      LDI	R17,0
    0045 35EC      CPI	R30,0x5C
    0046 07F1      CPC	R31,R17
    0047 F021      BEQ	0x004C
    0048 95C8      LPM
    0049 9631      ADIW	R30,1
    004A 920D      ST	R0,X+
    004B CFF9      RJMP	0x0045
    004C 940E012E  CALL	_main
_exit:
    004E CFFF      RJMP	_exit
_RTInputByte:
  i                    --> R20
  j                    --> R10
  x                    --> R22
    004F 940E019D  CALL	push_gset3
    0051 2F60      MOV	R22,R16
FILE: F:\自编程序\M16\ds1302\ds1302.c
(0001) #include<iom16v.h>
(0002) #include<macros.h> 
(0003) #include "ds1302.h"
(0004) unsigned char INITDATE[8]={0x55,	//55秒
(0005) 						   0x59,	//59分
(0006) 						   0x23,	//23时  24小时制
(0007) 						   0x31,	//21日
(0008) 						   0x12,	//08月
(0009) 						   0x02,	//星期2
(0010) 						   0x07,	//2007年
(0011) 						   0x80		//写保护
(0012) 						  };
(0013) /********************************************************************  
(0014)  函 数 名:RTInputByte() 
(0015)  功    能:实时时钟写入一字节 
(0016)  说    明:往DS1302写入1Byte数据 (内部函数) 
(0017)  入口参数:d 写入的数据  
(0018)  返 回 值:无   
(0019)  ***********************************************************************/ 
(0020) void RTInputByte(unsigned char  x)  
(0021) {  
(0022)     unsigned char  i,j; 
(0023)     for(i=0; i<8;i++) 
    0052 2744      CLR	R20
    0053 C019      RJMP	0x006D
(0024)     { 
(0025)   	   if(x&(1<<i))
    0054 E001      LDI	R16,1
    0055 2F14      MOV	R17,R20
    0056 940E01A5  CALL	lsl8
    0058 2E26      MOV	R2,R22
    0059 2220      AND	R2,R16
    005A F011      BEQ	0x005D
(0026) 	    DS1302_PORT|=(1<<DS1302_DATA);
    005B 9A96      SBI	0x12,6
    005C C001      RJMP	0x005E
(0027)  	   else 
(0028) 	    DS1302_PORT&=~(1<<DS1302_DATA);  
    005D 9896      CBI	0x12,6
(0029) 	   DS1302_PORT|=(1<<DS1302_CLK);
    005E 9A97      SBI	0x12,7
(0030) 	   for(j=0; j<5;j++);
    005F 24AA      CLR	R10
    0060 C001      RJMP	0x0062
    0061 94A3      INC	R10
    0062 2D8A      MOV	R24,R10
    0063 3085      CPI	R24,5
    0064 F3E0      BCS	0x0061
(0031)  	   DS1302_PORT&=~(1<<DS1302_CLK);
    0065 9897      CBI	0x12,7
(0032) 	   for(j=0; j<5;j++);                   
    0066 24AA      CLR	R10
    0067 C001      RJMP	0x0069
    0068 94A3      INC	R10
    0069 2D8A      MOV	R24,R10
    006A 3085      CPI	R24,5
    006B F3E0      BCS	0x0068
    006C 9543      INC	R20
    006D 3048      CPI	R20,0x8
    006E F328      BCS	0x0054
(0033)     }  
(0034) } 
    006F 940E017C  CALL	pop_gset3
    0071 9508      RET
_RTOutputByte:
  data                 --> R20
  k                    --> R22
  i                    --> R10
  j                    --> R12
    0072 940E01A1  CALL	push_gset4
(0035) /********************************************************************  
(0036)  函 数 名:RTOutputByte() 
(0037)  功    能:实时时钟读取一字节 
(0038)  说    明:从DS1302读取1Byte数据 (内部函数) 
(0039)  入口参数:无   
(0040)  返 回 值:ACC 
(0041)  ***********************************************************************/ 
(0042) unsigned char RTOutputByte(void)  
(0043) {  
(0044)     unsigned char i,k,data,j; 
(0045) 	DS1302_DDR&=~(1<<DS1302_DATA);
    0074 988E      CBI	0x11,6
(0046) 	for(j=0; j<5;j++); 
    0075 24CC      CLR	R12
    0076 C001      RJMP	0x0078
    0077 94C3      INC	R12
    0078 2D8C      MOV	R24,R12
    0079 3085      CPI	R24,5
    007A F3E0      BCS	0x0077
(0047)     for(i=0; i<8; i++) 
    007B 24AA      CLR	R10
    007C C01F      RJMP	0x009C
(0048)     {           
(0049)       k=(DS1302_PIN&(1<<DS1302_DATA));    //读数据,从低位开始  
    007D B360      IN	R22,0x10
    007E 7460      ANDI	R22,0x40
(0050)       if(k)  
    007F F031      BEQ	0x0086
(0051)         data|=(1<<i);  
    0080 E001      LDI	R16,1
    0081 2D1A      MOV	R17,R10
    0082 940E01A5  CALL	lsl8
    0084 2B40      OR	R20,R16
    0085 C007      RJMP	0x008D
(0052)       else  
(0053)         data&=~(1<<i);  
    0086 E001      LDI	R16,1
    0087 2D1A      MOV	R17,R10
    0088 940E01A5  CALL	lsl8
    008A 2E20      MOV	R2,R16
    008B 9420      COM	R2
    008C 2142      AND	R20,R2
(0054)       DS1302_PORT|=(1<<DS1302_CLK);
    008D 9A97      SBI	0x12,7
(0055) 	  for(j=0; j<5;j++);
    008E 24CC      CLR	R12
    008F C001      RJMP	0x0091
    0090 94C3      INC	R12
    0091 2D8C      MOV	R24,R12
    0092 3085      CPI	R24,5
    0093 F3E0      BCS	0x0090
(0056)       DS1302_PORT&=~(1<<DS1302_CLK);
    0094 9897      CBI	0x12,7
(0057) 	  for(j=0; j<5;j++); 
    0095 24CC      CLR	R12
    0096 C001      RJMP	0x0098
    0097 94C3      INC	R12
    0098 2D8C      MOV	R24,R12
    0099 3085      CPI	R24,5
    009A F3E0      BCS	0x0097
    009B 94A3      INC	R10
    009C 2D8A      MOV	R24,R10
    009D 3088      CPI	R24,0x8
    009E F2F0      BCS	0x007D
(0058)     }  
(0059) 	DS1302_DDR|=(1<<DS1302_DATA);
    009F 9A8E      SBI	0x11,6
(0060) 	return(data);  
    00A0 2F04      MOV	R16,R20
    00A1 940E017F  CALL	pop_gset4
    00A3 9508      RET
_BCDtoASCII:
  j                    --> R20
  i                    --> R22
  pstr                 --> R18
  cBCD                 --> R16
    00A4 940E0199  CALL	push_gset2
(0061) } 
(0062) 
(0063) void BCDtoASCII(unsigned char cBCD,unsigned char *pstr)
(0064) {
(0065) 	unsigned char i,j;
(0066) 	i=cBCD>>4;
    00A6 2F60      MOV	R22,R16
    00A7 9562      SWAP	R22
    00A8 706F      ANDI	R22,0xF
(0067) 	j=cBCD&0x0F;
    00A9 2F40      MOV	R20,R16
    00AA 704F      ANDI	R20,0xF
(0068) 	*pstr++=i+0x30;
    00AB 2F86      MOV	R24,R22
    00AC 5D80      SUBI	R24,0xD0
    00AD 01F9      MOVW	R30,R18
    00AE 9381      ST	R24,Z+
    00AF 019F      MOVW	R18,R30
(0069) 	*pstr=j+0x30;
    00B0 2F84      MOV	R24,R20
    00B1 5D80      SUBI	R24,0xD0
    00B2 8380      STD	Z+0,R24
(0070) }
    00B3 940E0179  CALL	pop_gset2
    00B5 9508      RET
_W1302:
  ucDa                 --> R20
  ucAddr               --> R22
    00B6 940E0199  CALL	push_gset2
    00B8 2F42      MOV	R20,R18
    00B9 2F60      MOV	R22,R16
(0071) /********************************************************************  
(0072)  函 数 名:W1302() 
(0073)  功    能:往DS1302写入数据 
(0074)  说    明:先写地址,后写命令/数据 (内部函数) 
(0075)  调    用:RTInputByte() , RTOutputByte() 
(0076)  入口参数:ucAddr: DS1302地址, ucData: 要写的数据 
(0077)  返 回 值:无 
(0078)  ***********************************************************************/ 
(0079) void W1302(unsigned char ucAddr, unsigned char ucDa) 
(0080) {   
(0081)     DS1302_PORT&=~(1<<DS1302_RST);  // RST  to L 
    00BA 9895      CBI	0x12,5
(0082)     DS1302_PORT&=~(1<<DS1302_CLK);  // CLK  to L 
    00BB 9897      CBI	0x12,7
(0083)     DS1302_PORT|=(1<<DS1302_RST);  // RST  to H 
    00BC 9A95      SBI	0x12,5
(0084) 
(0085)     RTInputByte(ucAddr);       /* 地址,命令 */ 
    00BD 2F06      MOV	R16,R22
    00BE DF90      RCALL	_RTInputByte
(0086)     RTInputByte(ucDa);         /* 写1Byte数据*/ 
    00BF 2F04      MOV	R16,R20
    00C0 DF8E      RCALL	_RTInputByte
(0087) 
(0088)     DS1302_PORT|=(1<<DS1302_CLK); //CLK  to H 
    00C1 9A97      SBI	0x12,7
(0089) 	DS1302_PORT&=~(1<<DS1302_RST); //RST  to L  
    00C2 9895      CBI	0x12,5
(0090) 
(0091) } 
    00C3 940E0179  CALL	pop_gset2
    00C5 9508      RET
_R1302:
  ucData               --> R20
  ucAddr               --> R20
    00C6 940E0182  CALL	push_gset1
    00C8 2F40      MOV	R20,R16
(0092) /********************************************************************  
(0093)  函 数 名:R1302() 
(0094)  功    能:读取DS1302某地址的数据 
(0095)  说    明:先写地址,后读命令/数据 (内部函数) 
(0096)  调    用:RTInputByte() , RTOutputByte() 
(0097)  入口参数:ucAddr: DS1302地址 
(0098)  返 回 值:ucData :读取的数据 
(0099) ***********************************************************************/ 
(0100) unsigned char R1302(unsigned char ucAddr) 
(0101) { 
(0102)     unsigned char ucData;    
(0103)     DS1302_PORT&=~(1<<DS1302_RST);  // RST  to L 
    00C9 9895      CBI	0x12,5
(0104)     DS1302_PORT&=~(1<<DS1302_CLK);  // CLK  to L 
    00CA 9897      CBI	0x12,7
(0105)     DS1302_PORT|=(1<<DS1302_RST);  // RST  to H 
    00CB 9A95      SBI	0x12,5
(0106)     RTInputByte(ucAddr);             /* 地址,命令 */ 
    00CC 2F04      MOV	R16,R20
    00CD DF81      RCALL	_RTInputByte
(0107)     ucData = RTOutputByte();         /* 读1Byte数据 */ 
    00CE DFA3      RCALL	_RTOutputByte
    00CF 2F40      MOV	R20,R16
(0108)     DS1302_PORT|=(1<<DS1302_CLK); //CLK  to H 
    00D0 9A97      SBI	0x12,7
(0109)     DS1302_PORT&=~(1<<DS1302_RST); //RST  to L
    00D1 9895      CBI	0x12,5
(0110) 	return(ucData); 
    00D2 940E0185  CALL	pop_gset1
    00D4 9508      RET
(0111) } 
(0112) void init_1302()
(0113) { 
(0114)   DS1302_DDR|=(1<<DS1302_RST);
_init_1302:
    00D5 9A8D      SBI	0x11,5
(0115)   DS1302_DDR|=(1<<DS1302_CLK);
    00D6 9A8F      SBI	0x11,7
(0116)   DS1302_DDR|=(1<<DS1302_DATA);
    00D7 9A8E      SBI	0x11,6
(0117)   W1302(0x8e,0x00);      //关闭寄存器写保护
    00D8 2722      CLR	R18
    00D9 E80E      LDI	R16,0x8E
    00DA DFDB      RCALL	_W1302

⌨️ 快捷键说明

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