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

📄 ds1302.s

📁 mega128+VS1003做的mp3的程序 可以用WINAVR编译
💻 S
字号:
	.module DS1302.C
	.area text(rom, con, rel)
	.dbfile E:\software\MP3程序\Ds1302\DS1302.C
	.dbfunc e ds1302_init _ds1302_init fV
	.even
_ds1302_init::
	.dbline -1
	.dbline 44
; /*********************************************************************************
; *移植时一定要注意函数 void Ds1302buf_Write(uchar cmd, uchar data),中的方向和,读PIN引脚
; *********************************************************************************/
; #include <iom64v.h>
; #include <macros.h>
; #include "./ds1302.h"
; #define  uchar unsigned char
; #define  uint  unsigned int
;  
; #define	 nop    NOP(); \
; 		 		NOP(); \
; 				NOP(); \
; 				NOP(); \
; 				NOP()
; 		 		    
; #define     sei()   SEI()       
; #define     cli()   CLI()  
;                 
; #define  DSCL(x)  PORTE = (PORTE & ~(1<<2))|(x<<2)  
; #define  DSDA(x)  PORTE = (PORTE & ~(1<<3))|(x<<3)
; #define  DRST(x)  PORTE = (PORTE & ~(1<<4))|(x<<4)
; 
; #define		SEC_W		0x80       /*Ds1302buf命令字*/
; #define		SEC_R		0x81
; #define	    MIN_W		0x82
; #define		MIN_R		0x83
; #define		hour_W		0x84
; #define		hour_R		0x85
; #define		DATE_W		0x86
; #define		DATE_R		0x87
; #define		MONTH_W		0x88
; #define		MONTH_R		0x89
; #define		WEEK_W		0x8a
; #define		WEEK_R		0x8b
; #define		YEAR_W		0x8c
; #define		YEAR_R		0x8d
; #define		WP_W		0x8E
; #define 	POWER_W 	0X90
; extern struct time_now timebuf;
; #define		Ds1302buf  timebuf
; 
; //#define PRINTF_COM 1
; void ds1302_init(void)
; {
	.dbline 45
;  DDRE  |= (1<<2)|(1<<3)|(1<<4);
	in R24,0x2
	ori R24,28
	out 0x2,R24
	.dbline 46
;  PORTE |= (1<<2)|(1<<3)|(1<<4); 
	in R24,0x3
	ori R24,28
	out 0x3,R24
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Ds1302buf_Write _Ds1302buf_Write fV
;              i -> R20
;           data -> R22
;            cmd -> R10
	.even
_Ds1302buf_Write::
	xcall push_gset3
	mov R22,R18
	mov R10,R16
	.dbline -1
	.dbline 52
; }
; /*********************************************************************************************************************************************
; 写一个字节到Ds1302buf,参数分别为命令、数据
; *********************************************************************************************************************************************/
; void Ds1302buf_Write(uchar cmd, uchar data)
; {uchar i;
	.dbline 53
;  DSCL(0);
	cbi 0x3,2
	.dbline 54
;  DRST(0);
	cbi 0x3,4
	.dbline 55
;  nop;
	nop
	.dbline 55
	nop
	.dbline 55
	nop
	.dbline 55
	nop
	.dbline 55
	nop
	.dbline 56
;  DRST(1);
	in R24,0x3
	andi R24,239
	ori R24,16
	out 0x3,R24
	.dbline 57
;  nop;
	nop
	.dbline 57
	nop
	.dbline 57
	nop
	.dbline 57
	nop
	.dbline 57
	nop
	.dbline 58
;  for(i=0; i<8; i++)/*发送内部地址*/
	clr R20
	xjmp L6
L3:
	.dbline 59
;    {
	.dbline 60
;     DSCL(0);
	cbi 0x3,2
	.dbline 61
;    	nop;
	nop
	.dbline 61
	nop
	.dbline 61
	nop
	.dbline 61
	nop
	.dbline 61
	nop
	.dbline 62
;     if(cmd & (1<<i)) DSDA(1);
	ldi R16,1
	mov R17,R20
	xcall lsl8
	mov R2,R10
	and R2,R16
	breq L7
	.dbline 62
	in R24,0x3
	andi R24,247
	ori R24,8
	out 0x3,R24
	xjmp L8
L7:
	.dbline 63
; 	  else DSDA(0);
	cbi 0x3,3
L8:
	.dbline 64
	in R24,0x3
	andi R24,251
	ori R24,4
	out 0x3,R24
	.dbline 65
	nop
	.dbline 65
	nop
	.dbline 65
	nop
	.dbline 65
	nop
	.dbline 65
	nop
	.dbline 66
L4:
	.dbline 58
	inc R20
L6:
	.dbline 58
	cpi R20,8
	brlo L3
	.dbline 67
;     DSCL(1);
; 	nop;
;    }
;  for(i=0; i<8; i++)/*发送数据*/
	clr R20
	xjmp L12
L9:
	.dbline 68
;    {
	.dbline 69
; 	DSCL(0);
	cbi 0x3,2
	.dbline 70
; 	nop;
	nop
	.dbline 70
	nop
	.dbline 70
	nop
	.dbline 70
	nop
	.dbline 70
	nop
	.dbline 71
;     if(data & (1<<i)) DSDA(1);
	ldi R16,1
	mov R17,R20
	xcall lsl8
	mov R2,R22
	and R2,R16
	breq L13
	.dbline 71
	in R24,0x3
	andi R24,247
	ori R24,8
	out 0x3,R24
	xjmp L14
L13:
	.dbline 72
; 	  else DSDA(0);
	cbi 0x3,3
L14:
	.dbline 73
	in R24,0x3
	andi R24,251
	ori R24,4
	out 0x3,R24
	.dbline 74
	nop
	.dbline 74
	nop
	.dbline 74
	nop
	.dbline 74
	nop
	.dbline 74
	nop
	.dbline 75
L10:
	.dbline 67
	inc R20
L12:
	.dbline 67
	cpi R20,8
	brlo L9
	.dbline 76
;     DSCL(1);
; 	nop;
;    }
;  DRST(0);
	cbi 0x3,4
	.dbline -2
L2:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r data 22 c
	.dbsym r cmd 10 c
	.dbend
	.dbfunc e Ds1302buf_Read _Ds1302buf_Read fc
;           data -> R20
;              i -> R22
;            cmd -> R10
	.even
_Ds1302buf_Read::
	xcall push_gset3
	mov R10,R16
	.dbline -1
	.dbline 82
; }
; /*********************************************************************************************************************************************
; 从Ds1302buf读一个字节数据返回,参数只有命令,返回数据
; *******************************************************************************************************************************************/
; uchar Ds1302buf_Read(uchar cmd)
; {
	.dbline 85
;  uchar i;
;  uchar data;
;  DSCL(0);
	cbi 0x3,2
	.dbline 86
;  DRST(0);
	cbi 0x3,4
	.dbline 87
;  nop;
	nop
	.dbline 87
	nop
	.dbline 87
	nop
	.dbline 87
	nop
	.dbline 87
	nop
	.dbline 88
;  DRST(1);
	in R24,0x3
	andi R24,239
	ori R24,16
	out 0x3,R24
	.dbline 89
;  nop;
	nop
	.dbline 89
	nop
	.dbline 89
	nop
	.dbline 89
	nop
	.dbline 89
	nop
	.dbline 90
;  for(i=0; i<8; i++)/*发送内部地址*/
	clr R22
	xjmp L19
L16:
	.dbline 91
; 	{
	.dbline 92
; 	DSCL(0);
	cbi 0x3,2
	.dbline 93
; 	nop;
	nop
	.dbline 93
	nop
	.dbline 93
	nop
	.dbline 93
	nop
	.dbline 93
	nop
	.dbline 94
;     if(cmd & (1<<i)) DSDA(1);
	ldi R16,1
	mov R17,R22
	xcall lsl8
	mov R2,R10
	and R2,R16
	breq L20
	.dbline 94
	in R24,0x3
	andi R24,247
	ori R24,8
	out 0x3,R24
	xjmp L21
L20:
	.dbline 95
; 	  else DSDA(0);
	cbi 0x3,3
L21:
	.dbline 96
	in R24,0x3
	andi R24,251
	ori R24,4
	out 0x3,R24
	.dbline 97
	nop
	.dbline 97
	nop
	.dbline 97
	nop
	.dbline 97
	nop
	.dbline 97
	nop
	.dbline 98
L17:
	.dbline 90
	inc R22
L19:
	.dbline 90
	cpi R22,8
	brlo L16
	.dbline 99
;     DSCL(1);
; 	nop;
;     }
;  DDRE &= ~(1<<3);                   
	cbi 0x2,3
	.dbline 100
;  DSDA(0);
	cbi 0x3,3
	.dbline 101
;  DSCL(0);
	cbi 0x3,2
	.dbline 102
;  nop;
	nop
	.dbline 102
	nop
	.dbline 102
	nop
	.dbline 102
	nop
	.dbline 102
	nop
	.dbline 103
;  if(PINE & (1<<3)) data |=0x80;
	sbis 0x1,3
	rjmp L22
	.dbline 103
	ori R20,128
	xjmp L23
L22:
	.dbline 104
;  	else data &= 0x7f;
	andi R20,127
L23:
	.dbline 105
;  for(i=0; i<7; i++)/*读数据*/
	clr R22
	xjmp L27
L24:
	.dbline 106
;  	{       data >>=1;
	.dbline 106
	lsr R20
	.dbline 107
;   		DSCL(1);
	in R24,0x3
	andi R24,251
	ori R24,4
	out 0x3,R24
	.dbline 108
; 		nop;
	nop
	.dbline 108
	nop
	.dbline 108
	nop
	.dbline 108
	nop
	.dbline 108
	nop
	.dbline 109
; 		DSCL(0);
	cbi 0x3,2
	.dbline 110
; 		nop;
	nop
	.dbline 110
	nop
	.dbline 110
	nop
	.dbline 110
	nop
	.dbline 110
	nop
	.dbline 111
;   		if(PINE & (1<<3)) {data |=0x80;}
	sbis 0x1,3
	rjmp L28
	.dbline 111
	.dbline 111
	ori R20,128
	.dbline 111
	xjmp L29
L28:
	.dbline 112
;     		else {data &= 0x7f;}
	.dbline 112
	andi R20,127
	.dbline 112
L29:
	.dbline 113
L25:
	.dbline 105
	inc R22
L27:
	.dbline 105
	cpi R22,7
	brlo L24
	.dbline 114
;   	}
;  DDRE |= 1<<3;
	sbi 0x2,3
	.dbline 115
;  DRST(0);
	cbi 0x3,4
	.dbline 116
;  return data;
	mov R16,R20
	.dbline -2
L15:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r data 20 c
	.dbsym r i 22 c
	.dbsym r cmd 10 c
	.dbend
	.dbfunc e Read_InfoDs1302buf _Read_InfoDs1302buf fV
	.even
_Read_InfoDs1302buf::
	.dbline -1
	.dbline 122
; }
; /*********************************************************************************************************************************************
; 从Ds1302buf中读取时钟日历信息
; *********************************************************************************************************************************************/
; void Read_InfoDs1302buf(void)
; {cli();
	.dbline 122
	cli
	.dbline 123
;  Ds1302buf.sec   = Ds1302buf_Read(SEC_R) & 0x7f;
	ldi R16,129
	xcall _Ds1302buf_Read
	mov R24,R16
	andi R24,127
	sts _timebuf,R24
	.dbline 124
;  Ds1302buf.min   = Ds1302buf_Read(MIN_R) & 0x7f;
	ldi R16,131
	xcall _Ds1302buf_Read
	mov R24,R16
	andi R24,127
	sts _timebuf+1,R24
	.dbline 125
;  Ds1302buf.hour  = Ds1302buf_Read(hour_R)  & 0x3f;
	ldi R16,133
	xcall _Ds1302buf_Read
	mov R24,R16
	andi R24,63
	sts _timebuf+2,R24
	.dbline 126
;  Ds1302buf.date  = Ds1302buf_Read(DATE_R)& 0x3f;
	ldi R16,135
	xcall _Ds1302buf_Read
	mov R24,R16
	andi R24,63
	sts _timebuf+3,R24
	.dbline 127
;  Ds1302buf.month = Ds1302buf_Read(MONTH_R) & 0x1f;
	ldi R16,137
	xcall _Ds1302buf_Read
	mov R24,R16
	andi R24,31
	sts _timebuf+4,R24
	.dbline 128
;  Ds1302buf.week  = Ds1302buf_Read(WEEK_R)  & 0x07;
	ldi R16,139
	xcall _Ds1302buf_Read
	mov R24,R16
	andi R24,7
	sts _timebuf+5,R24
	.dbline 129
;  Ds1302buf.year  = Ds1302buf_Read(YEAR_R);
	ldi R16,141
	xcall _Ds1302buf_Read
	sts _timebuf+6,R16
	.dbline 130
;  sei();
	sei
	.dbline -2
L30:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Write_InfoDs1302buf _Write_InfoDs1302buf fV
	.even
_Write_InfoDs1302buf::
	.dbline -1
	.dbline 136
; }
; /*********************************************************************************************************************************************
; 将时钟日历信息存储到Ds1302buf中
; *********************************************************************************************************************************************/
; void Write_InfoDs1302buf(void)
; {cli();
	.dbline 136
	cli
	.dbline 137
;  Ds1302buf_Write(WP_W,    0x00);     
	clr R18
	ldi R16,142
	xcall _Ds1302buf_Write
	.dbline 138
;  Ds1302buf_Write(SEC_W,   Ds1302buf.sec);
	lds R18,_timebuf
	ldi R16,128
	xcall _Ds1302buf_Write
	.dbline 139
;  Ds1302buf_Write(MIN_W,   Ds1302buf.min);
	lds R18,_timebuf+1
	ldi R16,130
	xcall _Ds1302buf_Write
	.dbline 140
;  Ds1302buf_Write(hour_W,  Ds1302buf.hour);
	lds R18,_timebuf+2
	ldi R16,132
	xcall _Ds1302buf_Write
	.dbline 141
;  Ds1302buf_Write(DATE_W,  Ds1302buf.date);
	lds R18,_timebuf+3
	ldi R16,134
	xcall _Ds1302buf_Write
	.dbline 142
;  Ds1302buf_Write(MONTH_W, Ds1302buf.month);
	lds R18,_timebuf+4
	ldi R16,136
	xcall _Ds1302buf_Write
	.dbline 143
;  Ds1302buf_Write(WEEK_W,  Ds1302buf.week);
	lds R18,_timebuf+5
	ldi R16,138
	xcall _Ds1302buf_Write
	.dbline 144
;  Ds1302buf_Write(YEAR_W,  Ds1302buf.year);
	lds R18,_timebuf+6
	ldi R16,140
	xcall _Ds1302buf_Write
	.dbline 145
;  Ds1302buf_Write(POWER_W, 0x16);
	ldi R18,22
	ldi R16,144
	xcall _Ds1302buf_Write
	.dbline 146
;  Ds1302buf_Write(WP_W,    0x80);
	ldi R18,128
	ldi R16,142
	xcall _Ds1302buf_Write
	.dbline 147
;  sei();
	sei
	.dbline -2
L37:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Set_time _Set_time fV
	.even
_Set_time::
	.dbline -1
	.dbline 158
; }  
; /****************************************************************************************************************************************
; *****************************************************************************************************************************************
; *************************************以上的部分很重要不可以轻易更改!*********************************************************************
; *****************************************************************************************************************************************
; ****************************************************************************************************************************************/
; /*********************************************************************************************************************************************
; 设置时间日期
; *********************************************************************************************************************************************/
; void Set_time(void)
; {
	.dbline 159
;  Ds1302buf.sec   = 0x10;
	ldi R24,16
	sts _timebuf,R24
	.dbline 160
;  Ds1302buf.min   = 0x34;
	ldi R24,52
	sts _timebuf+1,R24
	.dbline 161
;  Ds1302buf.hour  = 0x14;
	ldi R24,20
	sts _timebuf+2,R24
	.dbline 162
;  Ds1302buf.date  = 0x19;
	ldi R24,25
	sts _timebuf+3,R24
	.dbline 163
;  Ds1302buf.month = 0x10;
	ldi R24,16
	sts _timebuf+4,R24
	.dbline 164
;  Ds1302buf.week  = 0x04;
	ldi R24,4
	sts _timebuf+5,R24
	.dbline 165
;  Ds1302buf.year  = 0x06;
	ldi R24,6
	sts _timebuf+6,R24
	.dbline 166
;  Write_InfoDs1302buf();
	xcall _Write_InfoDs1302buf
	.dbline -2
L44:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Printf_time _Printf_time fV
	.even
_Printf_time::
	.dbline -1
	.dbline 172
; }           
; /*********************************************************************************************************************************************
; 打印时间日期到超级终端
; *********************************************************************************************************************************************/
; void Printf_time(void)
; { 
	.dbline -2
L51:
	.dbline 0 ; func end
	ret
	.dbend

⌨️ 快捷键说明

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