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

📄 ds1302.lst

📁 通过编程可以是实现对DS1302提供相应的时钟信号
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    002E E5CF      LDI	R28,0x5F
    002F E0D4      LDI	R29,4
    0030 BFCD      OUT	0x3D,R28
    0031 BFDE      OUT	0x3E,R29
    0032 51C0      SUBI	R28,0x10
    0033 40D0      SBCI	R29,0
    0034 EA0A      LDI	R16,0xAA
    0035 8308      STD	Y+0,R16
    0036 2400      CLR	R0
    0037 E6E8      LDI	R30,0x68
    0038 E0F0      LDI	R31,0
    0039 E010      LDI	R17,0
    003A 36E8      CPI	R30,0x68
    003B 07F1      CPC	R31,R17
    003C F011      BEQ	0x003F
    003D 9201      ST	R0,Z+
    003E CFFB      RJMP	0x003A
    003F 8300      STD	Z+0,R16
    0040 E5E4      LDI	R30,0x54
    0041 E0F0      LDI	R31,0
    0042 E6A0      LDI	R26,0x60
    0043 E0B0      LDI	R27,0
    0044 E010      LDI	R17,0
    0045 35EC      CPI	R30,0x5C
    0046 07F1      CPC	R31,R17
    0047 F021      BEQ	0x004C
    0048 95C8      LPM
    0049 9631      ADIW	R30,1
    004A 920D      ST	R0,X+
    004B CFF9      RJMP	0x0045
    004C 940E0106  CALL	_main
_exit:
    004E CFFF      RJMP	_exit
_delay_ms:
  i                    --> R20
  time                 --> R16
    004F 940E0133  CALL	push_gset1
FILE: D:\AVR\我的程序\DS1302的时钟实验\cfg.h
(0001) /*******************************
(0002) *程序名称:功能函数集
(0003) *设    计:萧联珠
(0004) *日    期:2007-11-22
(0005) ********************************/
(0006) #include <iom16v.h>
(0007) 
(0008) /*复位脚*/
(0009) #define RST_CLR	PORTC &= ~(1 << PC4)/*电平置低*/
(0010) #define RST_SET	PORTC |= (1 << PC4)/*电平置高*/
(0011) #define RST_IN	DDRC &= ~(1 << PC4)/*方向输入*/
(0012) #define RST_OUT	DDRC |= (1 << PC4)/*方向输出*/
(0013) 
(0014) /*双向数据*/
(0015) #define IO_CLR	PORTC &= ~(1 << PC3)/*电平置低*/
(0016) #define IO_SET	PORTC |= (1 << PC3)/*电平置高*/
(0017) #define IO_R	PINC & (1 << PC3)/*电平读取*/
(0018) #define IO_IN	DDRC &= ~(1 << PC3)/*方向输入*/
(0019) #define IO_OUT	DDRC |= (1 << PC3)/*方向输出*/
(0020) 
(0021) /*时钟信号*/
(0022) #define SCK_CLR	PORTC &= ~(1 << PC2)/*时钟信号*/
(0023) #define SCK_SET	PORTC |= (1 << PC2)/*电平置高*/
(0024) #define SCK_IN	DDRC &= ~(1 << PC2)/*方向输入*/
(0025) #define SCK_OUT	DDRC |= (1 << PC2)/*方向输出*/
(0026) 
(0027) #define ds1302_sec_add			0x80		//秒数据地址
(0028) #define ds1302_min_add			0x82		//分数据地址
(0029) #define ds1302_hr_add			0x84		//时数据地址
(0030) #define ds1302_date_add			0x86		//日数据地址
(0031) #define ds1302_month_add		0x88		//月数据地址
(0032) #define ds1302_day_add			0x8a		//星期数据地址
(0033) #define ds1302_year_add			0x8c		//年数据地址
(0034) #define ds1302_control_add		0x8e		//控制数据地址
(0035) #define ds1302_charger_add		0x90 					 
(0036) #define ds1302_clkburst_add		0xbe
(0037) 
(0038) unsigned char time_buf[8] = {0x20,0x07,0x05,0x08,0x16,0x15,0x00,0x02};
(0039) 
(0040) /*延时子程序*/
(0041) void delay_ms(int time)
(0042) {
(0043)  int i;
(0044)  for(;time>0;time--)
    0051 C00A      RJMP	0x005C
(0045)   for(i=0;i<1000;i++);
    0052 2744      CLR	R20
    0053 2755      CLR	R21
    0054 5F4F      SUBI	R20,0xFF
    0055 4F5F      SBCI	R21,0xFF
    0056 3E48      CPI	R20,0xE8
    0057 E0E3      LDI	R30,3
    0058 075E      CPC	R21,R30
    0059 F3D4      BLT	0x0054
    005A 5001      SUBI	R16,1
    005B 4010      SBCI	R17,0
    005C 2422      CLR	R2
    005D 2433      CLR	R3
    005E 1620      CP	R2,R16
    005F 0631      CPC	R3,R17
    0060 F38C      BLT	0x0052
    0061 940E0136  CALL	pop_gset1
    0063 9508      RET
(0046) }
(0047) 
(0048) /*串口初始化*/
(0049) void uart_init()
(0050) {
(0051)  UCSRA=0x02; //异步正常模式
_uart_init:
    0064 E082      LDI	R24,2
    0065 B98B      OUT	0x0B,R24
(0052)  UCSRB=0x18; //允许发送接受中断和使能
    0066 E188      LDI	R24,0x18
    0067 B98A      OUT	0x0A,R24
(0053)  UCSRC=0x06; //8位数据
    0068 E086      LDI	R24,6
    0069 BD80      OUT	0x20,R24
(0054)  UBRRH=0x00;
    006A 2422      CLR	R2
    006B BC20      OUT	0x20,R2
(0055)  UBRRL=12;   //波特率位9600
    006C E08C      LDI	R24,0xC
    006D B989      OUT	0x09,R24
    006E 9508      RET
_ds1302_write_byte:
  i                    --> R20
  d                    --> R18
  addr                 --> R16
    006F 940E0133  CALL	push_gset1
(0056) }
(0057) 
(0058) 
(0059) /*向DS1302写入一字节数据*/
(0060) void ds1302_write_byte(unsigned char addr, unsigned char d) {
(0061) 
(0062) 	unsigned char i;
(0063) 	RST_SET;					/*启动DS1302总线*/
    0071 9AAC      SBI	0x15,4
(0064) 	
(0065) 	/*写入目标地址:addr*/
(0066) 	IO_OUT;
    0072 9AA3      SBI	0x14,3
(0067) 	addr = addr & 0xFE;/*最低位置零*/
    0073 7F0E      ANDI	R16,0xFE
(0068) 	for (i = 0; i < 8; i ++) {
    0074 2744      CLR	R20
    0075 C009      RJMP	0x007F
(0069) 		if (addr & 0x01) {
    0076 FF00      SBRS	R16,0
    0077 C002      RJMP	0x007A
(0070) 			IO_SET;
    0078 9AAB      SBI	0x15,3
(0071) 			}
    0079 C001      RJMP	0x007B
(0072) 		else {
(0073) 			IO_CLR;
    007A 98AB      CBI	0x15,3
(0074) 			}
(0075) 		SCK_SET;
    007B 9AAA      SBI	0x15,2
(0076) 		SCK_CLR;
    007C 98AA      CBI	0x15,2
(0077) 		addr = addr >> 1;
    007D 9506      LSR	R16
    007E 9543      INC	R20
    007F 3048      CPI	R20,0x8
    0080 F3A8      BCS	0x0076
(0078) 		}
(0079) 	
(0080) 	/*写入数据:d*/
(0081) 	IO_OUT;
    0081 9AA3      SBI	0x14,3
(0082) 	for (i = 0; i < 8; i ++) {
    0082 2744      CLR	R20
    0083 C009      RJMP	0x008D
(0083) 		if (d & 0x01) {
    0084 FF20      SBRS	R18,0
    0085 C002      RJMP	0x0088
(0084) 			IO_SET;
    0086 9AAB      SBI	0x15,3
(0085) 			}
    0087 C001      RJMP	0x0089
(0086) 		else {
(0087) 			IO_CLR;
    0088 98AB      CBI	0x15,3
(0088) 			}
(0089) 		SCK_SET;
    0089 9AAA      SBI	0x15,2
(0090) 		SCK_CLR;
    008A 98AA      CBI	0x15,2
(0091) 		d = d >> 1;
    008B 9526      LSR	R18
    008C 9543      INC	R20
    008D 3048      CPI	R20,0x8
    008E F3A8      BCS	0x0084
(0092) 		}
(0093) 	RST_CLR;					/*停止DS1302总线*/
    008F 98AC      CBI	0x15,4
    0090 940E0136  CALL	pop_gset1
    0092 9508      RET
_ds1302_read_byte:
  temp                 --> R20
  i                    --> R22
  addr                 --> R16
    0093 940E0131  CALL	push_gset2
(0094) }
(0095) 
(0096) /*从DS1302读出一字节数据*/
(0097) unsigned char ds1302_read_byte(unsigned char addr) {
(0098) 
(0099) 	unsigned char i;
(0100) 	unsigned char temp;
(0101) 	RST_SET;					/*启动DS1302总线*/
    0095 9AAC      SBI	0x15,4
(0102) 
(0103) 	/*写入目标地址:addr*/
(0104) 	IO_OUT;
    0096 9AA3      SBI	0x14,3
(0105) 	addr = addr | 0x01;/*最低位置高*/
    0097 6001      ORI	R16,1
(0106) 	for (i = 0; i < 8; i ++) {
    0098 2766      CLR	R22
    0099 C009      RJMP	0x00A3
(0107) 		if (addr & 0x01) {
    009A FF00      SBRS	R16,0
    009B C002      RJMP	0x009E
(0108) 			IO_SET;
    009C 9AAB      SBI	0x15,3
(0109) 			}
    009D C001      RJMP	0x009F
(0110) 		else {
(0111) 			IO_CLR;
    009E 98AB      CBI	0x15,3
(0112) 			}
(0113) 		SCK_SET;
    009F 9AAA      SBI	0x15,2
(0114) 		SCK_CLR;
    00A0 98AA      CBI	0x15,2
(0115) 		addr = addr >> 1;
    00A1 9506      LSR	R16
    00A2 9563      INC	R22
    00A3 3068      CPI	R22,0x8
    00A4 F3A8      BCS	0x009A
(0116) 		}
(0117) 	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -