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

📄 ds1203.lst

📁 DS1302
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    0041 E5CF      LDI	R28,0x5F
    0042 E0D4      LDI	R29,4
    0043 BFCD      OUT	0x3D,R28
    0044 BFDE      OUT	0x3E,R29
    0045 51C0      SUBI	R28,0x10
    0046 40D0      SBCI	R29,0
    0047 EA0A      LDI	R16,0xAA
    0048 8308      STD	Y+0,R16
    0049 2400      CLR	R0
    004A EBEB      LDI	R30,0xBB
    004B E0F0      LDI	R31,0
    004C E010      LDI	R17,0
    004D 3DE5      CPI	R30,0xD5
    004E 07F1      CPC	R31,R17
    004F F011      BEQ	0x0052
    0050 9201      ST	R0,Z+
    0051 CFFB      RJMP	0x004D
    0052 8300      STD	Z+0,R16
    0053 E2E6      LDI	R30,0x26
    0054 E0F0      LDI	R31,0
    0055 E6A0      LDI	R26,0x60
    0056 E0B0      LDI	R27,0
    0057 E010      LDI	R17,0
    0058 38E1      CPI	R30,0x81
    0059 07F1      CPC	R31,R17
    005A F021      BEQ	0x005F
    005B 95C8      LPM
    005C 9631      ADIW	R30,1
    005D 920D      ST	R0,X+
    005E CFF9      RJMP	0x0058
    005F D703      RCALL	_main
_exit:
    0060 CFFF      RJMP	_exit
FILE: E:\biyesheji\SUCCES~1\SENDSE~1\SETPFI~2\程序\ds1302.h
(0001) //ICC-AVR 修改日期: 2007-05-01 15:38:44
(0002) // CenWenJiao
(0003) // Target : M8
(0004) // Crystal: 1.0000Mhz
(0005) #define uchar   unsigned char  
(0006) /*cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
(0007)                         定义DS1302
(0008) ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc*/
(0009) #define DS1302_RESET1       PORTC|=(1<<PC0)  
(0010) #define DS1302_RESET0       PORTC&=~(1<<PC0)  
(0011) #define DS1302_CLK1         PORTC|=(1<<PC1)
(0012) #define DS1302_CLK0         PORTC&=~(1<<PC1) 
(0013) #define DS1302_READ_DATA    PINC&0X04
(0014) #define DS1302_WRITE_DATA1  PORTC|=(1<<PC2)
(0015) #define DS1302_WRITE_DATA0  PORTC&=~(1<<PC2) 
(0016) #define DS1302_DATA_OUTPUT  DDRC|=(1<<PC2)
(0017) #define DS1302_DATA_INPUT   DDRC&=~(1<<PC2) 
(0018) 
(0019) /*ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
(0020)                      定义读写单元地址
(0021) cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc*/
(0022) //读
(0023) #define Rsec1  0x81            //秒
(0024) #define Rmin1  0x83            //分
(0025) #define Rhou1  0x85            //时
(0026) #define Rdat1  0x87            //日
(0027) #define Rmon1  0x89            //月
(0028) #define Rwee1  0x8b            //周
(0029) #define Ryea1  0x8d            //年
(0030) //写
(0031) #define Wsec  0x80            //秒
(0032) #define Wmin  0x82            //分
(0033) #define Whou  0x84            //时
(0034) #define Wdat  0x86            //日
(0035) #define Wmon  0x88            //月
(0036) #define Wwee  0x8a            //周
(0037) #define Wyea  0x8c            //年
(0038) uchar second,minute,hour,date,week,month,year;   //读出后的时间存储单元
(0039) char WriteAddress[7]={Wyea,Wmon,Wdat,Whou,Wmin,Wsec,Wwee};  //写地址
(0040) char    WriteTime[7]={0x07,0x05,0x02,0x13,0x50,0x30,0x00};//写的时间
(0041) 
(0042) uchar secondtl,secondth,minutetl,minuteth,hourtl,hourth;//定义时钟数据的高低位置
(0043) uchar datetl,dateth,monthtl,monthth,yeartl,yearth;
(0044) uchar second1,minute1,hour1,date1,week1,month1,year1;
(0045) /*cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
(0046)                         定义DS1302初始化程序
(0047) cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc*/
(0048) void DS1302_set(void) 
(0049) {  char i;
(0050)    DS1302_CLK0;            
_DS1302_set:
  i                    --> R16
    0061 98A9      CBI	0x15,1
(0051)    DS1302_RESET0; 
    0062 98A8      CBI	0x15,0
(0052)    for(i=0;i<8;i++)
    0063 2700      CLR	R16
    0064 C002      RJMP	0x0067
(0053)    {
(0054)      NOP();
    0065 0000      NOP
    0066 9503      INC	R16
    0067 3008      CPI	R16,0x8
    0068 F3E0      BCS	0x0065
(0055)    }
(0056)     DS1302_RESET1; 
    0069 9AA8      SBI	0x15,0
    006A 9508      RET
_DS1302_Write:
  i                    --> R20
  x                    --> R22
    006B D78F      RCALL	push_gset2
    006C 2F60      MOV	R22,R16
(0057) }
(0058) /*cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
(0059)                         定义m8向DS1302发送程序
(0060) cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc*/
(0061) void DS1302_Write(char x)
(0062) {
(0063)   int i;
(0064)  
(0065)   DS1302_CLK0;             
    006D 98A9      CBI	0x15,1
(0066)   DS1302_DATA_OUTPUT;              //控制数据线
    006E 9AA2      SBI	0x14,2
(0067)  for(i=0;i<8;i++)
    006F 2744      CLR	R20
    0070 2755      CLR	R21
(0068)         {  DS1302_CLK0;             //输出
    0071 98A9      CBI	0x15,1
(0069)         if((x&(1<<i)))
    0072 E001      LDI	R16,1
    0073 E010      LDI	R17,0
    0074 019A      MOVW	R18,R20
    0075 D79E      RCALL	lsl16
    0076 2E26      MOV	R2,R22
    0077 2433      CLR	R3
    0078 2220      AND	R2,R16
    0079 2231      AND	R3,R17
    007A 2022      TST	R2
    007B F411      BNE	0x007E
    007C 2033      TST	R3
    007D F011      BEQ	0x0080
(0070)             DS1302_WRITE_DATA1 ;
    007E 9AAA      SBI	0x15,2
    007F C001      RJMP	0x0081
(0071)         else 
(0072)            DS1302_WRITE_DATA0 ;
    0080 98AA      CBI	0x15,2
(0073) 	       NOP();
    0081 0000      NOP
(0074) 		DS1302_CLK1; 
    0082 9AA9      SBI	0x15,1
(0075) 		  NOP();
    0083 0000      NOP
    0084 5F4F      SUBI	R20,0xFF
    0085 4F5F      SBCI	R21,0xFF
    0086 3048      CPI	R20,0x8
    0087 E0E0      LDI	R30,0
    0088 075E      CPC	R21,R30
    0089 F33C      BLT	0x0071
(0076)           }
(0077)   DS1302_CLK0;
    008A 98A9      CBI	0x15,1
    008B D765      RCALL	pop_gset2
    008C 9508      RET
_DS1302_WriteT:
  time                 --> R20
  ddr                  --> R22
    008D D76D      RCALL	push_gset2
    008E 2F42      MOV	R20,R18
    008F 2F60      MOV	R22,R16
(0078) }
(0079) //单独矫正某个时间单元
(0080) void DS1302_WriteT(char ddr,char time)
(0081) {
(0082) DS1302_set();
    0090 DFD0      RCALL	_DS1302_set
(0083) DS1302_Write(ddr);
    0091 2F06      MOV	R16,R22
    0092 DFD8      RCALL	_DS1302_Write
(0084) DS1302_Write(time);
    0093 2F04      MOV	R16,R20
    0094 DFD6      RCALL	_DS1302_Write
    0095 D75B      RCALL	pop_gset2
    0096 9508      RET
_DS1302_Read:
  k                    --> R20
  temp                 --> R22
  i                    --> R10
  addr                 --> R20
    0097 D761      RCALL	push_gset3
    0098 2F40      MOV	R20,R16
(0085) } 
(0086) /*CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
(0087)                         定义m8由DS1302接收程序
(0088) CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC*/
(0089) uchar DS1302_Read(char addr) //XX
(0090) {  
(0091)   uchar i,temp,k;
(0092)   temp=0;
    0099 2766      CLR	R22
(0093)   DS1302_DATA_OUTPUT;
    009A 9AA2      SBI	0x14,2
(0094)   DS1302_RESET0;
    009B 98A8      CBI	0x15,0
(0095)   DS1302_CLK0;         
    009C 98A9      CBI	0x15,1
(0096)   asm("nop");
    009D 0000      NOP
(0097)   asm("nop");
    009E 0000      NOP
(0098)   asm("nop");
    009F 0000      NOP
(0099)   asm("nop");
    00A0 0000      NOP
(0100)   DS1302_RESET1;                  //时钟信号低时拉高RST初始化
    00A1 9AA8      SBI	0x15,0
(0101)   temp=addr;
    00A2 2F64      MOV	R22,R20
(0102)   for(i=0;i<8;i++) 
    00A3 24AA      CLR	R10
    00A4 C00E      RJMP	0x00B3
(0103)   { 
(0104)   	if(temp&(1<<i)) 
    00A5 E001      LDI	R16,1
    00A6 2D1A      MOV	R17,R10
    00A7 D773      RCALL	lsl8
    00A8 2E26      MOV	R2,R22
    00A9 2220      AND	R2,R16
    00AA F011      BEQ	0x00AD
(0105)   		 DS1302_WRITE_DATA1 ;  
    00AB 9AAA      SBI	0x15,2
    00AC C001      RJMP	0x00AE
(0106)   	else 
(0107)   		 DS1302_WRITE_DATA0 ;
    00AD 98AA      CBI	0x15,2
(0108)     asm("nop");
    00AE 0000      NOP
(0109)     asm("nop"); 
    00AF 0000      NOP
(0110)   	DS1302_CLK1;             //时钟上升沿写入数据 	
    00B0 9AA9      SBI	0x15,1
(0111) 	DS1302_CLK0;             //时钟拉低电平 
    00B1 98A9      CBI	0x15,1
    00B2 94A3      INC	R10
    00B3 2D8A      MOV	R24,R10
    00B4 3088      CPI	R24,0x8
    00B5 F378      BCS	0x00A5
(0112)   }
(0113)    DS1302_DATA_INPUT;
    00B6 98A2      CBI	0x14,2
(0114) //以上为写地址
(0115)  for(i=0;i<8;i++)
    00B7 24AA      CLR	R10
    00B8 C014      RJMP	0x00CD
(0116)   { 
(0117)     k=(DS1302_READ_DATA);  //k=(T_PIN&T_IO);
    00B9 B343      IN	R20,0x13
    00BA 7044      ANDI	R20,4
(0118)   if(k==0X04)       //if(k==T_IO)
    00BB 3044      CPI	R20,4
    00BC F429      BNE	0x00C2
(0119)       temp|=(1<<i);
    00BD E001      LDI	R16,1
    00BE 2D1A      MOV	R17,R10
    00BF D75B      RCALL	lsl8
    00C0 2B60      OR	R22,R16
    00C1 C006      RJMP	0x00C8
(0120)   else
(0121)   	  temp&=~(1<<i);
    00C2 E001      LDI	R16,1
    00C3 2D1A      MOV	R17,R10
    00C4 D756      RCALL	lsl8
    00C5 2E20      MOV	R2,R16
    00C6 9420      COM	R2
    00C7 2162      AND	R22,R2
(0122) 	    asm("nop");
    00C8 0000      NOP
(0123)        asm("nop"); 
    00C9 0000      NOP
(0124)    DS1302_CLK1;              //上升沿读出数据 
    00CA 9AA9      SBI	0x15,1
(0125)    DS1302_CLK0;             //时钟电平拉低 
    00CB 98A9      CBI	0x15,1
    00CC 94A3      INC	R10
    00CD 2D8A      MOV	R24,R10
    00CE 3088      CPI	R24,0x8
    00CF F348      BCS	0x00B9
(0126)   }
(0127)    DS1302_DATA_OUTPUT;
    00D0 9AA2      SBI	0x14,2
(0128)    DS1302_CLK0; 
    00D1 98A9      CBI	0x15,1
(0129)    DS1302_RESET0;             //禁止DS1302 
    00D2 98A8      CBI	0x15,0
(0130)  return(temp);
    00D3 2F06      MOV	R16,R22
    00D4 D71E      RCALL	pop_gset3
    00D5 9508      RET
(0131) } 
(0132) //ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
(0133) void DataFenli(void)
(0134) {   
(0135)        secondtl=second&0x0f;	//分离秒   
_DataFenli:
    00D6 918000D4  LDS	R24,second
    00D8 708F      ANDI	R24,0xF
    00D9 938000CD  STS	secondtl,R24
(0136) 	   secondth=(second>>4);
    00DB 918000D4  LDS	R24,second
    00DD 9582      SWAP	R24
    00DE 708F      ANDI	R24,0xF
    00DF 938000CC  STS	secondth,R24
(0137) 	  
(0138) 	   minutetl=minute&0x0f;   //分离分钟
    00E1 918000D3  LDS	R24,minute
    00E3 708F      ANDI	R24,0xF
    00E4 938000CB  STS	minutetl,R24
(0139) 	   minuteth=(minute>>4);
    00E6 918000D3  LDS	R24,minute
    00E8 9582      SWAP	R24
    00E9 708F      ANDI	R24,0xF
    00EA 938000CA  STS	minuteth,R24
(0140) 	  
(0141) 	   hourtl=hour&0x0f;      //分离小时
    00EC 918000D2  LDS	R24,hour
    00EE 708F      ANDI	R24,0xF
    00EF 938000C9  STS	hourtl,R24
(0142) 	   hourth=(hour>>4);
    00F1 918000D2  LDS	R24,hour
    00F3 9582      SWAP	R24
    00F4 708F      ANDI	R24,0xF
    00F5 938000C8  STS	hourth,R24
(0143)       
(0144) 	   datetl=date&0x0f;      //分离日期
    00F7 918000D1  LDS	R24,date
    00F9 708F      ANDI	R24,0xF
    00FA 938000C7  STS	datetl,R24
(0145) 	   dateth=(date>>4);
    00FC 918000D1  LDS	R24,date
    00FE 9582      SWAP	R24
    00FF 708F      ANDI	R24,0xF
    0100 938000C6  STS	dateth,R24
(0146) 	  
(0147) 	   monthtl=month&0x0f;    //分离月份
    0102 918000CF  LDS	R24,month
    0104 708F      ANDI	R24,0xF
    0105 938000C5  STS	monthtl,R24
(0148) 	   monthth=(month>>4);
    0107 918000CF  LDS	R24,month
    0109 9582      SWAP	R24
    010A 708F      ANDI	R24,0xF
    010B 938000C4  STS	monthth,R24
(0149) 	  
(0150) 	   yeartl=year&0x0f;     //分离年份
    010D 918000CE  LDS	R24,year
    010F 708F      ANDI	R24,0xF
    0110 938000C3  STS	yeartl,R24
(0151) 	   yearth=(year>>4);
    0112 918000CE  LDS	R24,year
    0114 9582      SWAP	R24
    0115 708F      ANDI	R24,0xF
    0116 938000C2  STS	yearth,R24
    0118 9508      RET
(0152) }
(0153) /*cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
(0154)                         定义DS1302读出时间程序
(0155) ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc*/
(0156) void DS1302_ReadTime(void)
(0157)  {
(0158)    second=DS1302_Read(Rsec1);
_DS1302_ReadTime:
    0119 E801      LDI	R16,0x81
    011A DF7C      RCALL	_DS1302_Read
    011B 930000D4  STS	second,R16
(0159)    minute=DS1302_Read(Rmin1);
    011D E803      LDI	R16,0x83
    011E DF78      RCALL	_DS1302_Read
    011F 930000D3  STS	minute,R16
(0160)    hour=DS1302_Read(Rhou1);
    0121 E805      LDI	R16,0x85
    0122 DF74      RCALL	_DS1302_Read
    0123 930000D2  STS	hour,R16
(0161)    date=DS1302_Read(Rdat1);
    0125 E807      LDI	R16,0x87
    0126 DF70      RCALL	_DS1302_Read
    0127 930000D1  STS	date,R16
(0162)    month=DS1302_Read(Rmon1);
    0129 E809      LDI	R16,0x89
    012A DF6C      RCALL	_DS1302_Read
    012B 930000CF  STS	month,R16
(0163)    year=DS1302_Read(Ryea1);
    012D E80D      LDI	R16,0x8D
    012E DF68      RCALL	_DS1302_Read
    012F 930000CE  STS	year,R16
(0164)   /* second=0x12;  用于测试分离程序
(0165)      minute=0x13;
(0166)      hour=0x16;
(0167)      date=0x30;
(0168)      month=0x05;
(0169)      year=0x07;*/
(0170)    DataFenli();
    0131 DFA4      RCALL	_DataFenli

⌨️ 快捷键说明

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