⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1302-162.lst

📁 有遥控的温度计,用dS1302做时钟芯片
💻 LST
📖 第 1 页 / 共 5 页
字号:
__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 + -