📄 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 + -