📄 1302-162.lst
字号:
__start:
__text_start:
0017 E5CF LDI R28,0x5F
0018 E0D2 LDI R29,2
0019 BFCD OUT 0x3D,R28
001A BFDE OUT 0x3E,R29
001B 51C0 SUBI R28,0x10
001C 40D0 SBCI R29,0
001D EA0A LDI R16,0xAA
001E 8308 STD Y+0,R16
001F 2400 CLR R0
0020 E7E3 LDI R30,0x73
0021 E0F0 LDI R31,0
0022 E010 LDI R17,0
0023 37E6 CPI R30,0x76
0024 07F1 CPC R31,R17
0025 F011 BEQ 0x0028
0026 9201 ST R0,Z+
0027 CFFB RJMP 0x0023
0028 8300 STD Z+0,R16
0029 E1EA LDI R30,0x1A
002A E0F0 LDI R31,0
002B E6A0 LDI R26,0x60
002C E0B0 LDI R27,0
002D E010 LDI R17,0
002E 32ED CPI R30,0x2D
002F 07F1 CPC R31,R17
0030 F021 BEQ 0x0035
0031 95C8 LPM
0032 9631 ADIW R30,1
0033 920D ST R0,X+
0034 CFF9 RJMP 0x002E
0035 D0AE RCALL _main
_exit:
0036 CFFF RJMP _exit
_delay:
a --> R20
n --> R16
0037 D292 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++)
0038 2744 CLR R20
0039 C001 RJMP 0x003B
003A 9543 INC R20
003B 1740 CP R20,R16
003C F3E8 BCS 0x003A
003D D28F RCALL pop_gset1
003E 9508 RET
_write_data:
temp --> R20
i --> R22
data --> R10
addr --> R22
003F D286 RCALL push_gset3
0040 2EA2 MOV R10,R18
0041 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;
0042 9AA6 SBI 0x14,6
(0021) T_PORT&=~T_RST;
0043 98AF CBI 0x15,7
(0022) T_PORT&=~T_CLK;
0044 98AD CBI 0x15,5
(0023) asm("nop");
0045 0000 NOP
(0024) asm("nop");
0046 0000 NOP
(0025) asm("nop");
0047 0000 NOP
(0026) asm("nop");
0048 0000 NOP
(0027) T_PORT|=T_RST; //时钟信号低时拉高RST初始化
0049 9AAF SBI 0x15,7
(0028) temp=addr;
004A 2F46 MOV R20,R22
(0029) for(i=0;i<8;i++)
004B 2766 CLR R22
004C C00F RJMP 0x005C
(0030) {
(0031) if(temp&(1<<i))
004D E001 LDI R16,1
004E 2F16 MOV R17,R22
004F D291 RCALL lsl8
0050 2E24 MOV R2,R20
0051 2220 AND R2,R16
0052 F011 BEQ 0x0055
(0032) T_PORT |=T_IO ;
0053 9AAE SBI 0x15,6
0054 C001 RJMP 0x0056
(0033) else
(0034) T_PORT &=~T_IO ;
0055 98AE CBI 0x15,6
(0035) asm("nop");
0056 0000 NOP
(0036) asm("nop");
0057 0000 NOP
(0037) T_PORT |=T_CLK; //时钟上升沿写入数据
0058 9AAD SBI 0x15,5
(0038) asm("nop");
0059 0000 NOP
(0039) T_PORT &=~T_CLK; //时钟拉低电平
005A 98AD CBI 0x15,5
005B 9563 INC R22
005C 3068 CPI R22,0x8
005D F378 BCS 0x004D
(0040) }
(0041) temp=data;
005E 2D4A MOV R20,R10
(0042) for(i=0;i<8;i++)
005F 2766 CLR R22
0060 C00F RJMP 0x0070
(0043) {
(0044) if(temp&(1<<i))
0061 E001 LDI R16,1
0062 2F16 MOV R17,R22
0063 D27D RCALL lsl8
0064 2E24 MOV R2,R20
0065 2220 AND R2,R16
0066 F011 BEQ 0x0069
(0045) T_PORT |=T_IO ;
0067 9AAE SBI 0x15,6
0068 C001 RJMP 0x006A
(0046) else
(0047) T_PORT &=~T_IO ;
0069 98AE CBI 0x15,6
(0048) asm("nop");
006A 0000 NOP
(0049) asm("nop");
006B 0000 NOP
(0050) T_PORT |=T_CLK; //时钟上升沿写入数据
006C 9AAD SBI 0x15,5
(0051) asm("nop");
006D 0000 NOP
(0052) T_PORT &=~T_CLK; //时钟拉低电平
006E 98AD CBI 0x15,5
006F 9563 INC R22
0070 3068 CPI R22,0x8
0071 F378 BCS 0x0061
(0053) }
(0054) T_PORT&=~T_RST; //禁止DS1302
0072 98AF CBI 0x15,7
0073 D24C RCALL pop_gset3
0074 9508 RET
_read_data:
k --> R20
temp --> R22
i --> R10
addr --> R20
0075 D250 RCALL push_gset3
0076 2F40 MOV R20,R16
(0055) }
(0056)
(0057) /***************************************************
(0058) 读一个字节
(0059) ***************************************************/
(0060) uchar read_data(uchar addr)
(0061) {
(0062) uchar i,temp,k;
(0063) temp=0;
0077 2766 CLR R22
(0064) T_DDR|=T_IO;
0078 9AA6 SBI 0x14,6
(0065) T_PORT&=~T_RST;
0079 98AF CBI 0x15,7
(0066) T_PORT&=~T_CLK;
007A 98AD CBI 0x15,5
(0067) asm("nop");
007B 0000 NOP
(0068) asm("nop");
007C 0000 NOP
(0069) asm("nop");
007D 0000 NOP
(0070) asm("nop");
007E 0000 NOP
(0071) T_PORT|=T_RST; //时钟信号低时拉高RST初始化
007F 9AAF SBI 0x15,7
(0072) temp=addr;
0080 2F64 MOV R22,R20
(0073) for(i=0;i<8;i++)
0081 24AA CLR R10
0082 C00E RJMP 0x0091
(0074) {
(0075) if(temp&(1<<i))
0083 E001 LDI R16,1
0084 2D1A MOV R17,R10
0085 D25B RCALL lsl8
0086 2E26 MOV R2,R22
0087 2220 AND R2,R16
0088 F011 BEQ 0x008B
(0076) T_PORT |=T_IO ;
0089 9AAE SBI 0x15,6
008A C001 RJMP 0x008C
(0077) else
(0078) T_PORT &=~T_IO ;
008B 98AE CBI 0x15,6
(0079) asm("nop");
008C 0000 NOP
(0080) asm("nop");
008D 0000 NOP
(0081) T_PORT |=T_CLK; //时钟上升沿写入数据
008E 9AAD SBI 0x15,5
(0082) T_PORT &=~T_CLK; //时钟拉低电平
008F 98AD CBI 0x15,5
0090 94A3 INC R10
0091 2D8A MOV R24,R10
0092 3088 CPI R24,0x8
0093 F378 BCS 0x0083
(0083) }
(0084) T_DDR&=~T_IO;
0094 98A6 CBI 0x14,6
(0085) for(i=0;i<8;i++)
0095 24AA CLR R10
0096 C014 RJMP 0x00AB
(0086) {
(0087) k=(T_PIN&T_IO);
0097 B343 IN R20,0x13
0098 7440 ANDI R20,0x40
(0088) if(k==T_IO)
0099 3440 CPI R20,0x40
009A F429 BNE 0x00A0
(0089) temp|=(1<<i);
009B E001 LDI R16,1
009C 2D1A MOV R17,R10
009D D243 RCALL lsl8
009E 2B60 OR R22,R16
009F C006 RJMP 0x00A6
(0090) else
(0091) temp&=~(1<<i);
00A0 E001 LDI R16,1
00A1 2D1A MOV R17,R10
00A2 D23E RCALL lsl8
00A3 2E20 MOV R2,R16
00A4 9420 COM R2
00A5 2162 AND R22,R2
(0092) asm("nop");
00A6 0000 NOP
(0093) asm("nop");
00A7 0000 NOP
(0094) T_PORT|=T_CLK; //上升沿读出数据
00A8 9AAD SBI 0x15,5
(0095) T_PORT &=~T_CLK; //时钟电平拉低
00A9 98AD CBI 0x15,5
00AA 94A3 INC R10
00AB 2D8A MOV R24,R10
00AC 3088 CPI R24,0x8
00AD F348 BCS 0x0097
(0096) }
(0097) T_DDR|=T_IO;
00AE 9AA6 SBI 0x14,6
(0098) T_PORT&=~T_CLK;
00AF 98AD CBI 0x15,5
(0099) T_PORT&=~T_RST; //禁止DS1302
00B0 98AF CBI 0x15,7
(0100) return(temp);
00B1 2F06 MOV R16,R22
00B2 D20D RCALL pop_gset3
00B3 9508 RET
(0101) }
(0102) //1302初始化
(0103) void init_1302()
(0104) {
(0105) write_data(0x8e,0x00); //关闭寄存器写保护
_init_1302:
00B4 2722 CLR R18
00B5 E80E LDI R16,0x8E
00B6 DF88 RCALL _write_data
(0106) write_data(0x90,0x00); //写充电寄存器
00B7 2722 CLR R18
00B8 E900 LDI R16,0x90
00B9 DF85 RCALL _write_data
(0107) write_data(0x80,0x00); //秒寄存器停止位置0,时钟启动,初值设为0
00BA 2722 CLR R18
00BB E800 LDI R16,0x80
00BC DF82 RCALL _write_data
00BD 9508 RET
(0108) }
(0109)
(0110) void init_time()
(0111) {
(0112) write_data(0x80,0x50);
_init_time:
00BE E520 LDI R18,0x50
00BF E800 LDI R16,0x80
00C0 DF7E RCALL _write_data
(0113) write_data(0x82,0x59);
00C1 E529 LDI R18,0x59
00C2 E802 LDI R16,0x82
00C3 DF7B RCALL _write_data
(0114) write_data(0x84,0x13);
00C4 E123 LDI R18,0x13
00C5 E804 LDI R16,0x84
00C6 DF78 RCALL _write_data
(0115) write_data(0x86,0x05);
00C7 E025 LDI R18,5
00C8 E806 LDI R16,0x86
00C9 DF75 RCALL _write_data
(0116) write_data(0x88,0x12);
00CA E122 LDI R18,0x12
00CB E808 LDI R16,0x88
00CC DF72 RCALL _write_data
(0117) write_data(0x8a,0x01);
00CD E021 LDI R18,1
00CE E80A LDI R16,0x8A
00CF DF6F RCALL _write_data
00D0 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) void port_init(void)
(0012) {
(0013) PORTA = 0x00;
_port_init:
00D1 2422 CLR R2
00D2 BA2B OUT 0x1B,R2
(0014) DDRA = 0xFF;
00D3 EF8F LDI R24,0xFF
00D4 BB8A OUT 0x1A,R24
(0015) PORTB = 0xFF;
00D5 BB88 OUT 0x18,R24
(0016) DDRB = 0xFF;
00D6 BB87 OUT 0x17,R24
(0017) PORTC = 0xFF;
00D7 BB85 OUT 0x15,R24
(0018) DDRC = 0xFF;
00D8 BB84 OUT 0x14,R24
(0019) PORTD = 0x00;
00D9 BA22 OUT 0x12,R2
(0020) DDRD = 0x00;
00DA BA21 OUT 0x11,R2
00DB 9508 RET
(0021) } //call this routine to initialize all peripherals
(0022) void init_devices(void)
(0023) {
(0024) //stop errant interrupts until set up
(0025) CLI(); //disable all interrupts
_init_devices:
00DC 94F8 BCLR 7
(0026) port_init();
00DD DFF3 RCALL _port_init
(0027) MCUCR = 0x00;
00DE 2422 CLR R2
00DF BE25 OUT 0x35,R2
(0028) GIMSK = 0x00;
00E0 BE2B OUT 0x3B,R2
(0029) TIMSK = 0x00;
00E1 BE29 OUT 0x39,R2
(0030) SEI(); //re-enable interrupts
00E2 9478 BSET 7
00E3 9508 RET
_main:
temm --> R20
count --> R22
a --> R10
temh --> R12
teml --> R14
th --> R12
tl --> R20
s --> R22
i --> Y,+2
00E4 9723 SBIW R28,3
(0031) //all peripherals are now initialized
(0032) }
(0033) /******************************************************
(0034) 主程序
(0035) ******************************************************/
(0036) void main(void)
(0037) {
(0038) uchar s,i,th,tl;
(0039) uchar temh,teml,a,count,temm;
(0040) init_devices();
00E5 DFF6 RCALL _init_devices
(0041) init_1302();
00E6 DFCD RCALL _init_1302
(0042) init_1302();
00E7 DFCC RCALL _init_1302
(0043) init_lcd() ;
00E8 D105 RCALL _init_lcd
(0044) init_lcd() ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -