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

📄 ds1302.s

📁 使用mega16单片机对dallas公司的定时器芯片DS1302进行读取与写入的驱动程序
💻 S
字号:
	.module DS1302.c
	.area text(rom, con, rel)
	.dbfile D:\单片机编程\iccavr\DS1302时钟\DS1302.c
	.dbfunc e SetDateTime _SetDateTime fV
;              i -> R20
;           data -> R18
;            cmd -> R16
	.even
_SetDateTime::
	xcall push_gset1
	.dbline -1
	.dbline 49
; #include <iom16v.h>
; #include <macros.h>
; 
; //秒
; #define SEC_W 0x80
; #define SEC_R 0x81
; 
; //分
; #define MIN_W 0x82
; #define MIN_R 0x83
; 
; //小时
; #define HR_W 0x84
; #define HR_R 0x85
; 
; //日期
; #define DATE_W 0x86
; #define DATE_R 0x87
; 
; //月
; #define MONTH_W 0x88
; #define MONTH_R 0x89
; 
; //星期几
; #define DAY_W 0x8A
; #define DAY_R 0x8B
; 
; //年
; #define YEAR_W 0x8C
; #define YEAR_R 0x8D
; 
; //控制写保护
; #define CONTROL_W 0x8E
; #define CONTROL_R 0x8F
; 
; //控制充电
; #define TRIC_CHARGE_W 0x90
; #define TRIC_CHARGE_R 0x91
; 
; //突发模式
; #define CLOCK_BURST_W 0xBE
; #define CLOCK_BURST_R 0xBF
; 
; //写入时钟控制信息
; //SZRST--PD5
; //SZSDA--PD6
; //SZSCK--PD7
; void SetDateTime(unsigned char cmd,unsigned char data)
; {
	.dbline 50
;     unsigned char i=0;
	clr R20
	.dbline 51
; 	PORTD&=0x1F;//设置PD5~PD7为低 0001 1111
	in R24,0x12
	andi R24,31
	out 0x12,R24
	.dbline 52
; 	DDRD|=0xE0;//设置PD5~PD7为输出 1110 0000
	in R24,0x11
	ori R24,224
	out 0x11,R24
	.dbline 53
; 	PORTD|=0x20;//RESET为高 0010 0000
	sbi 0x12,5
	.dbline 54
; 	for(i=0;i<8;i++)
	xjmp L5
L2:
	.dbline 55
; 	{
	.dbline 56
; 	    if(cmd&0x01)
	sbrs R16,0
	rjmp L6
	.dbline 57
; 		{
	.dbline 58
; 		    PORTD|=0x40;  //0100 0000
	sbi 0x12,6
	.dbline 59
; 		}
	xjmp L7
L6:
	.dbline 61
; 		else
; 		{
	.dbline 62
; 		    PORTD&=0xBF;  //1011 1111
	in R24,0x12
	andi R24,191
	out 0x12,R24
	.dbline 63
; 		} 
L7:
	.dbline 64
	sbi 0x12,7
	.dbline 65
	in R24,0x12
	andi R24,127
	out 0x12,R24
	.dbline 66
	lsr R16
	.dbline 67
L3:
	.dbline 54
	inc R20
L5:
	.dbline 54
	cpi R20,8
	brlo L2
	.dbline 68
; 		PORTD|=0x80;    //1000 0000
; 		PORTD&=0x7F;    //0111 1111
; 		cmd=cmd>>1;
; 	}
; 	for(i=0;i<8;i++)
	clr R20
	xjmp L11
L8:
	.dbline 69
; 	{
	.dbline 70
; 	    if(data&0x01)
	sbrs R18,0
	rjmp L12
	.dbline 71
; 		{
	.dbline 72
; 		    PORTD|=0x40;//0100 0000
	sbi 0x12,6
	.dbline 73
; 		}
	xjmp L13
L12:
	.dbline 75
; 		else
; 		{
	.dbline 76
; 		    PORTD&=0xBF;//1011 1111
	in R24,0x12
	andi R24,191
	out 0x12,R24
	.dbline 77
; 		}
L13:
	.dbline 78
	sbi 0x12,7
	.dbline 79
	in R24,0x12
	andi R24,127
	out 0x12,R24
	.dbline 80
	lsr R18
	.dbline 81
L9:
	.dbline 68
	inc R20
L11:
	.dbline 68
	cpi R20,8
	brlo L8
	.dbline 82
; 		PORTD|=0x80;//SZSCK=1;
; 		PORTD&=0x7F;//SZSCK=0;
; 		data=data>>1;
; 	}
; 	PORTD&=0xDF;//设置RESET为低
	in R24,0x12
	andi R24,223
	out 0x12,R24
	.dbline -2
	.dbline 83
; }
L1:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r data 18 c
	.dbsym r cmd 16 c
	.dbend
	.dbfunc e ReadDateTime _ReadDateTime fc
;           code -> R20
;              i -> R22
;            cmd -> R16
	.even
_ReadDateTime::
	xcall push_gset2
	.dbline -1
	.dbline 91
; 
; 
; //读出时钟控制信息
; //SZRST--PD5
; //SZSDA--PD6
; //SZSCK--PD7
; unsigned char ReadDateTime(unsigned char cmd)
; {
	.dbline 92
;     unsigned char i=0;
	clr R22
	.dbline 94
; 	unsigned char code;//返回的数据值
; 	PORTD&=0x1F;//设置PD5~PD7为低 0001 1111
	in R24,0x12
	andi R24,31
	out 0x12,R24
	.dbline 95
; 	DDRD|=0xE0;//设置PD5~PD7为输出 1110 0000
	in R24,0x11
	ori R24,224
	out 0x11,R24
	.dbline 96
; 	PORTD|=0x20;//RESET为高 0010 0000
	sbi 0x12,5
	.dbline 97
;     for(i=0;i<8;i++)
	xjmp L18
L15:
	.dbline 98
; 	{
	.dbline 99
; 	    if(cmd&0x01)
	sbrs R16,0
	rjmp L19
	.dbline 100
; 		{
	.dbline 101
; 		    PORTD|=0x40;  //0100 0000
	sbi 0x12,6
	.dbline 102
; 		}
	xjmp L20
L19:
	.dbline 104
; 		else
; 		{
	.dbline 105
; 		    PORTD&=0xBF;  //1011 1111
	in R24,0x12
	andi R24,191
	out 0x12,R24
	.dbline 106
; 		} 
L20:
	.dbline 107
	sbi 0x12,7
	.dbline 108
	in R24,0x12
	andi R24,127
	out 0x12,R24
	.dbline 109
	lsr R16
	.dbline 110
L16:
	.dbline 97
	inc R22
L18:
	.dbline 97
	cpi R22,8
	brlo L15
	.dbline 111
; 		PORTD|=0x80;    //1000 0000 SZSCK=1
; 		PORTD&=0x7F;//SZSCK=0;
; 		cmd=cmd>>1;
; 	}
; 	DDRD&=0xBF;//设置PD6(SZSDA)为输入模式
	in R24,0x11
	andi R24,191
	out 0x11,R24
	.dbline 112
; 	for(i=0;i<8;i++)
	clr R22
	xjmp L24
L21:
	.dbline 113
; 	{
	.dbline 114
; 	    code=code>>1;
	lsr R20
	.dbline 115
; 	    PORTD&=0x7F;//0111 1111 设置PD7(SZSCK)为低
	in R24,0x12
	andi R24,127
	out 0x12,R24
	.dbline 116
; 		if(PIND&0x40)
	sbis 0x10,6
	rjmp L25
	.dbline 117
; 		{
	.dbline 118
; 		    code|=0x80;
	ori R20,128
	.dbline 119
; 		}
L25:
	.dbline 120
	sbi 0x12,7
	.dbline 121
	in R24,0x12
	andi R24,127
	out 0x12,R24
	.dbline 122
L22:
	.dbline 112
	inc R22
L24:
	.dbline 112
	cpi R22,8
	brlo L21
	.dbline 123
; 		PORTD|=0x80;//SZSCK=1;
; 		PORTD&=0x7F;//SZSCK=0;
; 	}
; 	PORTD&=0xDF;//设置RESET为低 1101 1111
	in R24,0x12
	andi R24,223
	out 0x12,R24
	.dbline 124
; 	return code;
	mov R16,R20
	.dbline -2
L14:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r code 20 c
	.dbsym r i 22 c
	.dbsym r cmd 16 c
	.dbend
	.dbfunc e ASCIItoBCD _ASCIItoBCD fc
;            tmp -> R22
;           data -> R20
	.even
_ASCIItoBCD::
	xcall push_gset2
	mov R20,R16
	.dbline -1
	.dbline 131
; }
; 
; //ASCII码转换为BCD码
; //输入参数data为输入的数字
; //返回值为BCD码表示的数字
; unsigned char ASCIItoBCD(unsigned char data)
; {
	.dbline 133
;     unsigned char tmp;
;     if(data>10)
	ldi R24,10
	cp R24,R20
	brsh L28
	.dbline 134
;     {
	.dbline 135
;         tmp=data/10;
	ldi R17,10
	mov R16,R20
	xcall div8u
	mov R22,R16
	.dbline 136
;         data=data%10;
	ldi R17,10
	mov R16,R20
	xcall mod8u
	mov R20,R16
	.dbline 137
;         data=(tmp<<4)|data;
	mov R24,R22
	andi R24,#0x0F
	swap R24
	or R20,R24
	.dbline 138
;     }
L28:
	.dbline 139
;     return data;
	mov R16,R20
	.dbline -2
L27:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r tmp 22 c
	.dbsym r data 20 c
	.dbend
	.dbfunc e BCDtoASCII _BCDtoASCII fc
;            tmp -> R22
;           mask -> R10
;           data -> R20
	.even
_BCDtoASCII::
	xcall push_gset3
	mov R10,R18
	mov R20,R16
	.dbline -1
	.dbline 147
; }
; 
; //BCD码转换为ASCII码
; //输入参数data为BCD码
; //输入参数num为转换从最右边开始到第mask位结束
; //返回值为ASCII表示的数字
; unsigned char BCDtoASCII(unsigned char data,unsigned char mask)
; {
	.dbline 148
;     unsigned char tmp=0xff;
	ldi R22,255
	.dbline 149
;     tmp=tmp>>(8-mask);
	ldi R17,8
	sub R17,R10
	mov R16,R22
	xcall lsr8
	mov R22,R16
	.dbline 150
;     data=data&tmp;
	and R20,R16
	.dbline 151
;     if(data>0x0f)
	ldi R24,15
	cp R24,R20
	brsh L31
	.dbline 152
;     {
	.dbline 153
;         tmp=data&0x0f;
	mov R22,R20
	andi R22,15
	.dbline 154
;         data=data>>4;
	mov R24,R20
	swap R24
	andi R24,#0x0F
	mov R20,R24
	.dbline 155
;         data=data*10+tmp;
	ldi R24,10
	mul R24,R20
	mov R20,R0
	add R20,R22
	.dbline 156
;     }
L31:
	.dbline 157
;     return data;
	mov R16,R20
	.dbline -2
L30:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r tmp 22 c
	.dbsym r mask 10 c
	.dbsym r data 20 c
	.dbend
	.dbfunc e main _main fV
;           data -> R20
	.even
_main::
	.dbline -1
	.dbline 162
; }
; 
; 
; void main()
; {
	.dbline 164
;     unsigned char data;
;     SetDateTime(TRIC_CHARGE_W,0xA5);
	ldi R18,165
	ldi R16,144
	xcall _SetDateTime
	.dbline 165
;     data=ReadDateTime(TRIC_CHARGE_R);
	ldi R16,145
	xcall _ReadDateTime
	mov R20,R16
L34:
	.dbline 167
L35:
	.dbline 166
	xjmp L34
X0:
	.dbline -2
	.dbline 168
;     while(1)
;         ;
; }
L33:
	.dbline 0 ; func end
	ret
	.dbsym r data 20 c
	.dbend

⌨️ 快捷键说明

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