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

📄 ds1302.s

📁 AVR单片机C语言编程及应用实例 适合初学者的学习研究 其中包含Atmega16中文资料及Protel部分电路图
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module ds1302.c
	.area text(rom, con, rel)
	.dbfile I:\AVR视频教程\视频教程\lesson11\ds1302\ds1302/YJ1602.C
	.dbfunc e LCD1602_portini _LCD1602_portini fV
	.even
_LCD1602_portini::
	.dbline -1
	.dbline 50
; #include <iom16v.h>			//包含型号头文件
; #include <macros.h>			//包含"位"操作头文件
; #define uchar unsigned char
; #define uint unsigned int
; 
; #define TRUE 1
; #define FALSE 0
; #include "YJ1602.C"			//包含1602液晶函数文件
; 
; /******************RTC常量******************/
; #define RTC_CLK   	PB7
; #define RTC_DATA  	PB5
; #define RTC_CS    	PC7
; 	//命令
; #define RD	  	0x01
; #define WR	  	0x00
; #define C_SEC		0x80	//秒
; #define C_MIN		0x82	//分
; #define C_HR		0x84	//时
; #define C_DAY		0x86	//日
; #define C_MTH		0x88	//月
; #define C_WK		0x8A	//星期 DATE
; #define C_YR		0x8C	//年
; #define C_WP		0x8E	//控制(写保护)
; #define C_CHARGE	0x90	//涓流充电
; #define C_BURST		0xBE	//时钟多字节
; 	//配置
; #define CLK_HALT		0x80	//停止时钟控制位    SECOND	bit7
; #define CLK_START		0x00	//启动时钟
; #define M12_24			0x80	//12/24小时值选择位 HOUR		bit7 
; #define PROTECT			0x80	//写保护控制位      CONTROL	bit7 
; #define UPROTECT		0x00	//写保护控制位      CONTROL	bit7 
; 	//涓流充电控制常量
; #define TC_D1R2			0xA5	//high 1 Diode +2K Resistors  
; #define TC_D2R8			0xAB	//low  2 Diodes+8K Resistors  
; #define TC_DISABLED		0x00	//Disabled(TCS<>1010 or DS=00 or RS=00)
; 	//RAM 命令
; #define C_RAMBASE		0xC0	//RAM0~RAM30<<1 地址需左移一位 
; 
; void Delayus(uint US)		  
; {
;  uint i;
;  US=US*5/4;		  	 //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
;  for( i=0;i<US;i++); 
; }
; void Delayms(uint MS)		  
; {
;  uint i,j;
;  for( i=0;i<MS;i++)
;  for(j=0;j<1141;j++);	//1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
	.dbline 51
; }
	in R24,0x11
	ori R24,112
	out 0x11,R24
	.dbline 52
; 
	in R24,0x17
	ori R24,255
	out 0x17,R24
	.dbline -2
	.dbline 53
; 
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD1602_readbyte _LCD1602_readbyte fc
;          dByte -> R20
;         DatCmd -> R20
	.even
_LCD1602_readbyte::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 61
; 
; /*******************************************
; 函数名称: DS1302_init
; 功    能: 初始化DS1302的数据接口
; 参    数: 无
; 返回值  : 无
; /********************************************/
; void DS1302_portinit(void)		  
	.dbline 63
; {
;  DDRB|=BIT(RTC_CLK)|BIT(RTC_DATA)|BIT(RTC_CS);//将时钟端(RTC_CLK)数据端(RTC_DATA)片选端(RTC_CS)设置为输出
	tst R20
	brne L3
	.dbline 64
; }
	cbi 0x12,4
	xjmp L4
L3:
	.dbline 66
; /*******************************************
; 函数名称: DS1302_writeB
	sbi 0x12,4
L4:
	.dbline 68
; 功    能: 向DS1302写入一个字节数据(没有RST操作)
; 参    数: byte--要写入的数据
	sbi 0x12,5
	.dbline 69
; 返回值  : 无
	sbi 0x12,6
	.dbline 70
; /********************************************/
	clr R2
	out 0x17,R2
	.dbline 71
; void DS1302_writeB(uchar byte)
	in R20,0x16
	.dbline 72
; {
	ldi R16,1
	ldi R17,0
	xcall _Delayms
	.dbline 73
;  uchar i;
	cbi 0x12,6
	.dbline 74
;  for(i=0;i<8;i++)		 	  //8位数据计数
	in R24,0x17
	ori R24,255
	out 0x17,R24
	.dbline 75
;  {
	mov R16,R20
	.dbline -2
L2:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r dByte 20 c
	.dbsym r DatCmd 20 c
	.dbend
	.dbfunc e LCD1602_sendbyte _LCD1602_sendbyte fV
;          dByte -> R20
;         DatCmd -> R22
	.even
_LCD1602_sendbyte::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 85
;   PORTB&=~BIT(RTC_CLK);		  //拉低时钟端
;   if(byte&0x01)				  //当前位是否是1
;   {
;    PORTB|=BIT(RTC_DATA);	  //当前位是1,拉高数据端
;   }
;   else						  
;   {
;    PORTB&=~BIT(RTC_DATA);	  //当前位是0,拉低数据端
;   }  
;   Delayus(10);				  //调整时钟和脉冲宽度
	.dbline 86
;   PORTB|=BIT(RTC_CLK);		  //时钟上升沿(DS1302采样数据)
	tst R22
	brne L6
	.dbline 87
;   byte>>=1;					  //数据右移1位,为送出新数据位做准备
	cbi 0x12,4
	xjmp L7
L6:
	.dbline 89
;  }
; }
	sbi 0x12,4
L7:
	.dbline 91
; /*******************************************
; 函数名称: DS1302_readB
	cbi 0x12,5
	.dbline 92
; 功    能: 从DS1302读出一个字节数据(没有RST操作)
	sbi 0x12,6
	.dbline 93
; 参    数: 无
	out 0x18,R20
	.dbline 94
; 返回值  : byte--读出的数据
	ldi R16,1
	ldi R17,0
	xcall _Delayms
	.dbline 95
; /********************************************/
	cbi 0x12,6
	.dbline -2
	.dbline 96
; uchar DS1302_readB(void)
L5:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r dByte 20 c
	.dbsym r DatCmd 22 c
	.dbend
	.dbfunc e LCD1602_sendstr _LCD1602_sendstr fV
;       ptString -> R20,R21
	.even
_LCD1602_sendstr::
	xcall push_gset1
	movw R20,R16
	.dbline -1
	.dbline 104
; {
;  uchar i,byte=0;
;  DDRB&=~BIT(RTC_DATA);		 //将数据端口设置为输入		  
;  PORTB&=~BIT(RTC_DATA);		 //无上拉电阻
;  for(i=0;i<8;i++)			 //8位数据计数
;  {
;   byte>>=1;  				 //保存读入的数据位
;   PORTB|=BIT(RTC_CLK);		 //时钟上升沿
	xjmp L10
L9:
	.dbline 106
	.dbline 107
	movw R30,R20
	ld R18,Z+
	movw R20,R30
	ldi R16,1
	xcall _LCD1602_sendbyte
	.dbline 108
L10:
	.dbline 105
;   Delayus(10);				 //延时,调整时钟脉冲宽度
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L9
	.dbline -2
	.dbline 109
;   PORTB&=~BIT(RTC_CLK);		 //时钟下降沿,DS1302输出数据位
;   Delayus(10);				 //等待数据变化(MEGA16太快,必须等待DS1302的数据位输出,否则不能正确读出)
;   if(PINB&BIT(RTC_DATA))	 //当前位是否是高电平
;   {
L8:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r ptString 20 pc
	.dbend
	.dbfunc e LCD1602_clear _LCD1602_clear fV
	.even
_LCD1602_clear::
	.dbline -1
	.dbline 117
;    byte|=BIT(PB7);			 //是高电平就将返回数据的当前位置1
;   }
;   else
;   {
;    byte&=~BIT(PB7);			 //是低电平就将返回数据的当前位置0
;   }
;  }
;  DDRB|=BIT(RTC_DATA);		 //最后将数据端口设置为输出
	.dbline 118
;  return byte;				 //返回读出的数据
	ldi R18,1
	clr R16
	xcall _LCD1602_sendbyte
	.dbline 119
; }
	ldi R16,2
	ldi R17,0
	.dbline -2
	.dbline 120
; /*******************************************
L12:
	.dbline 0 ; func end
	xjmp _Delayms
	.dbend
	.dbfunc e LCD1602_readBF _LCD1602_readBF fc
;           busy -> R20
	.even
_LCD1602_readBF::
	xcall push_gset1
	.dbline -1
	.dbline 128
; 函数名称: DS1302_writeD
; 功    能: 向DS1302的某个地址写入一个字节数据
; 参    数: addr--地址值(寄存器或RAM)
; 	  	  data--要写入的地址
; 返回值  : 无
; /********************************************/
; void DS1302_writeD(uchar addr,uchar data)
; {
	.dbline 130
;  PORTC&=~BIT(RTC_CS);	 //拉低片选端
;  PORTB&=~BIT(RTC_CLK);	 //拉低时钟端
	clr R16
	xcall _LCD1602_readbyte
	mov R20,R16
	.dbline 131
;  Delayus(10);
	sbrs R16,7
	rjmp L14
	.dbline 132
;  PORTC|=BIT(RTC_CS);	 //拉高片选端
	ldi R20,1
	xjmp L15
L14:
	.dbline 134
;  Delayus(10); 			 //调整片选脉冲
;  DS1302_writeB(addr);	 //写入操作命令(地址)
	clr R20
L15:
	.dbline 135
;  Delayus(10);
	mov R16,R20
	.dbline -2
L13:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r busy 20 c
	.dbend
	.dbfunc e LCD1602_gotoXY _LCD1602_gotoXY fV
;            Col -> R20
;            Row -> R22
	.even
_LCD1602_gotoXY::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 145
;  PORTB&=~BIT(RTC_CLK);	 //拉低时钟端
;  Delayus(10);
;  DS1302_writeB(data);	 //写入数据
;  PORTB&=~BIT(RTC_CLK);	 //拉低时钟端
;  Delayus(10);			 //调整片选脉冲
;  PORTC&=~BIT(RTC_CS);	 //拉低片选端
; }
; /*******************************************
; 函数名称: DS1302_readD
; 功    能: 从DS1302的某个地址读出一个字节数据
	.dbline 146
; 参    数: addr--地址值(寄存器或RAM)
	clr R23
	cpi R22,2
	ldi R30,0
	cpc R23,R30
	breq L20
	xjmp L17
X0:
	.dbline 147
; 返回值  : data--读出的数据
L20:
	.dbline 149
; /********************************************/
; uchar DS1302_readD(uchar addr)
	mov R18,R20
	subi R18,64    ; addi 192
	clr R16
	xcall _LCD1602_sendbyte
	.dbline 149
	xjmp L18
L17:
	.dbline 151
	mov R18,R20
	subi R18,128    ; addi 128
	clr R16
	xcall _LCD1602_sendbyte
	.dbline 151
L18:
	.dbline -2
	.dbline 153
; {
;  uchar data;
;  PORTC&=~BIT(RTC_CS);	 //拉低片选端
;  PORTB&=~BIT(RTC_CLK);	 //拉低时钟端
L16:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r Col 20 c
	.dbsym r Row 22 c
	.dbend
	.dbfunc e LCD1602_initial _LCD1602_initial fV
	.even
_LCD1602_initial::
	.dbline -1
	.dbline 161
;  Delayus(10);
;  PORTC|=BIT(RTC_CS);	 //拉高片选端
;  Delayus(10); 			 //调整片选脉冲
;  DS1302_writeB(addr);	 //写入操作命令(地址)
;  Delayus(10);
;  data=DS1302_readB();	 //读出数据
;  Delayus(10);
;  PORTB&=~BIT(RTC_CLK);	 //拉低时钟端
	.dbline 162
;  PORTC&=~BIT(RTC_CS); 	 //拉低片选端
	ldi R16,100
	ldi R17,0
	xcall _Delayms
	.dbline 163
;  return data;			 //返回读出的数据
	xcall _LCD1602_portini
	.dbline 165
; }
; /*******************************************
	ldi R18,56
	clr R16
	xcall _LCD1602_sendbyte
L22:
	.dbline 166
L23:
	.dbline 166
; 函数名称: DS1302_setT
	xcall _LCD1602_readBF
	tst R16
	brne L22
	.dbline 167
; 功    能: 设置DS1302的时间
	ldi R18,12
	clr R16
	xcall _LCD1602_sendbyte
L25:
	.dbline 168
L26:
	.dbline 168
; 参    数: ptTimeD--设置时间数组指针
	xcall _LCD1602_readBF
	tst R16
	brne L25
	.dbline 169
; 返回值  : 无
	xcall _LCD1602_clear
L28:
	.dbline 170
L29:
	.dbline 170
; /********************************************/
	xcall _LCD1602_readBF
	tst R16
	brne L28
	.dbline 171
; void DS1302_setT(uchar ptTimeD[])
	ldi R18,6
	clr R16
	.dbline -2
	.dbline 172
; {
L21:
	.dbline 0 ; func end
	xjmp _LCD1602_sendbyte
	.dbend
	.dbfile I:\AVR视频教程\视频教程\lesson11\ds1302\ds1302\ds1302.c
	.dbfunc e Delayus _Delayus fV
;              i -> R20,R21
;             US -> R22,R23
	.even
_Delayus::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 41
	.dbline 43
	ldi R16,5
	ldi R17,0
	movw R18,R22
	xcall empy16s
	movw R22,R16
	lsr R23
	ror R22
	lsr R23
	ror R22
	.dbline 44
	clr R20
	clr R21
	xjmp L35
L32:
	.dbline 44
L33:
	.dbline 44
	subi R20,255  ; offset = 1
	sbci R21,255
L35:
	.dbline 44
	cp R20,R22
	cpc R21,R23
	brlo L32
	.dbline -2
	.dbline 45
L31:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r US 22 i
	.dbend
	.dbfunc e Delayms _Delayms fV
;              i -> R20,R21
;              j -> R22,R23
;             MS -> R16,R17
	.even
_Delayms::
	xcall push_gset2
	.dbline -1
	.dbline 47
	.dbline 49
	clr R20
	clr R21
	xjmp L40
L37:
	.dbline 50
	clr R22
	clr R23
	xjmp L44
L41:
	.dbline 50
L42:
	.dbline 50
	subi R22,255  ; offset = 1
	sbci R23,255
L44:
	.dbline 50
	cpi R22,117
	ldi R30,4
	cpc R23,R30
	brlo L41
L38:
	.dbline 49
	subi R20,255  ; offset = 1
	sbci R21,255
L40:
	.dbline 49
	cp R20,R16
	cpc R21,R17
	brlo L37
	.dbline -2
	.dbline 51
L36:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r j 22 i
	.dbsym r MS 16 i
	.dbend
	.dbfunc e DS1302_portinit _DS1302_portinit fV
	.even
_DS1302_portinit::
	.dbline -1
	.dbline 62
	.dbline 63
	in R24,0x17
	ori R24,160
	out 0x17,R24
	.dbline -2
	.dbline 64
L45:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e DS1302_writeB _DS1302_writeB fV
;              i -> R20
;           byte -> R22
	.even
_DS1302_writeB::
	xcall push_gset2
	mov R22,R16
	.dbline -1
	.dbline 72
	.dbline 74
	clr R20
	xjmp L50
L47:
	.dbline 75
	.dbline 76
	cbi 0x18,7
	.dbline 77
	sbrs R22,0
	rjmp L51
	.dbline 78
	.dbline 79
	sbi 0x18,5
	.dbline 80
	xjmp L52
L51:
	.dbline 82
	.dbline 83
	cbi 0x18,5
	.dbline 84
L52:
	.dbline 85
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 86
	sbi 0x18,7
	.dbline 87
	lsr R22
	.dbline 88
L48:
	.dbline 74
	inc R20
L50:
	.dbline 74
	cpi R20,8
	brlo L47
	.dbline -2
	.dbline 89
L46:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r byte 22 c
	.dbend
	.dbfunc e DS1302_readB _DS1302_readB fc
;              i -> R20
;           byte -> R22
	.even
_DS1302_readB::
	xcall push_gset2
	.dbline -1
	.dbline 97
	.dbline 98
	clr R22
	.dbline 99
	cbi 0x17,5
	.dbline 100
	cbi 0x18,5
	.dbline 101
	clr R20
	xjmp L57
L54:
	.dbline 102
	.dbline 103
	lsr R22
	.dbline 104
	sbi 0x18,7
	.dbline 105
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 106
	cbi 0x18,7
	.dbline 107
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 108
	sbis 0x16,5
	rjmp L58
	.dbline 109
	.dbline 110
	ori R22,128
	.dbline 111
	xjmp L59
L58:
	.dbline 113
	.dbline 114
	andi R22,127
	.dbline 115
L59:
	.dbline 116
L55:
	.dbline 101
	inc R20
L57:
	.dbline 101
	cpi R20,8
	brlo L54
	.dbline 117
	sbi 0x17,5
	.dbline 118
	mov R16,R22
	.dbline -2
L53:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r byte 22 c
	.dbend
	.dbfunc e DS1302_writeD _DS1302_writeD fV
;           data -> R20
;           addr -> R22
	.even
_DS1302_writeD::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 128
	.dbline 129
	cbi 0x15,7
	.dbline 130
	cbi 0x18,7
	.dbline 131
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 132
	sbi 0x15,7
	.dbline 133
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 134
	mov R16,R22
	xcall _DS1302_writeB
	.dbline 135
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 136
	cbi 0x18,7
	.dbline 137
	ldi R16,10
	ldi R17,0
	xcall _Delayus

⌨️ 快捷键说明

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