📄 rtc.s
字号:
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0
.area text(rom, con, rel)
.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\17_RTC\RTC.C
.dbfunc e main _main fV
.area func_lit(rom, con, rel)
L218:
.word `L205
.word `L206
.word `L207
.word `L208
.word `L209
.word `L210
.word `L211
.word `L212
.word `L213
.word `L214
.word `L215
.word `L216
.word `L217
.area text(rom, con, rel)
.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\17_RTC\RTC.C
; settime -> y+7
; set_num -> y+17
; dis_y -> R14
; dis_x -> R22
; setadd -> R20
; i -> y+16
; shift -> R10
; gettime -> y+0
; RD_TFLAG -> y+15
; setdat -> y+14
.even
_main::
sbiw R28,20
.dbline -1
.dbline 253
; /*******************************************
; 函数名称: main
; 功 能: 1. 在1602液晶上显示当前时间 2.可以设置时间(M1-M9为数字0-9,M13为设置模式和显示模式选择,M14为当前设置位选择)
; 参 数: 无
; 返回值 : 无
; /********************************************/
; void main(void)
; {
.dbline 254
; uchar i,RD_TFLAG=1,set_num=0;//i为键盘译码值
clr R0
inc R0
std y+15,R0
.dbline 254
clr R0
std y+17,R0
.dbline 261
; //RD_TFLAG为是否设置时间的标志,为1是显示状态,不设置,为0时进入设置状态
; //set_num是设置哪一位的标志,如为0的时候设置的是秒
; uchar setadd,setdat,shift; //setadd指定将当前数值送入DS1302的哪个寄存器
; //setdat是当前设置的数值,即被送入DS1302指定寄存器的数
; //shift来实现十位和各位的设置相互独立(因为十位和个位是在一个寄存器里的)
; uchar dis_x,dis_y; //存储1602液晶当前光标的位置
; uchar settime[7]={0x15,0x58,0x13,0x01,0x01,0x06,0x07};//设置的秒,分,时,日,月,星期,年
ldi R24,<L139
ldi R25,>L139
movw R30,R28
adiw R30,7
ldi R16,7
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
xcall asgncblk
.dbline 262
; uchar gettime[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};//保存当前时间的数组
ldi R24,<L140
ldi R25,>L140
movw R30,R28
ldi R16,7
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
xcall asgncblk
.dbline 263
; Board_init(); //初始化开发板
xcall _Board_init
.dbline 264
; LCD1602_initial(); //初始化1602液晶
xcall _LCD1602_initial
.dbline 265
; DS1302_portinit(); //初始化DS1302的三根数据线
xcall _DS1302_portinit
.dbline 266
; DS1302_init(); //启动振荡器,DS1302开始工作
xcall _DS1302_init
xjmp L142
L141:
.dbline 270
; //DS1302_setT(settime); //设置初始时间
; //DS1302_init(); //启动振荡器,DS1302开始工作
; while(1) //以下程序完成显示和设置时间
; {
.dbline 271
; if(RD_TFLAG) //如果是设置模式则不更新时间显示
ldd R0,y+15
tst R0
breq L144
.dbline 272
; {
.dbline 273
; DS1302_getT(gettime); //获得当前时间
movw R16,R28
xcall _DS1302_getT
.dbline 274
; Disp_time(gettime); //显示当前时间
movw R16,R28
xcall _Disp_time
.dbline 275
; }
L144:
.dbline 276
; if(Mkey_press()) //是否有按键按下
xcall _Mkey_press
tst R16
brne X16
xjmp L146
X16:
.dbline 277
; {
.dbline 278
; i=Mkey_scan(); //扫描并反回翻译后的键码
xcall _Mkey_scan
std y+16,R16
.dbline 279
; switch(i)
ldd R12,y+16
clr R13
tst R12
brne X12
tst R13
brne X17
xjmp L151
X17:
X12:
movw R24,R12
cpi R24,1
ldi R30,0
cpc R25,R30
brne X18
xjmp L155
X18:
cpi R24,2
ldi R30,0
cpc R25,R30
brne X19
xjmp L159
X19:
cpi R24,3
ldi R30,0
cpc R25,R30
brne X20
xjmp L163
X20:
cpi R24,4
ldi R30,0
cpc R25,R30
brne X21
xjmp L167
X21:
cpi R24,5
ldi R30,0
cpc R25,R30
brne X22
xjmp L171
X22:
cpi R24,6
ldi R30,0
cpc R25,R30
brne X23
xjmp L175
X23:
cpi R24,7
ldi R30,0
cpc R25,R30
brne X24
xjmp L179
X24:
cpi R24,8
ldi R30,0
cpc R25,R30
brne X25
xjmp L183
X25:
cpi R24,9
ldi R30,0
cpc R25,R30
brne X26
xjmp L187
X26:
cpi R24,12
ldi R30,0
cpc R25,R30
brne X27
xjmp L191
X27:
cpi R24,13
ldi R30,0
cpc R25,R30
brne X28
xjmp L197
X28:
xjmp L149
X13:
.dbline 280
; {
L151:
.dbline 282
; case 0x0: //将当前设置位设置成0
; if(RD_TFLAG==0) //检测是否是设置模式(为0就是设置模式)
ldd R0,y+15
tst R0
breq X29
xjmp L149
X29:
.dbline 283
; {
.dbline 284
; setdat=DS1302_readD(setadd|RD); //读出当前时间
mov R16,R20
ori R16,1
xcall _DS1302_readD
std y+14,R16
.dbline 285
; setdat=setdat>>shift|setdat<<shift; //根据shift值来设置DS1302寄存器的十位还是个位(shift为0设置的是个位,为4设置的是十位)
mov R17,R10
xcall lsl8
mov R2,R16
ldd R16,y+14
mov R17,R10
xcall lsr8
mov R3,R16
or R3,R2
std y+14,R3
.dbline 286
; setdat&=0xF0; //保留高位不变(设置十位则个位不变,设置个位则十位不变,因为上条语句已经根据shift的值把需要设置的位移动到低位了)
ldd R24,y+14
andi R24,240
std y+14,R24
.dbline 287
; setdat|=0; //按下的是0键,所以把当前设置位设置成0
.dbline 288
; setdat=setdat>>shift|setdat<<shift; //把十位和个位还原成正确值
ldd R16,y+14
mov R17,R10
xcall lsl8
mov R2,R16
ldd R16,y+14
mov R17,R10
xcall lsr8
mov R3,R16
or R3,R2
std y+14,R3
.dbline 289
; DS1302_writeD(C_WP|WR,UPROTECT); //解除写保护
clr R18
ldi R16,142
xcall _DS1302_writeD
.dbline 290
; DS1302_writeD(setadd|WR,setdat); //写入设置值
ldd R18,y+14
mov R16,R20
xcall _DS1302_writeD
.dbline 291
; DS1302_writeD(C_WP|WR,PROTECT); //写保护
ldi R18,128
ldi R16,142
xcall _DS1302_writeD
.dbline 292
; LCD1602_gotoXY(dis_x,dis_y); //将当前设置位在1602液晶上对应的位置显示更新
mov R18,R14
mov R16,R22
xcall _LCD1602_gotoXY
.dbline 293
; LCD1602_sendstr("0"); //向1602写入0字符并显示
ldi R16,<L154
ldi R17,>L154
xcall _LCD1602_sendstr
.dbline 294
; LCD1602_gotoXY(dis_x,dis_y); //将光标保持在当前设置位上
mov R18,R14
mov R16,R22
xcall _LCD1602_gotoXY
.dbline 295
; }
.dbline 296
; break;
xjmp L149
L155:
.dbline 298
; case 0x1: //过程和0键相同,只是将当前设置位设置成1并更新显示
; if(RD_TFLAG==0)
ldd R0,y+15
tst R0
breq X30
xjmp L149
X30:
.dbline 299
; {
.dbline 300
; setdat=DS1302_readD(setadd|RD);
mov R16,R20
ori R16,1
xcall _DS1302_readD
std y+14,R16
.dbline 301
; setdat=setdat>>shift|setdat<<shift;
mov R17,R10
xcall lsl8
mov R2,R16
ldd R16,y+14
mov R17,R10
xcall lsr8
mov R3,R16
or R3,R2
std y+14,R3
.dbline 302
; setdat&=0xF0;
ldd R24,y+14
andi R24,240
std y+14,R24
.dbline 303
; setdat|=1;
ori R24,1
std y+14,R24
.dbline 304
; setdat=setdat>>shift|setdat<<shift;
ldd R16,y+14
mov R17,R10
xcall lsl8
mov R2,R16
ldd R16,y+14
mov R17,R10
xcall lsr8
mov R3,R16
or R3,R2
std y+14,R3
.dbline 305
; DS1302_writeD(C_WP|WR,UPROTECT);
clr R18
ldi R16,142
xcall _DS1302_writeD
.dbline 306
; DS1302_writeD(setadd|WR,setdat);
ldd R18,y+14
mov R16,R20
xcall _DS1302_writeD
.dbline 307
; DS1302_writeD(C_WP|WR,PROTECT);
ldi R18,128
ldi R16,142
xcall _DS1302_writeD
.dbline 308
; LCD1602_gotoXY(dis_x,dis_y);
mov R18,R14
mov R16,R22
xcall _LCD1602_gotoXY
.dbline 309
; LCD1602_sendstr("1");
ldi R16,<L158
ldi R17,>L158
xcall _LCD1602_sendstr
.dbline 310
; LCD1602_gotoXY(dis_x,dis_y);
mov R18,R14
mov R16,R22
xcall _LCD1602_gotoXY
.dbline 311
; }
.dbline 312
; break;
xjmp L149
L159:
.dbline 314
; case 0x2: //过程和0键相同,只是将当前设置位设置成2并更新显示
; if(RD_TFLAG==0)
ldd R0,y+15
tst R0
breq X31
xjmp L149
X31:
.dbline 315
; {
.dbline 316
; setdat=DS1302_readD(setadd|RD);
mov R16,R20
ori R16,1
xcall _DS1302_readD
std y+14,R16
.dbline 317
; setdat=setdat>>shift|setdat<<shift;
mov R17,R10
xcall lsl8
mov R2,R16
ldd R16,y+14
mov R17,R10
xcall lsr8
mov R3,R16
or R3,R2
std y+14,R3
.dbline 318
; setdat&=0xF0;
ldd R24,y+14
andi R24,240
std y+14,R24
.dbline 319
; setdat|=2;
ori R24,2
std y+14,R24
.dbline 320
; setdat=setdat>>shift|setdat<<shift;
ldd R16,y+14
mov R17,R10
xcall lsl8
mov R2,R16
ldd R16,y+14
mov R17,R10
xcall lsr8
mov R3,R16
or R3,R2
std y+14,R3
.dbline 321
; DS1302_writeD(C_WP|WR,UPROTECT);
clr R18
ldi R16,142
xcall _DS1302_writeD
.dbline 322
; DS1302_writeD(setadd|WR,setdat);
ldd R18,y+14
mov R16,R20
xcall _DS1302_writeD
.dbline 323
; DS1302_writeD(C_WP|WR,PROTECT);
ldi R18,128
ldi R16,142
xcall _DS1302_writeD
.dbline 324
; LCD1602_gotoXY(dis_x,dis_y);
mov R18,R14
mov R16,R22
xcall _LCD1602_gotoXY
.dbline 325
; LCD1602_sendstr("2");
ldi R16,<L162
ldi R17,>L162
xcall _LCD1602_sendstr
.dbline 326
; LCD1602_gotoXY(dis_x,dis_y);
mov R18,R14
mov R16,R22
xcall _LCD1602_gotoXY
.dbline 327
; }
.dbline 328
; break;
xjmp L149
L163:
.dbline 330
; case 0x3: //过程和0键相同,只是将当前设置位设置成3并更新显示
; if(RD_TFLAG==0)
ldd R0,y+15
tst R0
breq X32
xjmp L149
X32:
.dbline 331
; {
.dbline 332
; setdat=DS1302_readD(setadd|RD);
mov R16,R20
ori R16,1
xcall _DS1302_readD
std y+14,R16
.dbline 333
; setdat=setdat>>shift|setdat<<shift;
mov R17,R10
xcall lsl8
mov R2,R16
ldd R16,y+14
mov R17,R10
xcall lsr8
mov R3,R16
or R3,R2
std y+14,R3
.dbline 334
; setdat&=0xF0;
ldd R24,y+14
andi R24,240
std y+14,R24
.dbline 335
; setdat|=3;
ori R24,3
std y+14,R24
.dbline 336
; setdat=setdat>>shift|setdat<<shift;
ldd R16,y+14
mov R17,R10
xcall lsl8
mov R2,R16
ldd R16,y+14
mov R17,R10
xcall lsr8
mov R3,R16
or R3,R2
std y+14,R3
.dbline 337
; DS1302_writeD(C_WP|WR,UPROTECT);
clr R18
ldi R16,142
xcall _DS1302_writeD
.dbline 338
; DS1302_writeD(setadd|WR,setdat);
ldd R18,y+14
mov R16,R20
xcall _DS1302_writeD
.dbline 339
; DS1302_writeD(C_WP|WR,PROTECT);
ldi R18,128
ldi R16,142
xcall _DS1302_writeD
.dbline 340
; LCD1602_gotoXY(dis_x,dis_y);
mov R18,R14
mov R16,R22
xcall _LCD1602_gotoXY
.dbline 341
; LCD1602_sendstr("3");
ldi R16,<L166
ldi R17,>L166
xcall _LCD1602_sendstr
.dbline 342
; LCD1602_gotoXY(dis_x,dis_y);
mov R18,R14
mov R16,R22
xcall _LCD1602_gotoXY
.dbline 343
; }
.dbline 344
; break;
xjmp L149
L167:
.dbline 346
; case 0x4: //过程和0键相同,只是将当前设置位设置成4并更新显示
; if(RD_TFLAG==0)
ldd R0,y+15
tst R0
breq X33
xjmp L149
X33:
.dbline 347
; {
.dbline 348
; setdat=DS1302_readD(setadd|RD);
mov R16,R20
ori R16,1
xcall _DS1302_readD
std y+14,R16
.dbline 349
; setdat=setdat>>shift|setdat<<shift;
mov R17,R10
xcall lsl8
mov R2,R16
ldd R16,y+14
mov R17,R10
xcall lsr8
mov R3,R16
or R3,R2
std y+14,R3
.dbline 350
; setdat&=0xF0;
ldd R24,y+14
andi R24,240
std y+14,R24
.dbline 351
; setdat|=4;
ori R24,4
std y+14,R24
.dbline 352
; setdat=setdat>>shift|setdat<<shift;
ldd R16,y+14
mov R17,R10
xcall lsl8
mov R2,R16
ldd R16,y+14
mov R17,R10
xcall lsr8
mov R3,R16
or R3,R2
std y+14,R3
.dbline 353
; DS1302_writeD(C_WP|WR,UPROTECT);
clr R18
ldi R16,142
xcall _DS1302_writeD
.dbline 354
; DS1302_writeD(setadd|WR,setdat);
ldd R18,y+14
mov R16,R20
xcall _DS1302_writeD
.dbline 355
; DS1302_writeD(C_WP|WR,PROTECT);
ldi R18,128
ldi R16,142
xcall _DS1302_writeD
.dbline 356
; LCD1602_gotoXY(dis_x,dis_y);
mov R18,R14
mov R16,R22
xcall _LCD1602_gotoXY
.dbline 357
; LCD1602_sendstr("4");
ldi R16,<L170
ldi R17,>L170
xcall _LCD1602_sendstr
.dbline 358
; LCD1602_gotoXY(dis_x,dis_y);
mov R18,R14
mov R16,R22
xcall _LCD1602_gotoXY
.dbline 359
; }
.dbline 360
; break;
xjmp L149
L171:
.dbline 362
; case 0x5: //过程和0键相同,只是将当前设置位设置成5并更新显示
; if(RD_TFLAG==0)
ldd R0,y+15
tst R0
breq X34
xjmp L149
X34:
.dbline 363
; {
.dbline 364
; setdat=DS1302_readD(setadd|RD);
mov R16,R20
ori R16,1
xcall _DS1302_readD
std y+14,R16
.dbline 365
; setdat=setdat>>shift|setdat<<shift;
mov R17,R10
xcall lsl8
mov R2,R16
ldd R16,y+14
mov R17,R10
xcall lsr8
mov R3,R16
or R3,R2
std y+14,R3
.dbline 366
; setdat&=0xF0;
ldd R24,y+14
andi R24,240
std y+14,R24
.dbline 367
; setdat|=5;
ori R24,5
std y+14,R24
.dbline 368
; setdat=setdat>>shift|setdat<<shift;
ldd R16,y+14
mov R17,R10
xcall lsl8
mov R2,R16
ldd R16,y+14
mov R17,R10
xcall lsr8
mov R3,R16
or R3,R2
std y+14,R3
.dbline 369
; DS1302_writeD(C_WP|WR,UPROTECT);
clr R18
ldi R16,142
xcall _DS1302_writeD
.dbline 370
; DS1302_writeD(setadd|WR,setdat);
ldd R18,y+14
mov R16,R20
xcall _DS1302_writeD
.dbline 371
; DS1302_writeD(C_WP|WR,PROTECT);
ldi R18,128
ldi R16,142
xcall _DS1302_writeD
.dbline 372
; LCD1602_gotoXY(dis_x,dis_y);
mov R18,R14
mov R16,R22
xcall _LCD1602_gotoXY
.dbline 373
; LCD1602_sendstr("5");
ldi R16,<L174
ldi R17,>L174
xcall _LCD1602_sendstr
.dbline 374
; LCD1602_gotoXY(dis_x,dis_y);
mov R18,R14
mov R16,R22
xcall _LCD1602_gotoXY
.dbline 375
; }
.dbline 376
; break;
xjmp L149
L175:
.dbline 378
; case 0x6: //过程和0键相同,只是将当前设置位设置成6并更新显示
; if(RD_TFLAG==0)
ldd R0,y+15
tst R0
breq X35
xjmp L149
X35:
.dbline 379
; {
.dbline 380
; setdat=DS1302_readD(setadd|RD);
mov R16,R20
ori R16,1
xcall _DS1302_readD
std y+14,R16
.dbline 381
; setdat=setdat>>shift|setdat<<shift;
mov R17,R10
xcall lsl8
mov R2,R16
ldd R16,y+14
mov R17,R10
xcall lsr8
mov R3,R16
or R3,R2
std y+14,R3
.dbline 382
; setdat&=0xF0;
ldd R24,y+14
andi R24,240
std y+14,R24
.dbline 383
; setdat|=6;
ori R24,6
std y+14,R24
.dbline 384
; setdat=setdat>>shift|setdat<<shift;
ldd R16,y+14
mov R17,R10
xcall lsl8
mov R2,R16
ldd R16,y+14
mov R17,R10
xcall lsr8
mov R3,R16
or R3,R2
std y+14,R3
.dbline 385
; DS1302_writeD(C_WP|WR,UPROTECT);
clr R18
ldi R16,142
xcall _DS1302_writeD
.dbline 386
; DS1302_writeD(setadd|WR,setdat);
ldd R18,y+14
mov R16,R20
xcall _DS1302_writeD
.dbline 387
; DS1302_writeD(C_WP|WR,PROTECT);
ldi R18,128
ldi R16,142
xcall _DS1302_writeD
.dbline 388
; LCD1602_gotoXY(dis_x,dis_y);
mov R18,R14
mov R16,R22
xcall _LCD1602_gotoXY
.dbline 389
; LCD1602_sendstr("6");
ldi R16,<L178
ldi R17,>L178
xcall _LCD1602_sendstr
.dbline 390
; LCD1602_gotoXY(dis_x,dis_y);
mov R18,R14
mov R16,R22
xcall _LCD1602_gotoXY
.dbline 391
; }
.dbline 392
; break;
xjmp L149
L179:
.dbline 394
; case 0x7: //过程和0键相同,只是将当前设置位设置成7并更新显示
; if(RD_TFLAG==0)
ldd R0,y+15
tst R0
breq X36
xjmp L149
X36:
.dbline 395
; {
.dbline 396
; setdat=DS1302_readD(setadd|RD);
mov R16,R20
ori R16,1
xcall _DS1302_readD
std y+14,R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -