📄 rtc.s
字号:
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 + -