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

📄 rtc.s

📁 在AVR开发板驱动时钟芯片DS1302
💻 S
📖 第 1 页 / 共 4 页
字号:
	.module RTC.C
	.area text(rom, con, rel)
	.dbfile C:/icc/include/AVR_PQ1A.h
	.dbfunc e Delayus _Delayus fV
;              i -> R20,R21
;             US -> R22,R23
	.even
_Delayus::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 28
; /*******************************************
;   文件:RTC.C
;   环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
;   硬件:ATMEGA16芯片
;   日期:2006年12月10日 
;   功能:驱动开发板上的DS1302时钟芯片
;   备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
; /******************************************/
; #include <iom16v.h>			//包含型号头文件
; #include <macros.h>			//包含"位"操作头文件
; #include <stdio.h>			//标准输入输出头文件
; #include <AVR_PQ1A.h>		//包含自定义常量头文件
; #include "YJ1602.C"			//包含1602液晶函数文件
; #include "MKEY.C"			//包含矩阵键盘函数文件
; 
; /*******************************************
; 函数名称: DS1302_init
; 功    能: 初始化DS1302的数据接口
; 参    数: 无
; 返回值  : 无
; /********************************************/
; void DS1302_portinit(void)		  
; {
;  DDRB|=BIT(RTC_CLK)|BIT(RTC_DATA)|BIT(RTC_CS);//将时钟端(RTC_CLK)数据端(RTC_DATA)片选端(RTC_CS)设置为输出
; }
; /*******************************************
; 函数名称: DS1302_writeB
; 功    能: 向DS1302写入一个字节数据(没有RST操作)
	.dbline 30
; 参    数: byte--要写入的数据
; 返回值  : 无
	ldi R16,5
	ldi R17,0
	movw R18,R22
	xcall empy16s
	movw R22,R16
	lsr R23
	ror R22
	lsr R23
	ror R22
	.dbline 31
	clr R20
	clr R21
	xjmp L5
L2:
	.dbline 31
L3:
	.dbline 31
	subi R20,255  ; offset = 1
	sbci R21,255
L5:
	.dbline 31
; /********************************************/
	cp R20,R22
	cpc R21,R23
	brlo L2
	.dbline -2
	.dbline 32
; void DS1302_writeB(uchar byte)
L1:
	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 40
; {
;  uchar i;
;  for(i=0;i<8;i++)		 	  //8位数据计数
;  {
;   PORTB&=~BIT(RTC_CLK);		  //拉低时钟端
;   if(byte&0x01)				  //当前位是否是1
;   {
;    PORTB|=BIT(RTC_DATA);	  //当前位是1,拉高数据端
	.dbline 42
;   }
;   else						  
	clr R20
	clr R21
	xjmp L10
L7:
	.dbline 43
	clr R22
	clr R23
	xjmp L14
L11:
	.dbline 43
L12:
	.dbline 43
	subi R22,255  ; offset = 1
	sbci R23,255
L14:
	.dbline 43
	cpi R22,117
	ldi R30,4
	cpc R23,R30
	brlo L11
L8:
	.dbline 42
	subi R20,255  ; offset = 1
	sbci R21,255
L10:
	.dbline 42
	cp R20,R16
	cpc R21,R17
	brlo L7
	.dbline -2
	.dbline 44
;   {
;    PORTB&=~BIT(RTC_DATA);	  //当前位是0,拉低数据端
L6:
	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 Board_init _Board_init fV
	.even
_Board_init::
	.dbline -1
	.dbline 52
;   }  
;   Delayus(10);				  //调整时钟和脉冲宽度
;   PORTB|=BIT(RTC_CLK);		  //时钟上升沿(DS1302采样数据)
;   byte>>=1;					  //数据右移1位,为送出新数据位做准备
;  }
; }
; /*******************************************
; 函数名称: DS1302_readB
	.dbline 53
; 功    能: 从DS1302读出一个字节数据(没有RST操作)
	ldi R24,255
	out 0x1a,R24
	.dbline 54
; 参    数: 无
	out 0x17,R24
	.dbline 55
; 返回值  : byte--读出的数据
	out 0x14,R24
	.dbline 56
; /********************************************/
	out 0x11,R24
	.dbline 58
; uchar DS1302_readB(void)
; {
	clr R2
	out 0xd,R2
	.dbline 60
;  uchar i,byte=0;
;  DDRB&=~BIT(RTC_DATA);		 //将数据端口设置为输入		  
	sbi 0x1b,6
	.dbline 61
;  PORTB&=~BIT(RTC_DATA);		 //无上拉电阻
	cbi 0x15,6
	.dbline 62
;  for(i=0;i<8;i++)			 //8位数据计数
	cbi 0x1b,1
	.dbline 63
;  {
	out 0x18,R24
	.dbline 64
;   byte>>=1;  				 //保存读入的数据位
	sbi 0x1b,2
	.dbline 65
;   PORTB|=BIT(RTC_CLK);		 //时钟上升沿
	ldi R16,5
	ldi R17,0
	xcall _Delayus
	.dbline 66
;   Delayus(10);				 //延时,调整时钟脉冲宽度
	cbi 0x1b,2
	.dbline 68
;   PORTB&=~BIT(RTC_CLK);		 //时钟下降沿,DS1302输出数据位
;   Delayus(10);				 //等待数据变化(MEGA16太快,必须等待DS1302的数据位输出,否则不能正确读出)
	clr R2
	out 0x18,R2
	.dbline 69
;   if(PINB&BIT(RTC_DATA))	 //当前位是否是高电平
	sbi 0x1b,3
	.dbline 70
;   {
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 71
;    byte|=BIT(PB7);			 //是高电平就将返回数据的当前位置1
	cbi 0x1b,3
	.dbline 73
;   }
;   else
	ldi R24,255
	out 0x18,R24
	.dbline 74
;   {
	sbi 0x1b,4
	.dbline 75
;    byte&=~BIT(PB7);			 //是低电平就将返回数据的当前位置0
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 76
;   }
	cbi 0x1b,4
	.dbline 78
;  }
;  DDRB|=BIT(RTC_DATA);		 //最后将数据端口设置为输出
	ldi R24,255
	out 0x12,R24
	.dbline 79
;  return byte;				 //返回读出的数据
	sbi 0x1b,7
	.dbline 80
; }
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 81
; /*******************************************
	cbi 0x1b,7
	.dbline -2
	.dbline 84
; 函数名称: DS1302_writeD
; 功    能: 向DS1302的某个地址写入一个字节数据
; 参    数: addr--地址值(寄存器或RAM)
L15:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\17_RTC/YJ1602.C
	.dbfunc e LCD1602_portini _LCD1602_portini fV
	.even
_LCD1602_portini::
	.dbline -1
	.dbline 20
	.dbline 21
	in R24,0x11
	ori R24,112
	out 0x11,R24
	.dbline 22
	in R24,0x17
	ori R24,255
	out 0x17,R24
	.dbline -2
	.dbline 23
L16:
	.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 31
	.dbline 33
	tst R20
	brne L18
	.dbline 34
	cbi 0x12,4
	xjmp L19
L18:
	.dbline 36
	sbi 0x12,4
L19:
	.dbline 38
	sbi 0x12,5
	.dbline 39
	sbi 0x12,6
	.dbline 40
	clr R2
	out 0x17,R2
	.dbline 41
	in R20,0x16
	.dbline 42
	ldi R16,1
	ldi R17,0
	xcall _Delayms
	.dbline 43
	cbi 0x12,6
	.dbline 44
	in R24,0x17
	ori R24,255
	out 0x17,R24
	.dbline 45
	mov R16,R20
	.dbline -2
L17:
	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 55
	.dbline 56
	tst R22
	brne L21
	.dbline 57
	cbi 0x12,4
	xjmp L22
L21:
	.dbline 59
	sbi 0x12,4
L22:
	.dbline 61
	cbi 0x12,5
	.dbline 62
	sbi 0x12,6
	.dbline 63
	out 0x18,R20
	.dbline 64
	ldi R16,1
	ldi R17,0
	xcall _Delayms
	.dbline 65
	cbi 0x12,6
	.dbline -2
	.dbline 66
L20:
	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 74
	xjmp L25
L24:
	.dbline 76
	.dbline 77
	movw R30,R20
	ld R18,Z+
	movw R20,R30
	ldi R16,1
	xcall _LCD1602_sendbyte
	.dbline 78
L25:
	.dbline 75
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L24
	.dbline -2
	.dbline 79
L23:
	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 87
; 	  	  data--要写入的地址
; 返回值  : 无
; /********************************************/
	.dbline 88
; void DS1302_writeD(uchar addr,uchar data)
	ldi R18,1
	clr R16
	xcall _LCD1602_sendbyte
	.dbline 89
; {
	ldi R16,2
	ldi R17,0
	.dbline -2
	.dbline 90
;  PORTC&=~BIT(RTC_CS);	 //拉低片选端
L27:
	.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 98
;  PORTB&=~BIT(RTC_CLK);	 //拉低时钟端
;  Delayus(10);
;  PORTC|=BIT(RTC_CS);	 //拉高片选端
;  Delayus(10); 			 //调整片选脉冲
;  DS1302_writeB(addr);	 //写入操作命令(地址)
;  Delayus(10);
;  PORTB&=~BIT(RTC_CLK);	 //拉低时钟端
;  Delayus(10);
	.dbline 100
;  DS1302_writeB(data);	 //写入数据
;  PORTB&=~BIT(RTC_CLK);	 //拉低时钟端
	clr R16
	xcall _LCD1602_readbyte
	mov R20,R16
	.dbline 101
;  Delayus(10);			 //调整片选脉冲
	sbrs R16,7
	rjmp L29
	.dbline 102
;  PORTC&=~BIT(RTC_CS);	 //拉低片选端
	ldi R20,1
	xjmp L30
L29:
	.dbline 104
; }
; /*******************************************
	clr R20
L30:
	.dbline 105
; 函数名称: DS1302_readD
	mov R16,R20
	.dbline -2
L28:
	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 115
; 功    能: 从DS1302的某个地址读出一个字节数据
; 参    数: addr--地址值(寄存器或RAM)
; 返回值  : data--读出的数据
; /********************************************/
; uchar DS1302_readD(uchar addr)
; {
;  uchar data;
;  PORTC&=~BIT(RTC_CS);	 //拉低片选端
;  PORTB&=~BIT(RTC_CLK);	 //拉低时钟端
;  Delayus(10);
	.dbline 116
;  PORTC|=BIT(RTC_CS);	 //拉高片选端
	clr R23
	cpi R22,2
	ldi R30,0
	cpc R23,R30
	breq L35
	xjmp L32
X0:
	.dbline 117
;  Delayus(10); 			 //调整片选脉冲
L35:
	.dbline 119
;  DS1302_writeB(addr);	 //写入操作命令(地址)
;  Delayus(10);
	mov R18,R20
	subi R18,64    ; addi 192
	clr R16
	xcall _LCD1602_sendbyte
	.dbline 119
	xjmp L33
L32:
	.dbline 121
	mov R18,R20
	subi R18,128    ; addi 128
	clr R16
	xcall _LCD1602_sendbyte
	.dbline 121
L33:
	.dbline -2
	.dbline 123
;  data=DS1302_readB();	 //读出数据
;  Delayus(10);
;  PORTB&=~BIT(RTC_CLK);	 //拉低时钟端
;  PORTC&=~BIT(RTC_CS); 	 //拉低片选端
L31:
	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 131
;  return data;			 //返回读出的数据
; }
; /*******************************************
; 函数名称: DS1302_setT
; 功    能: 设置DS1302的时间
; 参    数: ptTimeD--设置时间数组指针
; 返回值  : 无
; /********************************************/
	.dbline 132
; void DS1302_setT(uchar ptTimeD[])
	ldi R16,100
	ldi R17,0
	xcall _Delayms
	.dbline 133
; {
	xcall _LCD1602_portini
	.dbline 135
;     uchar i;
;     uchar addr = 0x80; 			 	  //写入地址从秒寄存器开始
	ldi R18,56
	clr R16
	xcall _LCD1602_sendbyte
L37:
	.dbline 136
L38:
	.dbline 136
;     DS1302_writeD(C_WP|WR,UPROTECT); //控制命令,WP位为0,允许写操作
	xcall _LCD1602_readBF
	tst R16
	brne L37
	.dbline 137
; 	Delayms(5);
	ldi R18,12
	clr R16
	xcall _LCD1602_sendbyte
L40:
	.dbline 138
L41:
	.dbline 138
;     for(i=0;i<7;i++)
	xcall _LCD1602_readBF
	tst R16
	brne L40
	.dbline 139
;     {
	xcall _LCD1602_clear
L43:
	.dbline 140
L44:
	.dbline 140
;         DS1302_writeD(addr|WR,ptTimeD[i]);   // 秒 分 时 日 月 星期 年         
	xcall _LCD1602_readBF
	tst R16
	brne L43
	.dbline 141
;         addr+=2;
	ldi R18,6
	clr R16
	.dbline -2
	.dbline 142
; 		Delayms(1);
L36:
	.dbline 0 ; func end
	xjmp _LCD1602_sendbyte
	.dbend
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\17_RTC/MKEY.C
	.dbfunc e Mkey_press _Mkey_press fc
;        pressed -> R16
	.even
_Mkey_press::
	.dbline -1
	.dbline 20
	.dbline 22
	ldi R24,255
	out 0x11,R24
	.dbline 23
	ldi R24,240
	out 0x12,R24
	.dbline 24
	out 0x11,R24
	.dbline 25
	in R24,0x10
	cpi R24,240
	breq L47
	.dbline 26
	ldi R16,1
	xjmp L48
L47:
	.dbline 28
	clr R16
L48:
	.dbline 29
	ldi R24,255
	out 0x11,R24
	.dbline 30
	.dbline -2
L46:
	.dbline 0 ; func end
	ret
	.dbsym r pressed 16 c
	.dbend
	.dbfunc e Mkey_scan _Mkey_scan fc
;        keycode -> R20
;              i -> R10
	.even
_Mkey_scan::
	xcall push_gset3
	.dbline -1
	.dbline 39
	.dbline 40
	ldi R24,127
	mov R10,R24
	.dbline 40
	ldi R20,255
	.dbline 41
	ldi R16,15
	ldi R17,0
	xcall _Delayms
	.dbline 42
	xcall _Mkey_press
	cpi R16,1
	breq X2
	xjmp L50
X2:
	.dbline 43
L52:
	.dbline 45
	.dbline 46
	mov R2,R10
	lsr R2
	lsr R2
	lsr R2
	lsr R2
	lsr R2
	lsr R2
	lsr R2
	mov R3,R10
	lsl R3
	or R3,R2
	mov R10,R3
	.dbline 47
	ldi R24,15
	out 0x11,R24
	.dbline 48
	out 0x12,R3
	.dbline 49
	ldi R16,1
	ldi R17,0
	xcall _Delayms
	.dbline 50
	in R20,0x10
	.dbline 51
L53:
	.dbline 51
	mov R24,R20
	andi R24,240
	cpi R24,240
	breq L52
L55:
	.dbline 53
	.dbline 54
L56:
	.dbline 54
	xcall _Mkey_press
	cpi R16,1
	breq L55
	.dbline 55
	ldi R16,15
	ldi R17,0
	xcall _Delayms
	.dbline 56
	mov R22,R20
	clr R23
	cpi R22,183
	ldi R30,0
	cpc R23,R30
	brne X3
	xjmp L75
X3:
	cpi R22,187
	ldi R30,0
	cpc R23,R30
	brne X4
	xjmp L71
X4:
	cpi R22,189
	ldi R30,0
	cpc R23,R30
	brne X5
	xjmp L67
X5:
	cpi R22,190
	ldi R30,0
	cpc R23,R30
	brne X6
	xjmp L63
X6:
	ldi R24,190
	ldi R25,0
	cp R24,R22
	cpc R25,R23
	brlt L78
L77:
	cpi R22,119
	ldi R30,0
	cpc R23,R30
	brne X7
	xjmp L76
X7:
	cpi R22,123
	ldi R30,0
	cpc R23,R30
	brne X8
	xjmp L72
X8:
	cpi R22,125
	ldi R30,0
	cpc R23,R30
	brne X9
	xjmp L68
X9:
	cpi R22,126
	ldi R30,0
	cpc R23,R30
	breq L64
	xjmp L58
L78:
	cpi R22,215
	ldi R30,0
	cpc R23,R30
	brne X10
	xjmp L74
X10:
	cpi R22,219
	ldi R30,0
	cpc R23,R30
	breq L70
	cpi R22,221
	ldi R30,0
	cpc R23,R30
	breq L66
	cpi R22,222
	ldi R30,0
	cpc R23,R30
	breq L62
	cpi R22,215
	ldi R30,0
	cpc R23,R30
	brge X11
	xjmp L58
X11:
L79:
	cpi R22,231
	ldi R30,0
	cpc R23,R30
	breq L73
	cpi R22,235
	ldi R30,0
	cpc R23,R30
	breq L69
	cpi R22,237
	ldi R30,0
	cpc R23,R30
	breq L65
	cpi R22,238
	ldi R30,0
	cpc R23,R30
	breq L61
	xjmp L58
X1:
	.dbline 57
L61:
	.dbline 59
	clr R20
	.dbline 60
	xjmp L59
L62:
	.dbline 62
	ldi R20,1
	.dbline 63
	xjmp L59
L63:
	.dbline 65
	ldi R20,2
	.dbline 66
	xjmp L59
L64:
	.dbline 68
	ldi R20,3
	.dbline 69
	xjmp L59
L65:
	.dbline 71

⌨️ 快捷键说明

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