📄 1302-162.lst
字号:
__text_start:
__start:
002D E5CF LDI R28,0x5F
002E E0D2 LDI R29,2
002F BFCD OUT 0x3D,R28
0030 BFDE OUT 0x3E,R29
0031 51C0 SUBI R28,0x10
0032 40D0 SBCI R29,0
0033 EA0A LDI R16,0xAA
0034 8308 STD Y+0,R16
0035 2400 CLR R0
0036 EAE0 LDI R30,0xA0
0037 E0F0 LDI R31,0
0038 E010 LDI R17,0
0039 3AE3 CPI R30,0xA3
003A 07F1 CPC R31,R17
003B F011 BEQ 0x003E
003C 9201 ST R0,Z+
003D CFFB RJMP 0x0039
003E 8300 STD Z+0,R16
003F E1EA LDI R30,0x1A
0040 E0F0 LDI R31,0
0041 E6A0 LDI R26,0x60
0042 E0B0 LDI R27,0
0043 E010 LDI R17,0
0044 35EA CPI R30,0x5A
0045 07F1 CPC R31,R17
0046 F021 BEQ 0x004B
0047 95C8 LPM
0048 9631 ADIW R30,1
0049 920D ST R0,X+
004A CFF9 RJMP 0x0044
004B D2A2 RCALL _main
_exit:
004C CFFF RJMP _exit
_delay:
a --> R20
n --> R16
004D D513 RCALL push_gset1
FILE: D:\时钟芯片\1302\1302-162\ds1302.c
(0001)
(0002) #include <io8515v.h>
(0003) #include <macros.h>
(0004) #include <162-1302.h>
(0005) /************************************************
(0006) 延时程序
(0007) ************************************************/
(0008) void delay(uchar n)
(0009) {
(0010) uchar a;
(0011) for(a=0;a<n;a++)
004E 2744 CLR R20
004F C001 RJMP 0x0051
0050 9543 INC R20
0051 1740 CP R20,R16
0052 F3E8 BCS 0x0050
0053 D510 RCALL pop_gset1
0054 9508 RET
_write_data:
temp --> R20
i --> R22
data --> R10
addr --> R22
0055 D507 RCALL push_gset3
0056 2EA2 MOV R10,R18
0057 2F60 MOV R22,R16
(0012) ;
(0013) }
(0014) /****************************************************
(0015) 写一个字节
(0016) ****************************************************/
(0017) void write_data(uchar addr,uchar data)
(0018) {
(0019) unsigned char i,temp;
(0020) T_DDR|=T_IO;
0058 9AA6 SBI 0x14,6
(0021) T_PORT&=~T_RST;
0059 98AF CBI 0x15,7
(0022) T_PORT&=~T_CLK;
005A 98AD CBI 0x15,5
(0023) asm("nop");
005B 0000 NOP
(0024) asm("nop");
005C 0000 NOP
(0025) asm("nop");
005D 0000 NOP
(0026) asm("nop");
005E 0000 NOP
(0027) T_PORT|=T_RST; //时钟信号低时拉高RST初始化
005F 9AAF SBI 0x15,7
(0028) temp=addr;
0060 2F46 MOV R20,R22
(0029) for(i=0;i<8;i++)
0061 2766 CLR R22
0062 C00F RJMP 0x0072
(0030) {
(0031) if(temp&(1<<i))
0063 E001 LDI R16,1
0064 2F16 MOV R17,R22
0065 D547 RCALL lsl8
0066 2E24 MOV R2,R20
0067 2220 AND R2,R16
0068 F011 BEQ 0x006B
(0032) T_PORT |=T_IO ;
0069 9AAE SBI 0x15,6
006A C001 RJMP 0x006C
(0033) else
(0034) T_PORT &=~T_IO ;
006B 98AE CBI 0x15,6
(0035) asm("nop");
006C 0000 NOP
(0036) asm("nop");
006D 0000 NOP
(0037) T_PORT |=T_CLK; //时钟上升沿写入数据
006E 9AAD SBI 0x15,5
(0038) asm("nop");
006F 0000 NOP
(0039) T_PORT &=~T_CLK; //时钟拉低电平
0070 98AD CBI 0x15,5
0071 9563 INC R22
0072 3068 CPI R22,0x8
0073 F378 BCS 0x0063
(0040) }
(0041) temp=data;
0074 2D4A MOV R20,R10
(0042) for(i=0;i<8;i++)
0075 2766 CLR R22
0076 C00F RJMP 0x0086
(0043) {
(0044) if(temp&(1<<i))
0077 E001 LDI R16,1
0078 2F16 MOV R17,R22
0079 D533 RCALL lsl8
007A 2E24 MOV R2,R20
007B 2220 AND R2,R16
007C F011 BEQ 0x007F
(0045) T_PORT |=T_IO ;
007D 9AAE SBI 0x15,6
007E C001 RJMP 0x0080
(0046) else
(0047) T_PORT &=~T_IO ;
007F 98AE CBI 0x15,6
(0048) asm("nop");
0080 0000 NOP
(0049) asm("nop");
0081 0000 NOP
(0050) T_PORT |=T_CLK; //时钟上升沿写入数据
0082 9AAD SBI 0x15,5
(0051) asm("nop");
0083 0000 NOP
(0052) T_PORT &=~T_CLK; //时钟拉低电平
0084 98AD CBI 0x15,5
0085 9563 INC R22
0086 3068 CPI R22,0x8
0087 F378 BCS 0x0077
(0053) }
(0054) T_PORT&=~T_RST; //禁止DS1302
0088 98AF CBI 0x15,7
0089 D4CB RCALL pop_gset3
008A 9508 RET
_read_data:
k --> R20
temp --> R22
i --> R10
addr --> R20
008B D4D1 RCALL push_gset3
008C 2F40 MOV R20,R16
(0055) }
(0056)
(0057) /***************************************************
(0058) 读一个字节
(0059) ***************************************************/
(0060) uchar read_data(uchar addr)
(0061) {
(0062) uchar i,temp,k;
(0063) temp=0;
008D 2766 CLR R22
(0064) T_DDR|=T_IO;
008E 9AA6 SBI 0x14,6
(0065) T_PORT&=~T_RST;
008F 98AF CBI 0x15,7
(0066) T_PORT&=~T_CLK;
0090 98AD CBI 0x15,5
(0067) asm("nop");
0091 0000 NOP
(0068) asm("nop");
0092 0000 NOP
(0069) asm("nop");
0093 0000 NOP
(0070) asm("nop");
0094 0000 NOP
(0071) T_PORT|=T_RST; //时钟信号低时拉高RST初始化
0095 9AAF SBI 0x15,7
(0072) temp=addr;
0096 2F64 MOV R22,R20
(0073) for(i=0;i<8;i++)
0097 24AA CLR R10
0098 C00E RJMP 0x00A7
(0074) {
(0075) if(temp&(1<<i))
0099 E001 LDI R16,1
009A 2D1A MOV R17,R10
009B D511 RCALL lsl8
009C 2E26 MOV R2,R22
009D 2220 AND R2,R16
009E F011 BEQ 0x00A1
(0076) T_PORT |=T_IO ;
009F 9AAE SBI 0x15,6
00A0 C001 RJMP 0x00A2
(0077) else
(0078) T_PORT &=~T_IO ;
00A1 98AE CBI 0x15,6
(0079) asm("nop");
00A2 0000 NOP
(0080) asm("nop");
00A3 0000 NOP
(0081) T_PORT |=T_CLK; //时钟上升沿写入数据
00A4 9AAD SBI 0x15,5
(0082) T_PORT &=~T_CLK; //时钟拉低电平
00A5 98AD CBI 0x15,5
00A6 94A3 INC R10
00A7 2D8A MOV R24,R10
00A8 3088 CPI R24,0x8
00A9 F378 BCS 0x0099
(0083) }
(0084) T_DDR&=~T_IO;
00AA 98A6 CBI 0x14,6
(0085) for(i=0;i<8;i++)
00AB 24AA CLR R10
00AC C014 RJMP 0x00C1
(0086) {
(0087) k=(T_PIN&T_IO);
00AD B343 IN R20,0x13
00AE 7440 ANDI R20,0x40
(0088) if(k==T_IO)
00AF 3440 CPI R20,0x40
00B0 F429 BNE 0x00B6
(0089) temp|=(1<<i);
00B1 E001 LDI R16,1
00B2 2D1A MOV R17,R10
00B3 D4F9 RCALL lsl8
00B4 2B60 OR R22,R16
00B5 C006 RJMP 0x00BC
(0090) else
(0091) temp&=~(1<<i);
00B6 E001 LDI R16,1
00B7 2D1A MOV R17,R10
00B8 D4F4 RCALL lsl8
00B9 2E20 MOV R2,R16
00BA 9420 COM R2
00BB 2162 AND R22,R2
(0092) asm("nop");
00BC 0000 NOP
(0093) asm("nop");
00BD 0000 NOP
(0094) T_PORT|=T_CLK; //上升沿读出数据
00BE 9AAD SBI 0x15,5
(0095) T_PORT &=~T_CLK; //时钟电平拉低
00BF 98AD CBI 0x15,5
00C0 94A3 INC R10
00C1 2D8A MOV R24,R10
00C2 3088 CPI R24,0x8
00C3 F348 BCS 0x00AD
(0096) }
(0097) T_DDR|=T_IO;
00C4 9AA6 SBI 0x14,6
(0098) T_PORT&=~T_CLK;
00C5 98AD CBI 0x15,5
(0099) T_PORT&=~T_RST; //禁止DS1302
00C6 98AF CBI 0x15,7
(0100) return(temp);
00C7 2F06 MOV R16,R22
00C8 D48C RCALL pop_gset3
00C9 9508 RET
(0101) }
(0102) //1302初始化
(0103) void init_1302()
(0104) {
(0105) write_data(0x8e,0x00); //关闭寄存器写保护
_init_1302:
00CA 2722 CLR R18
00CB E80E LDI R16,0x8E
00CC DF88 RCALL _write_data
(0106) write_data(0x90,0x00); //写充电寄存器
00CD 2722 CLR R18
00CE E900 LDI R16,0x90
00CF DF85 RCALL _write_data
(0107) write_data(0x80,0x00); //秒寄存器停止位置0,时钟启动,初值设为0
00D0 2722 CLR R18
00D1 E800 LDI R16,0x80
00D2 DF82 RCALL _write_data
00D3 9508 RET
_init_time:
d --> Y,+10
month --> Y,+8
day --> Y,+6
hour --> Y,+4
min --> R20
sec --> R22
00D4 D48A RCALL push_gset2
00D5 2F42 MOV R20,R18
00D6 2F60 MOV R22,R16
(0108) }
(0109)
(0110) void init_time(uchar sec,uchar min,uchar hour,uchar day,uchar month,uchar d)
(0111) {
(0112) write_data(0x80,sec);
00D7 2F26 MOV R18,R22
00D8 E800 LDI R16,0x80
00D9 DF7B RCALL _write_data
(0113) write_data(0x82,min);
00DA 2F24 MOV R18,R20
00DB E802 LDI R16,0x82
00DC DF78 RCALL _write_data
(0114) write_data(0x84,hour);
00DD 812C LDD R18,Y+4
00DE E804 LDI R16,0x84
00DF DF75 RCALL _write_data
(0115) write_data(0x86,day);
00E0 812E LDD R18,Y+6
00E1 E806 LDI R16,0x86
00E2 DF72 RCALL _write_data
(0116) write_data(0x88,month);
00E3 8528 LDD R18,Y+8
00E4 E808 LDI R16,0x88
00E5 DF6F RCALL _write_data
(0117) write_data(0x8a,d);
00E6 852A LDD R18,Y+10
00E7 E80A LDI R16,0x8A
00E8 DF6C RCALL _write_data
00E9 D469 RCALL pop_gset2
00EA 9508 RET
FILE: D:\时钟芯片\1302\1302-162\main.c
(0001) //ICC-AVR application builder : 2005-11-2 16:28:30
(0002) // Target : 8515
(0003) // Crystal: 4.0000Mhz
(0004) #include <io8515v.h>
(0005) #include <macros.h>
(0006) #include <162-1302.h>
(0007) #include <function.h>
(0008) uchar temh_d;
(0009) uchar teml_d;
(0010) uchar temm_d;
(0011) uchar flag=0;
(0012) uchar n=0;
(0013) void port_init(void)
(0014) {
(0015) PORTA = 0x00;
_port_init:
00EB 2422 CLR R2
00EC BA2B OUT 0x1B,R2
(0016) DDRA = 0xFF;
00ED EF8F LDI R24,0xFF
00EE BB8A OUT 0x1A,R24
(0017) PORTB = 0xFF;
00EF BB88 OUT 0x18,R24
(0018) DDRB = 0xFF;
00F0 BB87 OUT 0x17,R24
(0019) PORTC = 0xFF;
00F1 BB85 OUT 0x15,R24
(0020) DDRC = 0xFF;
00F2 BB84 OUT 0x14,R24
(0021) PORTD = 0x00;
00F3 BA22 OUT 0x12,R2
(0022) DDRD = 0x00;
00F4 BA21 OUT 0x11,R2
00F5 9508 RET
(0023) } //call this routine to initialize all peripherals
(0024) void init_devices(void)
(0025) {
(0026) //stop errant interrupts until set up
(0027) CLI(); //disable all interrupts
_init_devices:
00F6 94F8 BCLR 7
(0028) port_init();
00F7 DFF3 RCALL _port_init
(0029) MCUCR = 0x00;
00F8 2422 CLR R2
00F9 BE25 OUT 0x35,R2
(0030) GIMSK = 0x40;
00FA E480 LDI R24,0x40
00FB BF8B OUT 0x3B,R24
(0031) TIMSK = 0x00;
00FC BE29 OUT 0x39,R2
(0032) SEI(); //re-enable interrupts
00FD 9478 BSET 7
00FE 9508 RET
_delay_nms:
a --> R20
b --> R22
n --> R16
00FF D45F RCALL push_gset2
(0033) //all peripherals are now initialized
(0034) }
(0035) void delay_nms(uchar n)
(0036) {
(0037) unsigned char a, b;
(0038)
(0039) for (a = 1; a<n; a++)
0100 E041 LDI R20,1
0101 C006 RJMP 0x0108
(0040) for (b = 1; b<10; b++)
0102 E061 LDI R22,1
0103 C001 RJMP 0x0105
0104 9563 INC R22
0105 306A CPI R22,0xA
0106 F3E8 BCS 0x0104
0107 9543 INC R20
0108 1740 CP R20,R16
0109 F3C0 BCS 0x0102
010A D448 RCALL pop_gset2
010B 9508 RET
_delay_ns:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -