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

📄 ds1302.lst

📁 使用mega16单片机对dallas公司的定时器芯片DS1302进行读取与写入的驱动程序
💻 LST
字号:
__start:
__text_start:
    002A E5CF      LDI	R28,0x5F
    002B E0D4      LDI	R29,4
    002C BFCD      OUT	P3D,R28
    002D BFDE      OUT	P3E,R29
    002E 51C0      SUBI	R28,0x10
    002F 40D0      SBCI	R29,0
    0030 EA0A      LDI	R16,0xAA
    0031 8308      STD	R16,0+Y
    0032 2400      CLR	R0
    0033 E6E0      LDI	R30,0x60
    0034 E0F0      LDI	R31,0
    0035 E010      LDI	R17,0
    0036 36E0      CPI	R30,0x60
    0037 07F1      CPC	R31,R17
    0038 F011      BEQ	0x003B
    0039 9201      ST	R0,Z+
    003A CFFB      RJMP	0x0036
    003B 8300      STD	R16,0+Z
    003C E5E4      LDI	R30,0x54
    003D E0F0      LDI	R31,0
    003E E6A0      LDI	R26,0x60
    003F E0B0      LDI	R27,0
    0040 E010      LDI	R17,0
    0041 35E4      CPI	R30,0x54
    0042 07F1      CPC	R31,R17
    0043 F021      BEQ	0x0048
    0044 95C8      LPM
    0045 9631      ADIW	R30,1
    0046 920D      ST	R0,X+
    0047 CFF9      RJMP	0x0041
    0048 940E00E5  CALL	_main
_exit:
    004A CFFF      RJMP	_exit
_SetDateTime:
  i                    --> R20
  data                 --> R18
  cmd                  --> R16
    004B 940E0107  CALL	push_gset1
FILE: D:\单片机编程\iccavr\DS1302时钟\DS1302.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) 
(0004) //秒
(0005) #define SEC_W 0x80
(0006) #define SEC_R 0x81
(0007) 
(0008) //分
(0009) #define MIN_W 0x82
(0010) #define MIN_R 0x83
(0011) 
(0012) //小时
(0013) #define HR_W 0x84
(0014) #define HR_R 0x85
(0015) 
(0016) //日期
(0017) #define DATE_W 0x86
(0018) #define DATE_R 0x87
(0019) 
(0020) //月
(0021) #define MONTH_W 0x88
(0022) #define MONTH_R 0x89
(0023) 
(0024) //星期几
(0025) #define DAY_W 0x8A
(0026) #define DAY_R 0x8B
(0027) 
(0028) //年
(0029) #define YEAR_W 0x8C
(0030) #define YEAR_R 0x8D
(0031) 
(0032) //控制写保护
(0033) #define CONTROL_W 0x8E
(0034) #define CONTROL_R 0x8F
(0035) 
(0036) //控制充电
(0037) #define TRIC_CHARGE_W 0x90
(0038) #define TRIC_CHARGE_R 0x91
(0039) 
(0040) //突发模式
(0041) #define CLOCK_BURST_W 0xBE
(0042) #define CLOCK_BURST_R 0xBF
(0043) 
(0044) //写入时钟控制信息
(0045) //SZRST--PD5
(0046) //SZSDA--PD6
(0047) //SZSCK--PD7
(0048) void SetDateTime(unsigned char cmd,unsigned char data)
(0049) {
(0050)     unsigned char i=0;
    004D 2744      CLR	R20
(0051) 	PORTD&=0x1F;//设置PD5~PD7为低 0001 1111
    004E B382      IN	R24,P12
    004F 718F      ANDI	R24,0x1F
    0050 BB82      OUT	P12,R24
(0052) 	DDRD|=0xE0;//设置PD5~PD7为输出 1110 0000
    0051 B381      IN	R24,P11
    0052 6E80      ORI	R24,0xE0
    0053 BB81      OUT	P11,R24
(0053) 	PORTD|=0x20;//RESET为高 0010 0000
    0054 9A95      SBI	P12,5
(0054) 	for(i=0;i<8;i++)
    0055 C00D      RJMP	0x0063
(0055) 	{
(0056) 	    if(cmd&0x01)
    0056 FF00      SBRS	R16,0
    0057 C002      RJMP	0x005A
(0057) 		{
(0058) 		    PORTD|=0x40;  //0100 0000
    0058 9A96      SBI	P12,6
(0059) 		}
    0059 C003      RJMP	0x005D
(0060) 		else
(0061) 		{
(0062) 		    PORTD&=0xBF;  //1011 1111
    005A B382      IN	R24,P12
    005B 7B8F      ANDI	R24,0xBF
    005C BB82      OUT	P12,R24
(0063) 		} 
(0064) 		PORTD|=0x80;    //1000 0000
    005D 9A97      SBI	P12,7
(0065) 		PORTD&=0x7F;    //0111 1111
    005E B382      IN	R24,P12
    005F 778F      ANDI	R24,0x7F
    0060 BB82      OUT	P12,R24
(0066) 		cmd=cmd>>1;
    0061 9506      LSR	R16
    0062 9543      INC	R20
    0063 3048      CPI	R20,0x8
    0064 F388      BCS	0x0056
(0067) 	}
(0068) 	for(i=0;i<8;i++)
    0065 2744      CLR	R20
    0066 C00D      RJMP	0x0074
(0069) 	{
(0070) 	    if(data&0x01)
    0067 FF20      SBRS	R18,0
    0068 C002      RJMP	0x006B
(0071) 		{
(0072) 		    PORTD|=0x40;//0100 0000
    0069 9A96      SBI	P12,6
(0073) 		}
    006A C003      RJMP	0x006E
(0074) 		else
(0075) 		{
(0076) 		    PORTD&=0xBF;//1011 1111
    006B B382      IN	R24,P12
    006C 7B8F      ANDI	R24,0xBF
    006D BB82      OUT	P12,R24
(0077) 		}
(0078) 		PORTD|=0x80;//SZSCK=1;
    006E 9A97      SBI	P12,7
(0079) 		PORTD&=0x7F;//SZSCK=0;
    006F B382      IN	R24,P12
    0070 778F      ANDI	R24,0x7F
    0071 BB82      OUT	P12,R24
(0080) 		data=data>>1;
    0072 9526      LSR	R18
    0073 9543      INC	R20
    0074 3048      CPI	R20,0x8
    0075 F388      BCS	0x0067
(0081) 	}
(0082) 	PORTD&=0xDF;//设置RESET为低
    0076 B382      IN	R24,P12
    0077 7D8F      ANDI	R24,0xDF
    0078 BB82      OUT	P12,R24
(0083) }
    0079 940E010A  CALL	pop_gset1
    007B 9508      RET
_ReadDateTime:
  code                 --> R20
  i                    --> R22
  cmd                  --> R16
    007C 940E011E  CALL	push_gset2
(0084) 
(0085) 
(0086) //读出时钟控制信息
(0087) //SZRST--PD5
(0088) //SZSDA--PD6
(0089) //SZSCK--PD7
(0090) unsigned char ReadDateTime(unsigned char cmd)
(0091) {
(0092)     unsigned char i=0;
    007E 2766      CLR	R22
(0093) 	unsigned char code;//返回的数据值
(0094) 	PORTD&=0x1F;//设置PD5~PD7为低 0001 1111
    007F B382      IN	R24,P12
    0080 718F      ANDI	R24,0x1F
    0081 BB82      OUT	P12,R24
(0095) 	DDRD|=0xE0;//设置PD5~PD7为输出 1110 0000
    0082 B381      IN	R24,P11
    0083 6E80      ORI	R24,0xE0
    0084 BB81      OUT	P11,R24
(0096) 	PORTD|=0x20;//RESET为高 0010 0000
    0085 9A95      SBI	P12,5
(0097)     for(i=0;i<8;i++)
    0086 C00D      RJMP	0x0094
(0098) 	{
(0099) 	    if(cmd&0x01)
    0087 FF00      SBRS	R16,0
    0088 C002      RJMP	0x008B
(0100) 		{
(0101) 		    PORTD|=0x40;  //0100 0000
    0089 9A96      SBI	P12,6
(0102) 		}
    008A C003      RJMP	0x008E
(0103) 		else
(0104) 		{
(0105) 		    PORTD&=0xBF;  //1011 1111
    008B B382      IN	R24,P12
    008C 7B8F      ANDI	R24,0xBF
    008D BB82      OUT	P12,R24
(0106) 		} 
(0107) 		PORTD|=0x80;    //1000 0000 SZSCK=1
    008E 9A97      SBI	P12,7
(0108) 		PORTD&=0x7F;//SZSCK=0;
    008F B382      IN	R24,P12
    0090 778F      ANDI	R24,0x7F
    0091 BB82      OUT	P12,R24
(0109) 		cmd=cmd>>1;
    0092 9506      LSR	R16
    0093 9563      INC	R22
    0094 3068      CPI	R22,0x8
    0095 F388      BCS	0x0087
(0110) 	}
(0111) 	DDRD&=0xBF;//设置PD6(SZSDA)为输入模式
    0096 B381      IN	R24,P11
    0097 7B8F      ANDI	R24,0xBF
    0098 BB81      OUT	P11,R24
(0112) 	for(i=0;i<8;i++)
    0099 2766      CLR	R22
    009A C00C      RJMP	0x00A7
(0113) 	{
(0114) 	    code=code>>1;
    009B 9546      LSR	R20
(0115) 	    PORTD&=0x7F;//0111 1111 设置PD7(SZSCK)为低
    009C B382      IN	R24,P12
    009D 778F      ANDI	R24,0x7F
    009E BB82      OUT	P12,R24
(0116) 		if(PIND&0x40)
    009F 9B86      SBIS	P10,6
    00A0 C001      RJMP	0x00A2
(0117) 		{
(0118) 		    code|=0x80;
    00A1 6840      ORI	R20,0x80
(0119) 		}
(0120) 		PORTD|=0x80;//SZSCK=1;
    00A2 9A97      SBI	P12,7
(0121) 		PORTD&=0x7F;//SZSCK=0;
    00A3 B382      IN	R24,P12
    00A4 778F      ANDI	R24,0x7F
    00A5 BB82      OUT	P12,R24
    00A6 9563      INC	R22
    00A7 3068      CPI	R22,0x8
    00A8 F390      BCS	0x009B
(0122) 	}
(0123) 	PORTD&=0xDF;//设置RESET为低 1101 1111
    00A9 B382      IN	R24,P12
    00AA 7D8F      ANDI	R24,0xDF
    00AB BB82      OUT	P12,R24
(0124) 	return code;
    00AC 2F04      MOV	R16,R20
    00AD 940E0101  CALL	pop_gset2
    00AF 9508      RET
_ASCIItoBCD:
  tmp                  --> R22
  data                 --> R20
    00B0 940E011E  CALL	push_gset2
    00B2 2F40      MOV	R20,R16
(0125) }
(0126) 
(0127) //ASCII码转换为BCD码
(0128) //输入参数data为输入的数字
(0129) //返回值为BCD码表示的数字
(0130) unsigned char ASCIItoBCD(unsigned char data)
(0131) {
(0132)     unsigned char tmp;
(0133)     if(data>10)
    00B3 E08A      LDI	R24,0xA
    00B4 1784      CP	R24,R20
    00B5 F470      BCC	0x00C4
(0134)     {
(0135)         tmp=data/10;
    00B6 E01A      LDI	R17,0xA
    00B7 2F04      MOV	R16,R20
    00B8 940E00EF  CALL	div8u
    00BA 2F60      MOV	R22,R16
(0136)         data=data%10;
    00BB E01A      LDI	R17,0xA
    00BC 2F04      MOV	R16,R20
    00BD 940E00ED  CALL	mod8u
    00BF 2F40      MOV	R20,R16
(0137)         data=(tmp<<4)|data;
    00C0 2F86      MOV	R24,R22
    00C1 708F      ANDI	R24,0xF
    00C2 9582      SWAP	R24
    00C3 2B48      OR	R20,R24
(0138)     }
(0139)     return data;
    00C4 2F04      MOV	R16,R20
    00C5 940E0101  CALL	pop_gset2
    00C7 9508      RET
_BCDtoASCII:
  tmp                  --> R22
  mask                 --> R10
  data                 --> R20
    00C8 940E0122  CALL	push_gset3
    00CA 2EA2      MOV	R10,R18
    00CB 2F40      MOV	R20,R16
(0140) }
(0141) 
(0142) //BCD码转换为ASCII码
(0143) //输入参数data为BCD码
(0144) //输入参数num为转换从最右边开始到第mask位结束
(0145) //返回值为ASCII表示的数字
(0146) unsigned char BCDtoASCII(unsigned char data,unsigned char mask)
(0147) {
(0148)     unsigned char tmp=0xff;
    00CC EF6F      LDI	R22,0xFF
(0149)     tmp=tmp>>(8-mask);
    00CD E018      LDI	R17,0x8
    00CE 191A      SUB	R17,R10
    00CF 2F06      MOV	R16,R22
    00D0 940E0126  CALL	lsr8
    00D2 2F60      MOV	R22,R16
(0150)     data=data&tmp;
    00D3 2340      AND	R20,R16
(0151)     if(data>0x0f)
    00D4 E08F      LDI	R24,0xF
    00D5 1784      CP	R24,R20
    00D6 F450      BCC	0x00E1
(0152)     {
(0153)         tmp=data&0x0f;
    00D7 2F64      MOV	R22,R20
    00D8 706F      ANDI	R22,0xF
(0154)         data=data>>4;
    00D9 2F84      MOV	R24,R20
    00DA 9582      SWAP	R24
    00DB 708F      ANDI	R24,0xF
    00DC 2F48      MOV	R20,R24
(0155)         data=data*10+tmp;
    00DD E08A      LDI	R24,0xA
    00DE 9F84      MUL	R24,R20
    00DF 2D40      MOV	R20,R0
    00E0 0F46      ADD	R20,R22
(0156)     }
(0157)     return data;
    00E1 2F04      MOV	R16,R20
    00E2 940E0104  CALL	pop_gset3
    00E4 9508      RET
(0158) }
(0159) 
(0160) 
(0161) void main()
(0162) {
(0163)     unsigned char data;
(0164)     SetDateTime(TRIC_CHARGE_W,0xA5);
_main:
  data                 --> R20
    00E5 EA25      LDI	R18,0xA5
    00E6 E900      LDI	R16,0x90
    00E7 DF63      RCALL	_SetDateTime
(0165)     data=ReadDateTime(TRIC_CHARGE_R);
    00E8 E901      LDI	R16,0x91
    00E9 DF92      RCALL	_ReadDateTime
    00EA 2F40      MOV	R20,R16
(0166)     while(1)
    00EB CFFF      RJMP	0x00EB
(0167)         ;
(0168) }
FILE: <library>
    00EC 9508      RET
mod8u:
    00ED 9468      BSET	6
    00EE C001      RJMP	xdiv8u
div8u:
    00EF 94E8      BCLR	6
xdiv8u:
    00F0 932A      ST	R18,-Y
    00F1 92FA      ST	R15,-Y
    00F2 24FF      CLR	R15
    00F3 E028      LDI	R18,0x8
    00F4 0F00      LSL	R16
    00F5 1CFF      ROL	R15
    00F6 16F1      CP	R15,R17
    00F7 F010      BCS	0x00FA
    00F8 1AF1      SUB	R15,R17
    00F9 9503      INC	R16
    00FA 952A      DEC	R18
    00FB F7C1      BNE	0x00F4
    00FC F40E      BRTC	0x00FE
    00FD 2D0F      MOV	R16,R15
    00FE 90F9      LD	R15,Y+
    00FF 9129      LD	R18,Y+
    0100 9508      RET
pop_gset2:
    0101 E0E2      LDI	R30,2
    0102 940C010B  JMP	pop
pop_gset3:
    0104 E0E4      LDI	R30,4
    0105 940C010B  JMP	pop
push_gset1:
    0107 935A      ST	R21,-Y
    0108 934A      ST	R20,-Y
    0109 9508      RET
pop_gset1:
    010A E0E1      LDI	R30,1
pop:
    010B 9149      LD	R20,Y+
    010C 9159      LD	R21,Y+
    010D FDE0      SBRC	R30,0
    010E 9508      RET
    010F 9169      LD	R22,Y+
    0110 9179      LD	R23,Y+
    0111 FDE1      SBRC	R30,1
    0112 9508      RET
    0113 90A9      LD	R10,Y+
    0114 90B9      LD	R11,Y+
    0115 FDE2      SBRC	R30,2
    0116 9508      RET
    0117 90C9      LD	R12,Y+
    0118 90D9      LD	R13,Y+
    0119 FDE3      SBRC	R30,3
    011A 9508      RET
    011B 90E9      LD	R14,Y+
    011C 90F9      LD	R15,Y+
    011D 9508      RET
push_gset2:
    011E 937A      ST	R23,-Y
    011F 936A      ST	R22,-Y
    0120 940C0107  JMP	push_gset1
push_gset3:
    0122 92BA      ST	R11,-Y
    0123 92AA      ST	R10,-Y
    0124 940C011E  JMP	push_gset2
lsr8:
    0126 2311      TST	R17
    0127 F019      BEQ	0x012B
    0128 9506      LSR	R16
    0129 951A      DEC	R17
    012A CFFB      RJMP	lsr8
    012B 9508      RET

⌨️ 快捷键说明

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