📄 ds1302.lst
字号:
__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 + -