📄 ds1203.lst
字号:
__text_start:
__start:
0023 E5CF LDI R28,0x5F
0024 E0D4 LDI R29,4
0025 BFCD OUT 0x3D,R28
0026 BFDE OUT 0x3E,R29
0027 51C0 SUBI R28,0x10
0028 40D0 SBCI R29,0
0029 EA0A LDI R16,0xAA
002A 8308 STD Y+0,R16
002B 2400 CLR R0
002C E7E6 LDI R30,0x76
002D E0F0 LDI R31,0
002E E010 LDI R17,0
002F 38E4 CPI R30,0x84
0030 07F1 CPC R31,R17
0031 F011 BEQ 0x0034
0032 9201 ST R0,Z+
0033 CFFB RJMP 0x002F
0034 8300 STD Z+0,R16
0035 E3E0 LDI R30,0x30
0036 E0F0 LDI R31,0
0037 E6A0 LDI R26,0x60
0038 E0B0 LDI R27,0
0039 E010 LDI R17,0
003A 34E6 CPI R30,0x46
003B 07F1 CPC R31,R17
003C F021 BEQ 0x0041
003D 95C8 LPM
003E 9631 ADIW R30,1
003F 920D ST R0,X+
0040 CFF9 RJMP 0x003A
0041 D191 RCALL _main
_exit:
0042 CFFF RJMP _exit
FILE: E:\biyesheji\TESTBE~1\DS1302\程序\ds1302.h
(0001) //ICC-AVR 修改日期: 2006-11-06 15:38:44
(0002) //姓名:荣俊齐
(0003) // Target : M8
(0004) // Crystal: 1.0000Mhz
(0005) #define uchar unsigned char
(0006) /******************************************************************************
(0007) 定义DS1302
(0008) ********************************************************************************/
(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) 定义读写单元地址
(0020) *****************************************************************************/
(0021) //读
(0022) #define Rsec 0x81 //秒
(0023) #define Rmin 0x83 //分
(0024) #define Rhou 0x85 //时
(0025) #define Rdat 0x87 //日
(0026) #define Rmon 0x89 //月
(0027) #define Rwee 0x8b //周
(0028) #define Ryea 0x8d //年
(0029) //写
(0030) #define Wsec1 0x80 //秒
(0031) #define Wmin1 0x82 //分
(0032) #define Whou1 0x84 //时
(0033) #define Wdat1 0x86 //日
(0034) #define Wmon1 0x88 //月
(0035) #define Wwee1 0x8a //周
(0036) #define Wyea1 0x8c //年
(0037) int second,minute,hour,date,week,month,year; //读出后的时间存储单元
(0038) char WriteAddress[7]={Wyea1,Wmon1,Wdat1,Whou1,Wmin1,Wsec1,Wwee1}; //写地址
(0039) char WriteTime[7]={0x10,0x12,0x31,0x24,0x50,0x30,0x00};//写的时间
(0040) /******************************************************************************
(0041) 定义DS1302初始化程序
(0042) ********************************************************************************/
(0043) void DS1302_set(void)
(0044) { char i;
(0045) DS1302_CLK0;
_DS1302_set:
i --> R16
0043 98A9 CBI 0x15,1
(0046) DS1302_RESET0;
0044 98A8 CBI 0x15,0
(0047) for(i=0;i<8;i++)
0045 2700 CLR R16
0046 C002 RJMP 0x0049
(0048) {
(0049) NOP();
0047 0000 NOP
0048 9503 INC R16
0049 3008 CPI R16,0x8
004A F3E0 BCS 0x0047
(0050) }
(0051) DS1302_RESET1;
004B 9AA8 SBI 0x15,0
004C 9508 RET
_DS1302_Write:
i --> R20
x --> R22
004D D1C5 RCALL push_gset2
004E 2F60 MOV R22,R16
(0052) }
(0053) /******************************************************************************
(0054) 定义m8向DS1302发送程序
(0055) ********************************************************************************/
(0056) void DS1302_Write(char x)
(0057) {
(0058) int i;
(0059)
(0060) DS1302_CLK0;
004F 98A9 CBI 0x15,1
(0061) DS1302_DATA_OUTPUT; //控制数据线
0050 9AA2 SBI 0x14,2
(0062) for(i=0;i<8;i++)
0051 2744 CLR R20
0052 2755 CLR R21
(0063) { DS1302_CLK0; //输出
0053 98A9 CBI 0x15,1
(0064) if((x&(1<<i)))
0054 E001 LDI R16,1
0055 E010 LDI R17,0
0056 019A MOVW R18,R20
0057 D202 RCALL lsl16
0058 2E26 MOV R2,R22
0059 2433 CLR R3
005A 2220 AND R2,R16
005B 2231 AND R3,R17
005C 2022 TST R2
005D F411 BNE 0x0060
005E 2033 TST R3
005F F011 BEQ 0x0062
(0065) DS1302_WRITE_DATA1 ;
0060 9AAA SBI 0x15,2
0061 C001 RJMP 0x0063
(0066) else
(0067) DS1302_WRITE_DATA0 ;
0062 98AA CBI 0x15,2
(0068) NOP();
0063 0000 NOP
(0069) DS1302_CLK1;
0064 9AA9 SBI 0x15,1
(0070) NOP();
0065 0000 NOP
0066 5F4F SUBI R20,0xFF
0067 4F5F SBCI R21,0xFF
0068 3048 CPI R20,0x8
0069 E0E0 LDI R30,0
006A 075E CPC R21,R30
006B F33C BLT 0x0053
(0071) }
(0072) DS1302_CLK0;
006C 98A9 CBI 0x15,1
006D D199 RCALL pop_gset2
006E 9508 RET
_DS1302_WriteT:
time --> R20
ddr --> R22
006F D1A3 RCALL push_gset2
0070 2F42 MOV R20,R18
0071 2F60 MOV R22,R16
(0073) }
(0074) //单独矫正某个时间单元
(0075) void DS1302_WriteT(char ddr,char time)
(0076) {
(0077) DS1302_set();
0072 DFD0 RCALL _DS1302_set
(0078) DS1302_Write(ddr);
0073 2F06 MOV R16,R22
0074 DFD8 RCALL _DS1302_Write
(0079) DS1302_Write(time);
0075 2F04 MOV R16,R20
0076 DFD6 RCALL _DS1302_Write
0077 D18F RCALL pop_gset2
0078 9508 RET
_DS1302_Read:
temp --> R20
temp2 --> R22
temp1 --> R10
k --> R12
n --> R14
xx --> R12
0079 D193 RCALL push_gset5
007A 2EC0 MOV R12,R16
(0080) }
(0081) /******************************************************************************
(0082) 定义m8由DS1302接收程序
(0083) ********************************************************************************/
(0084) uchar DS1302_Read(char xx)
(0085) {
(0086) uchar temp=0,k,n;
007B 2744 CLR R20
(0087) uchar temp1=0;
007C 24AA CLR R10
(0088) uchar temp2=0;
007D 2766 CLR R22
(0089) DS1302_set();
007E DFC4 RCALL _DS1302_set
(0090) DS1302_Write(xx);
007F 2D0C MOV R16,R12
0080 DFCC RCALL _DS1302_Write
(0091) DS1302_DATA_INPUT; //释放数据线
0081 98A2 CBI 0x14,2
(0092) DS1302_CLK0; //时钟线拉低
0082 98A9 CBI 0x15,1
(0093) for(n=0;n<4;n++)
0083 24EE CLR R14
0084 C015 RJMP 0x009A
(0094) { DS1302_CLK0; //时钟线拉低
0085 98A9 CBI 0x15,1
(0095) NOP();
0086 0000 NOP
(0096) k=DS1302_READ_DATA; //读数据,从低位开始
0087 B383 IN R24,0x13
0088 7084 ANDI R24,4
0089 2EC8 MOV R12,R24
(0097) if(k==0x04)
008A 3084 CPI R24,4
008B F429 BNE 0x0091
(0098) temp1|=(1<<n);
008C E001 LDI R16,1
008D 2D1E MOV R17,R14
008E D1D2 RCALL lsl8
008F 2AA0 OR R10,R16
0090 C006 RJMP 0x0097
(0099) else
(0100) temp1&=~(1<<n);
0091 E001 LDI R16,1
0092 2D1E MOV R17,R14
0093 D1CD RCALL lsl8
0094 2E20 MOV R2,R16
0095 9420 COM R2
0096 20A2 AND R10,R2
(0101) DS1302_CLK1; //时钟线拉高
0097 9AA9 SBI 0x15,1
(0102) NOP();
0098 0000 NOP
0099 94E3 INC R14
009A 2D8E MOV R24,R14
009B 3084 CPI R24,4
009C F340 BCS 0x0085
(0103) }
(0104) for(n=0;n<3;n++)
009D 24EE CLR R14
009E C015 RJMP 0x00B4
(0105) { DS1302_CLK0; //时钟线拉低
009F 98A9 CBI 0x15,1
(0106) NOP();
00A0 0000 NOP
(0107) k=DS1302_READ_DATA; //读数据,从低位开始
00A1 B383 IN R24,0x13
00A2 7084 ANDI R24,4
00A3 2EC8 MOV R12,R24
(0108) if(k==0x04)
00A4 3084 CPI R24,4
00A5 F429 BNE 0x00AB
(0109) temp2|=(1<<n);
00A6 E001 LDI R16,1
00A7 2D1E MOV R17,R14
00A8 D1B8 RCALL lsl8
00A9 2B60 OR R22,R16
00AA C006 RJMP 0x00B1
(0110) else
(0111) temp2&=~(1<<n);
00AB E001 LDI R16,1
00AC 2D1E MOV R17,R14
00AD D1B3 RCALL lsl8
00AE 2E20 MOV R2,R16
00AF 9420 COM R2
00B0 2162 AND R22,R2
(0112) DS1302_CLK1; //时钟线拉高
00B1 9AA9 SBI 0x15,1
(0113) NOP(); //60~120us
00B2 0000 NOP
00B3 94E3 INC R14
00B4 2D8E MOV R24,R14
00B5 3083 CPI R24,3
00B6 F340 BCS 0x009F
(0114) }
(0115) temp=10*temp1+temp2;
00B7 E08A LDI R24,0xA
00B8 9D8A MUL R24,R10
00B9 2D40 MOV R20,R0
00BA 0F46 ADD R20,R22
(0116) DS1302_CLK0; //时钟线拉低
00BB 98A9 CBI 0x15,1
(0117) return (temp);
00BC 2F04 MOV R16,R20
00BD D14D RCALL pop_gset5
00BE 9508 RET
(0118) }
(0119) /******************************************************************************
(0120) 定义DS1302读出时间程序
(0121) ********************************************************************************/
(0122) void DS1302_ReadTime(void)
(0123) {
(0124) second=DS1302_Read(Rsec);
_DS1302_ReadTime:
00BF E801 LDI R16,0x81
00C0 DFB8 RCALL _DS1302_Read
00C1 2E20 MOV R2,R16
00C2 2433 CLR R3
00C3 92300083 STS second+1,R3
00C5 92200082 STS second,R2
(0125) minute=DS1302_Read(Rmin);
00C7 E803 LDI R16,0x83
00C8 DFB0 RCALL _DS1302_Read
00C9 2E20 MOV R2,R16
00CA 2433 CLR R3
00CB 92300081 STS minute+1,R3
00CD 92200080 STS minute,R2
(0126) hour=DS1302_Read(Rhou);
00CF E805 LDI R16,0x85
00D0 DFA8 RCALL _DS1302_Read
00D1 2E20 MOV R2,R16
00D2 2433 CLR R3
00D3 9230007F STS hour+1,R3
00D5 9220007E STS hour,R2
(0127) date=DS1302_Read(Rdat);
00D7 E807 LDI R16,0x87
00D8 DFA0 RCALL _DS1302_Read
00D9 2E20 MOV R2,R16
00DA 2433 CLR R3
00DB 9230007D STS date+1,R3
00DD 9220007C STS date,R2
(0128) month=DS1302_Read(Rmon);
00DF E809 LDI R16,0x89
00E0 DF98 RCALL _DS1302_Read
00E1 2E20 MOV R2,R16
00E2 2433 CLR R3
00E3 92300079 STS month+1,R3
00E5 92200078 STS month,R2
(0129) year=DS1302_Read(Ryea);
00E7 E80D LDI R16,0x8D
00E8 DF90 RCALL _DS1302_Read
00E9 2E20 MOV R2,R16
00EA 2433 CLR R3
00EB 92300077 STS year+1,R3
00ED 92200076 STS year,R2
00EF 9508 RET
_DS1302_WriteTime:
time --> R20
ddr --> R22
00F0 D122 RCALL push_gset2
(0130)
(0131) }
(0132) /******************************************************************************
(0133) 定义DS1302矫正时间程序
(0134) ********************************************************************************/
(0135) void DS1302_WriteTime(void)
(0136) {char *ddr,*time;
(0137) ddr=WriteAddress;
00F1 E660 LDI R22,0x60
00F2 E070 LDI R23,0
(0138) time=WriteTime;
00F3 E647 LDI R20,0x67
00F4 E050 LDI R21,0
00F5 C009 RJMP 0x00FF
(0139) while(*ddr)
(0140) {
(0141) DS1302_WriteT(*ddr,*time);
00F6 01FA MOVW R30,R20
00F7 8120 LDD R18,Z+0
00F8 01FB MOVW R30,R22
00F9 8100 LDD R16,Z+0
00FA DF74 RCALL _DS1302_WriteT
(0142) ddr++;
00FB 5F6F SUBI R22,0xFF
00FC 4F7F SBCI R23,0xFF
(0143) time++;
00FD 5F4F SUBI R20,0xFF
00FE 4F5F SBCI R21,0xFF
00FF 01FB MOVW R30,R22
0100 8020 LDD R2,Z+0
0101 2022 TST R2
0102 F799 BNE 0x00F6
0103 D103 RCALL pop_gset2
0104 9508 RET
FILE: E:\biyesheji\TESTBE~1\DS1302\程序\DELAY.C
(0001)
(0002) #define XTAL 1 //晶振频率,单位MHz 定义为全局变量
(0003)
(0004) void delay_1us(void) //1us延时函数
(0005) {
(0006) asm("nop");
_delay_1us:
0105 0000 NOP
0106 9508 RET
_delay_nus:
i --> R20
n --> R22
0107 D10B RCALL push_gset2
0108 01B8 MOVW R22,R16
(0007) }
(0008)
(0009) void delay_nus(unsigned int n) //N us延时函数
(0010) {
(0011) unsigned int i=0;
0109 2744 CLR R20
010A 2755 CLR R21
(0012) for (i=0;i<n;i++)
010B C003 RJMP 0x010F
(0013) delay_1us();
010C DFF8 RCALL _delay_1us
010D 5F4F SUBI R20,0xFF
010E 4F5F SBCI R21,0xFF
010F 1746 CP R20,R22
0110 0757 CPC R21,R23
0111 F3D0 BCS 0x010C
0112 D0F4 RCALL pop_gset2
0113 9508 RET
(0014) }
(0015)
(0016) void delay_1ms(void) //1ms延时函数
(0017) {
(0018) unsigned int i;
(0019) for (i=0;i<(unsigned int)(XTAL*143-2);i++);
_delay_1ms:
i --> R16
0114 2700 CLR R16
0115 2711 CLR R17
0116 C002 RJMP 0x0119
0117 5F0F SUBI R16,0xFF
0118 4F1F SBCI R17,0xFF
0119 380D CPI R16,0x8D
011A E0E0 LDI R30,0
011B 071E CPC R17,R30
011C F3D0 BCS 0x0117
011D 9508 RET
_delay_nms:
i --> R20
n --> R22
011E D0F4 RCALL push_gset2
011F 01B8 MOVW R22,R16
(0020) }
(0021)
(0022) void delay_nms(unsigned int n) //N ms延时函数
(0023) {
(0024) unsigned int i=0;
0120 2744 CLR R20
0121 2755 CLR R21
(0025) for (i=0;i<n;i++)
0122 C003 RJMP 0x0126
(0026) {
(0027) delay_1ms();
0123 DFF0 RCALL _delay_1ms
0124 5F4F SUBI R20,0xFF
0125 4F5F SBCI R21,0xFF
0126 1746 CP R20,R22
0127 0757 CPC R21,R23
0128 F3D0 BCS 0x0123
0129 D0DD RCALL pop_gset2
012A 9508 RET
FILE: E:\biyesheji\TESTBE~1\DS1302\程序\DS1302.c
(0001) //ICC-AVR 修改日期: 2006-10-29 15:38:44
(0002) //姓名:荣俊齐
(0003) // Target : M8
(0004) // Crystal: 1.0000Mhz
(0005)
(0006) #include <iom8v.h>
(0007) #include <macros.h>
(0008) #include "ds1302.h"
(0009) #include "DELAY.C"
(0010) const char SEG_table[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
(0011) char Sec_buffer[4]={0,0,0,0};
(0012) char Min_buffer[4]={0,0,0,0};
(0013)
(0014) /******************************************************************************
(0015) 定义164的时钟和数据线
(0016) ********************************************************************************/
(0017) #define DATA_1 PORTD|=(1<<0)
(0018) #define DATA_0 PORTD&=~(1<<0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -