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

📄 ds1302.s

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 S
字号:
	.module ds1302.c
	.area data(ram, con, rel)
_time_buf::
	.blkb 2
	.area idata
	.byte 32,7
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 5,8
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 22,21
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 0,2
	.area data(ram, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\015-DS1302-LCD1602\ds1302.c
	.dbsym e time_buf _time_buf A[8:8]c
	.area text(rom, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\015-DS1302-LCD1602\ds1302.c
	.dbfunc e ds1302_write_byte _ds1302_write_byte fV
;              i -> R20
;              d -> R18
;           addr -> R16
	.even
_ds1302_write_byte::
	xcall push_gset1
	.dbline -1
	.dbline 43
; /*
; DS1302时钟芯片驱动函数
; 
; 	DS1302是产品中最常用的时钟芯片,此文件中的代码可以嵌入项目中使用。
; 
; */
; 
; #include "iom128v.h"
; 
; /*复位脚*/
; #define RST_CLR	PORTD &= ~(1 << PD7)/*电平置低*/
; #define RST_SET	PORTD |= (1 << PD7)/*电平置高*/
; #define RST_IN	DDRD &= ~(1 << PD7)/*方向输入*/
; #define RST_OUT	DDRD |= (1 << PD7)/*方向输出*/
; 
; /*双向数据*/
; #define IO_CLR	PORTD &= ~(1 << PD6)/*电平置低*/
; #define IO_SET	PORTD |= (1 << PD6)/*电平置高*/
; #define IO_R	PIND & (1 << PD6)/*电平读取*/
; #define IO_IN	DDRD &= ~(1 << PD6)/*方向输入*/
; #define IO_OUT	DDRD |= (1 << PD6)/*方向输出*/
; 
; /*时钟信号*/
; #define SCK_CLR	PORTD &= ~(1 << PD5)/*时钟信号*/
; #define SCK_SET	PORTD |= (1 << PD5)/*电平置高*/
; #define SCK_IN	DDRD &= ~(1 << PD5)/*方向输入*/
; #define SCK_OUT	DDRD |= (1 << PD5)/*方向输出*/
; 
; #define ds1302_sec_add			0x80		//秒数据地址
; #define ds1302_min_add			0x82		//分数据地址
; #define ds1302_hr_add			0x84		//时数据地址
; #define ds1302_date_add			0x86		//日数据地址
; #define ds1302_month_add		0x88		//月数据地址
; #define ds1302_day_add			0x8a		//星期数据地址
; #define ds1302_year_add			0x8c		//年数据地址
; #define ds1302_control_add		0x8e		//控制数据地址
; #define ds1302_charger_add		0x90 					 
; #define ds1302_clkburst_add		0xbe
; 
; unsigned char time_buf[8] = {0x20,0x07,0x05,0x08,0x16,0x15,0x00,0x02};
; 
; /*向DS1302写入一字节数据*/
; void ds1302_write_byte(unsigned char addr, unsigned char d) {
	.dbline 46
; 
; 	unsigned char i;
; 	RST_SET;					/*启动DS1302总线*/
	sbi 0x12,7
	.dbline 49
; 	
; 	/*写入目标地址:addr*/
; 	IO_OUT;
	sbi 0x11,6
	.dbline 50
; 	addr = addr & 0xFE;/*最低位置零*/
	andi R16,254
	.dbline 51
	clr R20
	xjmp L5
L2:
	.dbline 51
; 	for (i = 0; i < 8; i ++) {
	.dbline 52
; 		if (addr & 0x01) {
	sbrs R16,0
	rjmp L6
	.dbline 52
	.dbline 53
; 			IO_SET;
	sbi 0x12,6
	.dbline 54
; 			}
	xjmp L7
L6:
	.dbline 55
; 		else {
	.dbline 56
; 			IO_CLR;
	cbi 0x12,6
	.dbline 57
; 			}
L7:
	.dbline 58
	sbi 0x12,5
	.dbline 59
	cbi 0x12,5
	.dbline 60
	lsr R16
	.dbline 61
L3:
	.dbline 51
	inc R20
L5:
	.dbline 51
	cpi R20,8
	brlo L2
	.dbline 64
; 		SCK_SET;
; 		SCK_CLR;
; 		addr = addr >> 1;
; 		}
; 	
; 	/*写入数据:d*/
; 	IO_OUT;
	sbi 0x11,6
	.dbline 65
	clr R20
	xjmp L11
L8:
	.dbline 65
; 	for (i = 0; i < 8; i ++) {
	.dbline 66
; 		if (d & 0x01) {
	sbrs R18,0
	rjmp L12
	.dbline 66
	.dbline 67
; 			IO_SET;
	sbi 0x12,6
	.dbline 68
; 			}
	xjmp L13
L12:
	.dbline 69
; 		else {
	.dbline 70
; 			IO_CLR;
	cbi 0x12,6
	.dbline 71
; 			}
L13:
	.dbline 72
	sbi 0x12,5
	.dbline 73
	cbi 0x12,5
	.dbline 74
	lsr R18
	.dbline 75
L9:
	.dbline 65
	inc R20
L11:
	.dbline 65
	cpi R20,8
	brlo L8
	.dbline 76
; 		SCK_SET;
; 		SCK_CLR;
; 		d = d >> 1;
; 		}
; 	RST_CLR;					/*停止DS1302总线*/
	cbi 0x12,7
	.dbline -2
L1:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r d 18 c
	.dbsym r addr 16 c
	.dbend
	.dbfunc e ds1302_read_byte _ds1302_read_byte fc
;           temp -> R20
;              i -> R22
;           addr -> R16
	.even
_ds1302_read_byte::
	xcall push_gset2
	.dbline -1
	.dbline 80
; }
; 
; /*从DS1302读出一字节数据*/
; unsigned char ds1302_read_byte(unsigned char addr) {
	.dbline 84
; 
; 	unsigned char i;
; 	unsigned char temp;
; 	RST_SET;					/*启动DS1302总线*/
	sbi 0x12,7
	.dbline 87
; 
; 	/*写入目标地址:addr*/
; 	IO_OUT;
	sbi 0x11,6
	.dbline 88
; 	addr = addr | 0x01;/*最低位置高*/
	ori R16,1
	.dbline 89
	clr R22
	xjmp L18
L15:
	.dbline 89
; 	for (i = 0; i < 8; i ++) {
	.dbline 90
; 		if (addr & 0x01) {
	sbrs R16,0
	rjmp L19
	.dbline 90
	.dbline 91
; 			IO_SET;
	sbi 0x12,6
	.dbline 92
; 			}
	xjmp L20
L19:
	.dbline 93
; 		else {
	.dbline 94
; 			IO_CLR;
	cbi 0x12,6
	.dbline 95
; 			}
L20:
	.dbline 96
	sbi 0x12,5
	.dbline 97
	cbi 0x12,5
	.dbline 98
	lsr R16
	.dbline 99
L16:
	.dbline 89
	inc R22
L18:
	.dbline 89
	cpi R22,8
	brlo L15
	.dbline 102
; 		SCK_SET;
; 		SCK_CLR;
; 		addr = addr >> 1;
; 		}
; 	
; 	/*输出数据:temp*/
; 	IO_IN;
	cbi 0x11,6
	.dbline 103
	clr R22
	xjmp L24
L21:
	.dbline 103
; 	for (i = 0; i < 8; i ++) {
	.dbline 104
; 		temp = temp >> 1;
	lsr R20
	.dbline 105
; 		if (IO_R) {
	sbis 0x10,6
	rjmp L25
	.dbline 105
	.dbline 106
; 			temp |= 0x80;
	ori R20,128
	.dbline 107
; 			}
	xjmp L26
L25:
	.dbline 108
; 		else {
	.dbline 109
; 			temp &= 0x7F;
	andi R20,127
	.dbline 110
; 			}
L26:
	.dbline 111
	sbi 0x12,5
	.dbline 112
	cbi 0x12,5
	.dbline 113
L22:
	.dbline 103
	inc R22
L24:
	.dbline 103
	cpi R22,8
	brlo L21
	.dbline 115
; 		SCK_SET;
; 		SCK_CLR;
; 		}
; 	
; 	RST_CLR;					/*停止DS1302总线*/
	cbi 0x12,7
	.dbline 116
; 	return temp;
	mov R16,R20
	.dbline -2
L14:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 c
	.dbsym r i 22 c
	.dbsym r addr 16 c
	.dbend
	.dbfunc e ds1302_write_time _ds1302_write_time fV
	.even
_ds1302_write_time::
	.dbline -1
	.dbline 120
; }
; 
; /*向DS302写入时钟数据*/
; void ds1302_write_time(void) {
	.dbline 122
; 
; 	ds1302_write_byte(ds1302_control_add,0x00);			//关闭写保护 
	clr R18
	ldi R16,142
	xcall _ds1302_write_byte
	.dbline 123
; 	ds1302_write_byte(ds1302_sec_add,0x80);				//暂停 
	ldi R18,128
	ldi R16,128
	xcall _ds1302_write_byte
	.dbline 125
; 	//ds1302_write_byte(ds1302_charger_add,0xa9);			//涓流充电 
; 	ds1302_write_byte(ds1302_year_add,time_buf[1]);		//年 
	lds R18,_time_buf+1
	ldi R16,140
	xcall _ds1302_write_byte
	.dbline 126
; 	ds1302_write_byte(ds1302_month_add,time_buf[2]);	//月 
	lds R18,_time_buf+2
	ldi R16,136
	xcall _ds1302_write_byte
	.dbline 127
; 	ds1302_write_byte(ds1302_date_add,time_buf[3]);		//日 
	lds R18,_time_buf+3
	ldi R16,134
	xcall _ds1302_write_byte
	.dbline 128
; 	ds1302_write_byte(ds1302_day_add,time_buf[7]);		//周 
	lds R18,_time_buf+7
	ldi R16,138
	xcall _ds1302_write_byte
	.dbline 129
; 	ds1302_write_byte(ds1302_hr_add,time_buf[4]);		//时 
	lds R18,_time_buf+4
	ldi R16,132
	xcall _ds1302_write_byte
	.dbline 130
; 	ds1302_write_byte(ds1302_min_add,time_buf[5]);		//分
	lds R18,_time_buf+5
	ldi R16,130
	xcall _ds1302_write_byte
	.dbline 131
; 	ds1302_write_byte(ds1302_sec_add,time_buf[6]);		//秒
	lds R18,_time_buf+6
	ldi R16,128
	xcall _ds1302_write_byte
	.dbline 132
; 	ds1302_write_byte(ds1302_day_add,time_buf[7]);		//周 
	lds R18,_time_buf+7
	ldi R16,138
	xcall _ds1302_write_byte
	.dbline 133
; 	ds1302_write_byte(ds1302_control_add,0x80);			//打开写保护 
	ldi R18,128
	ldi R16,142
	xcall _ds1302_write_byte
	.dbline -2
L27:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e ds1302_read_time _ds1302_read_time fV
	.even
_ds1302_read_time::
	.dbline -1
	.dbline 137
; }
; 
; /*从DS302读出时钟数据*/
; void ds1302_read_time(void)  { 
	.dbline 139
; 
; 	time_buf[1]=ds1302_read_byte(ds1302_year_add);		//年 
	ldi R16,140
	xcall _ds1302_read_byte
	sts _time_buf+1,R16
	.dbline 140
; 	time_buf[2]=ds1302_read_byte(ds1302_month_add);		//月 
	ldi R16,136
	xcall _ds1302_read_byte
	sts _time_buf+2,R16
	.dbline 141
; 	time_buf[3]=ds1302_read_byte(ds1302_date_add);		//日 
	ldi R16,134
	xcall _ds1302_read_byte
	sts _time_buf+3,R16
	.dbline 142
; 	time_buf[4]=ds1302_read_byte(ds1302_hr_add);		//时 
	ldi R16,132
	xcall _ds1302_read_byte
	sts _time_buf+4,R16
	.dbline 143
; 	time_buf[5]=ds1302_read_byte(ds1302_min_add);		//分 
	ldi R16,130
	xcall _ds1302_read_byte
	sts _time_buf+5,R16
	.dbline 144
; 	time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7F;//秒 
	ldi R16,128
	xcall _ds1302_read_byte
	mov R24,R16
	andi R24,127
	sts _time_buf+6,R24
	.dbline 145
; 	time_buf[7]=ds1302_read_byte(ds1302_day_add);		//周 
	ldi R16,138
	xcall _ds1302_read_byte
	sts _time_buf+7,R16
	.dbline -2
L36:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e ds1302_init _ds1302_init fV
	.even
_ds1302_init::
	.dbline -1
	.dbline 149
; }
; 
; /*DS302初始化函数*/
; void ds1302_init(void) {
	.dbline 151
; 	
; 	RST_CLR;			/*RST脚置低*/
	cbi 0x12,7
	.dbline 152
; 	SCK_CLR;			/*SCK脚置低*/
	cbi 0x12,5
	.dbline 153
; 	RST_OUT;			/*RST脚设置为输出*/
	sbi 0x11,7
	.dbline 154
; 	SCK_OUT;			/*SCK脚设置为输出*/
	sbi 0x11,5
	.dbline -2
L44:
	.dbline 0 ; func end
	ret
	.dbend

⌨️ 快捷键说明

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