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