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

📄 rtc.s

📁 在AVR开发板驱动时钟芯片DS1302
💻 S
📖 第 1 页 / 共 4 页
字号:
	ldi R20,4
	.dbline 72
	xjmp L59
L66:
	.dbline 74
	ldi R20,5
	.dbline 75
	xjmp L59
L67:
	.dbline 77
	ldi R20,6
	.dbline 78
	xjmp L59
L68:
	.dbline 80
	ldi R20,7
	.dbline 81
	xjmp L59
L69:
	.dbline 83
	ldi R20,8
	.dbline 84
	xjmp L59
L70:
	.dbline 86
	ldi R20,9
	.dbline 87
	xjmp L59
L71:
	.dbline 89
	ldi R20,10
	.dbline 90
	xjmp L59
L72:
	.dbline 92
	ldi R20,11
	.dbline 93
	xjmp L59
L73:
	.dbline 95
	ldi R20,12
	.dbline 96
	xjmp L59
L74:
	.dbline 98
	ldi R20,13
	.dbline 99
	xjmp L59
L75:
	.dbline 101
	ldi R20,14
	.dbline 102
	xjmp L59
L76:
	.dbline 104
	ldi R20,15
	.dbline 105
L58:
L59:
	.dbline 107
L50:
	.dbline 108
	mov R16,R20
	.dbline -2
L49:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r keycode 20 c
	.dbsym r i 10 c
	.dbend
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\17_RTC\RTC.C
	.dbfunc e DS1302_portinit _DS1302_portinit fV
	.even
_DS1302_portinit::
	.dbline -1
	.dbline 23
	.dbline 24
	in R24,0x17
	ori R24,160
	out 0x17,R24
	.dbline -2
	.dbline 25
L80:
	.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 33
	.dbline 35
	clr R20
	xjmp L85
L82:
	.dbline 36
	.dbline 37
	cbi 0x18,7
	.dbline 38
	sbrs R22,0
	rjmp L86
	.dbline 39
	.dbline 40
	sbi 0x18,5
	.dbline 41
	xjmp L87
L86:
	.dbline 43
	.dbline 44
	cbi 0x18,5
	.dbline 45
L87:
	.dbline 46
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 47
	sbi 0x18,7
	.dbline 48
	lsr R22
	.dbline 49
L83:
	.dbline 35
	inc R20
L85:
	.dbline 35
	cpi R20,8
	brlo L82
	.dbline -2
	.dbline 50
L81:
	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 58
	.dbline 59
	clr R22
	.dbline 60
	cbi 0x17,5
	.dbline 61
	cbi 0x18,5
	.dbline 62
	clr R20
	xjmp L92
L89:
	.dbline 63
	.dbline 64
	lsr R22
	.dbline 65
	sbi 0x18,7
	.dbline 66
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 67
	cbi 0x18,7
	.dbline 68
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 69
	sbis 0x16,5
	rjmp L93
	.dbline 70
	.dbline 71
	ori R22,128
	.dbline 72
	xjmp L94
L93:
	.dbline 74
	.dbline 75
	andi R22,127
	.dbline 76
L94:
	.dbline 77
L90:
	.dbline 62
	inc R20
L92:
	.dbline 62
	cpi R20,8
	brlo L89
	.dbline 78
	sbi 0x17,5
	.dbline 79
	mov R16,R22
	.dbline -2
L88:
	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 89
	.dbline 90
	cbi 0x15,7
	.dbline 91
	cbi 0x18,7
	.dbline 92
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 93
	sbi 0x15,7
	.dbline 94
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 95
	mov R16,R22
	xcall _DS1302_writeB
	.dbline 96
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 97
	cbi 0x18,7
	.dbline 98
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 99
	mov R16,R20
	xcall _DS1302_writeB
	.dbline 100
	cbi 0x18,7
	.dbline 101
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 102
	cbi 0x15,7
	.dbline -2
	.dbline 103
L95:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r data 20 c
	.dbsym r addr 22 c
	.dbend
	.dbfunc e DS1302_readD _DS1302_readD fc
;           data -> R20
;           addr -> R20
	.even
_DS1302_readD::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 111
	.dbline 113
	cbi 0x15,7
	.dbline 114
	cbi 0x18,7
	.dbline 115
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 116
	sbi 0x15,7
	.dbline 117
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 118
	mov R16,R20
	xcall _DS1302_writeB
	.dbline 119
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 120
	xcall _DS1302_readB
	mov R20,R16
	.dbline 121
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 122
	cbi 0x18,7
	.dbline 123
	cbi 0x15,7
	.dbline 124
	mov R16,R20
	.dbline -2
L96:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r data 20 c
	.dbsym r addr 20 c
	.dbend
	.dbfunc e DS1302_setT _DS1302_setT fV
;           addr -> R20
;              i -> R22
;        ptTimeD -> R10,R11
	.even
_DS1302_setT::
	xcall push_gset3
	movw R10,R16
	.dbline -1
	.dbline 133
	.dbline 135
	ldi R20,128
	.dbline 136
	clr R18
	ldi R16,142
	xcall _DS1302_writeD
	.dbline 137
	ldi R16,5
	ldi R17,0
	xcall _Delayms
	.dbline 138
	clr R22
	xjmp L101
L98:
	.dbline 139
	.dbline 140
	mov R30,R22
	clr R31
	add R30,R10
	adc R31,R11
	ldd R18,z+0
	mov R16,R20
	xcall _DS1302_writeD
	.dbline 141
	subi R20,254    ; addi 2
	.dbline 142
	ldi R16,1
	ldi R17,0
	xcall _Delayms
	.dbline 143
L99:
	.dbline 138
	inc R22
L101:
	.dbline 138
	cpi R22,7
	brlo L98
	.dbline 144
;     }
;     DS1302_writeD(C_WP|WR,PROTECT); 		//控制命令,WP位为1,不允许写操作
	ldi R18,128
	ldi R16,142
	xcall _DS1302_writeD
	.dbline -2
	.dbline 145
; }
L97:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r addr 20 c
	.dbsym r i 22 c
	.dbsym r ptTimeD 10 pc
	.dbend
	.dbfunc e DS1302_getT _DS1302_getT fV
;           addr -> R20
;              i -> R22
;           time -> R10,R11
	.even
_DS1302_getT::
	xcall push_gset3
	movw R10,R16
	.dbline -1
	.dbline 153
; /*******************************************
; 函数名称: DS1302_getT
; 功    能: 读取DS1302的当前时间
; 参    数: time[]--读取的时间数组
; 返回值  : 无
; /********************************************/
; void DS1302_getT(uchar time[])
; {
	.dbline 155
;     uchar i;
;     uchar addr = 0x80; 			 	  		  //读取地址从秒寄存器开始 
	ldi R20,128
	.dbline 156
;     for(i=0;i<7;i++)
	clr R22
	xjmp L106
L103:
	.dbline 157
	.dbline 158
	mov R16,R20
	ori R16,1
	xcall _DS1302_readD
	mov R30,R22
	clr R31
	add R30,R10
	adc R31,R11
	std z+0,R16
	.dbline 159
	subi R20,254    ; addi 2
	.dbline 160
L104:
	.dbline 156
	inc R22
L106:
	.dbline 156
	cpi R22,7
	brlo L103
	.dbline 161
;     {
;         time[i]=DS1302_readD(addr|RD);    // 秒 分 时 日 月 星期 年        
;         addr+=2;
;     }
;     PORTB&=~BIT(RTC_CLK);	 				  //拉低时钟端(时钟端在不操作时为低)
	cbi 0x18,7
	.dbline -2
	.dbline 162
; }
L102:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r addr 20 c
	.dbsym r i 22 c
	.dbsym r time 10 pc
	.dbend
	.dbfunc e DS1302_check _DS1302_check fc
;          exist -> R20
	.even
_DS1302_check::
	xcall push_gset1
	.dbline -1
	.dbline 170
; /*******************************************
; 函数名称: DS1302_check
; 功    能: 检测DS1302是否正常工作
; 参    数: 无
; 返回值  : exist--为TRUE为检测到DS1302,为FALSE为没检测到
; /********************************************/
; uchar DS1302_check(void)
; {
	.dbline 172
; 	uchar exist;
;     DS1302_writeD(C_WP|WR,UPROTECT);		  //写入写允许命令
	clr R18
	ldi R16,142
	xcall _DS1302_writeD
	.dbline 173
;     DS1302_writeD(C_RAMBASE|WR,0xA5);		  //RAM0写入0xA5
	ldi R18,165
	ldi R16,192
	xcall _DS1302_writeD
	.dbline 174
;     exist=DS1302_readD(C_RAMBASE|RD);		  //读取RAM0
	ldi R16,193
	xcall _DS1302_readD
	mov R20,R16
	.dbline 175
;     if(exist==0xA5)	
	cpi R16,165
	brne L108
	.dbline 176
; 	{
	.dbline 177
; 	 exist=TRUE;							  //如果读取值与写入值相等,返回TRUE
	ldi R20,1
	.dbline 178
; 	}
	xjmp L109
L108:
	.dbline 180
;     else 	
; 	{
	.dbline 181
; 	 exist=FALSE;							  //如果读取值与写入值不相等,返回FALSE
	clr R20
	.dbline 182
; 	}	
L109:
	.dbline 183
; 	return exist;
	mov R16,R20
	.dbline -2
L107:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r exist 20 c
	.dbend
	.dbfunc e DS1302_init _DS1302_init fV
	.even
_DS1302_init::
	.dbline -1
	.dbline 192
; }
; /*******************************************
; 函数名称: DS1302_init
; 功    能: 初始化DS1302
; 参    数: 无
; 返回值  : 无
; /********************************************/
; void DS1302_init(void)
; {
	.dbline 193
;  DS1302_writeD(C_WP|WR,UPROTECT);		  //写入写允许命令
	clr R18
	ldi R16,142
	xcall _DS1302_writeD
	.dbline 194
;  DS1302_writeD(C_SEC|WR,CLK_START);		//启动振荡器,DS1302开始工作
	clr R18
	ldi R16,128
	xcall _DS1302_writeD
	.dbline 195
;  DS1302_writeD(C_WP|WR,PROTECT); 		//控制命令,WP位为1,不允许写操作	  
	ldi R18,128
	ldi R16,142
	.dbline -2
	.dbline 196
; }
L110:
	.dbline 0 ; func end
	xjmp _DS1302_writeD
	.dbend
	.dbfunc e BCD_ASCII _BCD_ASCII fV
;          ptasc -> R20,R21
;            BCD -> R22
	.even
_BCD_ASCII::
	xcall push_gset2
	movw R20,R18
	mov R22,R16
	.dbline -1
	.dbline 205
; /*******************************************
; 函数名称: BCD_ASCII
; 功    能: 将压缩BCD码转换成ascii码
; 参    数: BCD--将要转换的压缩BCD码
; 	  	  ptasc--转换后的ASCII码数组指针
; 返回值  : 无
; /********************************************/
; void BCD_ASCII(uchar BCD,uchar *ptasc)
; { 	
	.dbline 206
; 	*ptasc=BCD/16|0x30;		   //转换十位
	ldi R17,16
	mov R16,R22
	xcall div8u
	mov R24,R16
	ori R24,48
	movw R30,R20
	std z+0,R24
	.dbline 207
; 	*(ptasc+1)=BCD&0x0F|0x30;  //转换个位
	mov R24,R22
	andi R24,15
	ori R24,48
	std z+1,R24
	.dbline -2
	.dbline 208
; }
L111:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r ptasc 20 pc
	.dbsym r BCD 22 c
	.dbend
	.area lit(rom, con, rel)
L113:
	.byte 0,0
	.byte 45,0
	.byte 0,45
	.byte 0,0
	.byte 32,0
	.byte 0
L114:
	.byte 0,0
	.byte 58,0
	.byte 0,58
	.byte 0,0
	.byte 0
	.area text(rom, con, rel)
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\17_RTC\RTC.C
	.dbfunc e Disp_time _Disp_time fV
;          line1 -> y+11
;          line2 -> y+2
;            asc -> y+0
;              i -> R20
;           time -> R22,R23
	.even
_Disp_time::
	xcall push_gset2
	movw R22,R16
	sbiw R28,22
	.dbline -1
	.dbline 216
; /*******************************************
; 函数名称: Disp_time
; 功    能: 在1602液晶上显示当前时间(第1行格式:年-月-日 星期;第2行格式:时-分-秒)
; 参    数: time[]--时间数组
; 返回值  : 无
; /********************************************/
; void Disp_time(uchar time[])
; {
	.dbline 218
;  uchar i,asc[2];
;  uchar line1[11]={0,0,'-',0,0,'-',0,0,' ',0,'\0'};//显示第1行的字符数组
	ldi R24,<L113
	ldi R25,>L113
	movw R30,R28
	adiw R30,11
	ldi R16,11
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	xcall asgncblk
	.dbline 219
;  uchar line2[9]={0,0,':',0,0,':',0,0,'\0'};		  //显示第2行的字符数组
	ldi R24,<L114
	ldi R25,>L114
	movw R30,R28
	adiw R30,2
	ldi R16,9
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	xcall asgncblk
	.dbline 220
;  for(i=0;i<3;i++)								  //为第2行的字符数组赋值
	clr R20
	xjmp L118
L115:
	.dbline 221
	.dbline 222
	movw R18,R28
	mov R2,R20
	clr R3
	ldi R30,2
	ldi R31,0
	sub R30,R2
	sbc R31,R3
	add R30,R22
	adc R31,R23
	ldd R16,z+0
	xcall _BCD_ASCII
	.dbline 223
	ldi R24,3
	mul R24,R20
	movw R30,R0
	movw R24,R28
	adiw R24,2
	add R30,R24
	adc R31,R25
	ldd R24,y+0
	andi R24,127
	std z+0,R24
	.dbline 224
	ldi R24,3
	mul R24,R20
	movw R30,R0
	movw R24,R28
	adiw R24,3
	add R30,R24
	adc R31,R25
	ldd R2,y+1
	std z+0,R2
	.dbline 225
L116:
	.dbline 220
	inc R20
L118:
	.dbline 220
	cpi R20,3
	brlo L115
	.dbline 226
;  {
;   BCD_ASCII(time[2-i],asc);
;   line2[i*3]=asc[0]&0x7F;
;   line2[i*3+1]=asc[1];
;  } 
;  BCD_ASCII(time[6],asc);   						  //为第1行的年赋值
	movw R18,R28
	movw R30,R22
	ldd R16,z+6
	xcall _BCD_ASCII
	.dbline 227
;  line1[0]=asc[0];
	ldd R2,y+0
	std y+11,R2
	.dbline 228
;  line1[1]=asc[1];
	ldd R2,y+1
	std y+12,R2
	.dbline 229
;  BCD_ASCII(time[4],asc);						  //为第1行的月赋值
	movw R18,R28
	movw R30,R22
	ldd R16,z+4
	xcall _BCD_ASCII
	.dbline 230
;  line1[3]=asc[0];
	ldd R2,y+0
	std y+14,R2
	.dbline 231
;  line1[4]=asc[1];
	ldd R2,y+1
	std y+15,R2
	.dbline 232
;  BCD_ASCII(time[3],asc);						  //为第1行的日赋值
	movw R18,R28
	movw R30,R22
	ldd R16,z+3
	xcall _BCD_ASCII
	.dbline 233
;  line1[6]=asc[0];
	ldd R2,y+0
	std y+17,R2
	.dbline 234
;  line1[7]=asc[1];
	ldd R2,y+1
	std y+18,R2
	.dbline 235
;  BCD_ASCII(time[5],asc);						  //为第1行的星期赋值
	movw R18,R28
	movw R30,R22
	ldd R16,z+5
	xcall _BCD_ASCII
	.dbline 236
;  line1[9]=asc[1];
	ldd R2,y+1
	std y+20,R2
L131:
	.dbline 238
L132:
	.dbline 238
;  
;  while(LCD1602_readBF());
	xcall _LCD1602_readBF
	tst R16
	brne L131
	.dbline 239
;  LCD1602_gotoXY(1,2);	 						  //第1行从第3个位置开始显示
	ldi R18,2
	ldi R16,1
	xcall _LCD1602_gotoXY
	.dbline 240
;  LCD1602_sendstr("20");							  //将07年显示为2007的形式
	ldi R16,<L134
	ldi R17,>L134
	xcall _LCD1602_sendstr
	.dbline 241
;  LCD1602_sendstr(line1); 						  //第1行显示
	movw R16,R28
	subi R16,245  ; offset = 11
	sbci R17,255
	xcall _LCD1602_sendstr
L135:
	.dbline 242
L136:
	.dbline 242
;  while(LCD1602_readBF());
	xcall _LCD1602_readBF
	tst R16
	brne L135
	.dbline 243
;  LCD1602_gotoXY(2,4); 	 						  //第2行从第5个位置开始显示
	ldi R18,4
	ldi R16,2
	xcall _LCD1602_gotoXY
	.dbline 244
;  LCD1602_sendstr(line2);						  //第2行显示
	movw R16,R28
	subi R16,254  ; offset = 2
	sbci R17,255
	xcall _LCD1602_sendstr
	.dbline -2
	.dbline 245
; }
L112:
	adiw R28,22
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l line1 11 A[11:11]c
	.dbsym l line2 2 A[9:9]c
	.dbsym l asc 0 A[2:2]c
	.dbsym r i 20 c
	.dbsym r time 22 pc
	.dbend
	.area lit(rom, con, rel)
L139:
	.byte 21,'X
	.byte 19,1
	.byte 1,6
	.byte 7
L140:

⌨️ 快捷键说明

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