📄 rtc.s
字号:
ldi R30,0
cpc R25,R30
brne X17
rjmp L171
X17:
rjmp L153
X1:
.dbline 287
; {case 0x04: //"+"按键处理
L155:
.dbline 288
; (*Flag)++;
mov R30,R22
mov R31,R23
ldd R24,z+0
subi R24,255 ; addi 1
std z+0,R24
.dbline 289
; if(((*Flag)&0x7f)==10) *Flag=0|0x80;
andi R24,127
cpi R24,10
breq X18
rjmp L153
X18:
.dbline 289
ldi R24,128
std z+0,R24
.dbline 290
; break;
rjmp L153
L158:
.dbline 292
; case 0x08: //"-"按键处理
; if(((*Flag)&0x7f)==0) *Flag=10|0x80;
mov R30,R22
mov R31,R23
ldd R24,z+0
andi R24,127
brne L159
.dbline 292
ldi R24,138
std z+0,R24
L159:
.dbline 293
; (*Flag)--;
mov R30,R22
mov R31,R23
ldd R24,z+0
subi R24,1
std z+0,R24
.dbline 294
; break;
rjmp L153
L161:
.dbline 296
; case 0x10: //"下一位"按键处理
; Flag++;
subi R22,255 ; offset = 1
sbci R23,255
.dbline 297
; (*(Flag-1))&=0x7f; //上一位去掉小数点显示
mov R24,R22
mov R25,R23
sbiw R24,1
mov R30,R24
mov R31,R25
ldd R24,z+0
andi R24,127
std z+0,R24
.dbline 298
; (*Flag)|=0x80; //当前位加上小数点显示
mov R30,R22
mov R31,R23
ldd R24,z+0
ori R24,128
std z+0,R24
.dbline 299
; if(Flag==temp1+13)
mov R24,R28
mov R25,R29
adiw R24,16
cp R30,R24
cpc R31,R25
breq X19
rjmp L153
X19:
.dbline 300
; {(*Flag)&=0x7f;
.dbline 300
ldd R24,z+0
andi R24,127
std z+0,R24
.dbline 301
; Flag=temp1+9;
mov R22,R28
mov R23,R29
subi R22,244 ; offset = 12
sbci R23,255
.dbline 302
; (*Flag)|=0x80;}
mov R30,R22
mov R31,R23
ldd R24,z+0
ori R24,128
std z+0,R24
.dbline 302
.dbline 303
; break;
rjmp L153
L166:
.dbline 305
; case 0x20: //"上一位"按键处理
; if(Flag==temp1+9)
mov R24,R28
mov R25,R29
adiw R24,12
cp R22,R24
cpc R23,R25
brne L167
.dbline 306
; {(*Flag)&=0x7f;
.dbline 306
mov R30,R22
mov R31,R23
ldd R24,z+0
andi R24,127
std z+0,R24
.dbline 307
; Flag=temp1+13;
mov R22,R28
mov R23,R29
subi R22,240 ; offset = 16
sbci R23,255
.dbline 308
; (*Flag)|=0x80;}
mov R30,R22
mov R31,R23
ldd R24,z+0
ori R24,128
std z+0,R24
.dbline 308
rjmp L168
L167:
.dbline 309
; else Flag--;
subi R22,1
sbci R23,0
L168:
.dbline 310
; (*Flag)|=0x80; //当前位加上小数点显示
mov R30,R22
mov R31,R23
ldd R24,z+0
ori R24,128
std z+0,R24
.dbline 311
; (*(Flag+1))&=0x7f; //下一位去掉小数点显示
adiw R30,1
ldd R24,z+0
andi R24,127
std z+0,R24
.dbline 312
; break;
rjmp L153
L171:
.dbline 313
; case 0x40:Enter_Flag=1;break;//"确定"键处理
ldi R24,1
sts _Enter_Flag,R24
.dbline 313
.dbline 315
; // case 0x80:Enter_Flag=1;break;//测试用
; default:break;}
L153:
.dbline 317
L146:
.dbline 282
lds R2,_Enter_Flag
tst R2
brne X20
rjmp L145
X20:
.dbline 318
;
; }
; Enter_Flag=0;
clr R2
sts _Enter_Flag,R2
.dbline 319
; temp3[0]=((temp1[11]<<4)|temp1[12])&0x7f; //分数据处理,去掉小数点
ldd R2,y+15
ldd R24,y+14
andi R24,#0x0F
swap R24
or R24,R2
andi R24,127
std y+27,R24
.dbline 320
; temp3[1]=((temp1[9]<<4)|temp1[10])&0x7f; //时数据处理,去掉小数点
ldd R2,y+13
ldd R24,y+12
andi R24,#0x0F
swap R24
or R24,R2
andi R24,127
std y+28,R24
.dbline 321
; if((temp3[0]<0x60)&&(temp3[1]<0x24)) //判断是否为合法时间
ldd R24,y+27
cpi R24,96
brsh L181
ldd R24,y+28
cpi R24,36
brsh L181
.dbline 322
; {Write_1byte(SD2303,0x0e,0b10110000); //开启闹铃使能
.dbline 322
ldi R24,176
std y+0,R24
ldi R18,14
ldi R16,100
rcall _Write_1byte
.dbline 323
; Write_1byte(SD2303,0x0f,0b00101000); //开始中断使能
ldi R24,40
std y+0,R24
ldi R18,15
ldi R16,100
rcall _Write_1byte
.dbline 324
; Write_Nbyte(SD2303,0x08,temp3,3);} //初始化闹铃设置
ldi R24,3
std y+2,R24
mov R24,R28
mov R25,R29
adiw R24,27
std y+1,R25
std y+0,R24
ldi R18,8
ldi R16,100
rcall _Write_Nbyte
.dbline 324
rjmp L182
L181:
.dbline 326
; else
; Write_1byte(SD2303,0x0e,0b00110000); //取消闹铃功能
ldi R24,48
std y+0,R24
ldi R18,14
ldi R16,100
rcall _Write_1byte
L182:
.dbline 327
; }
L141:
.dbline 328
L89:
.dbline -2
.dbline 329
; }
; }
L85:
adiw R28,30
rcall pop_gset4
.dbline 0 ; func end
ret
.dbsym l temp3 27 A[3:3]c
.dbsym l temp2 20 A[7:7]c
.dbsym r Flag 22 pc
.dbsym r Key 10 c
.dbsym l temp1 3 A[17:17]c
.dbsym r i 20 c
.dbend
.dbfunc e Convert _Convert fV
; temp -> <dead>
; p2 -> R20,R21
; p1 -> R22
.even
_Convert::
rcall push_gset2
mov R20,R18
mov R21,R19
mov R22,R16
.dbline -1
.dbline 335
;
;
; //***************************DS1722函数开始************************//
;
; void Convert(uchar p1,uchar *p2)
; {uchar temp;
.dbline 336
; if(p1&0x80)
sbrs R22,7
rjmp L185
.dbline 337
; {p2[13]=10; //零下温度用10表示
.dbline 337
ldi R24,10
mov R30,R20
mov R31,R21
std z+13,R24
.dbline 338
; p1=0xff-p1;} //温度绝对值
mov R2,R22
clr R3
ldi R22,255
sub R22,R2
sbc R23,R3
.dbline 338
rjmp L186
L185:
.dbline 340
; else
; p2[13]=11; //零上温度用11表示
ldi R24,11
mov R30,R20
mov R31,R21
std z+13,R24
L186:
.dbline 341
; p2[14]=p1/10; //温度十位
ldi R17,10
mov R16,R22
rcall div8u
mov R30,R20
mov R31,R21
std z+14,R16
.dbline 342
; p2[15]=p1-p2[14]*10; //温度个位
mov R30,R20
mov R31,R21
ldd R17,z+14
ldi R16,10
rcall mpy8s
mov R2,R22
sub R2,R16
mov R30,R20
mov R31,R21
std z+15,R2
.dbline -2
.dbline 343
; }
L184:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l temp 1 c
.dbsym r p2 20 pc
.dbsym r p1 22 c
.dbend
.dbfunc e DSWrite_Byte _DSWrite_Byte fV
; clear -> R20
; Data -> R18
; Address -> R16
.even
_DSWrite_Byte::
rcall push_gset1
.dbline -1
.dbline 350
;
; //***************************通过SPI接口写数据函数*****************//
; //函数参数说明:
; //Address:DS1722寄存器地址
; //Data:写入的数据
; void DSWrite_Byte(uchar Address,uchar Data)
; {uchar clear;
.dbline 351
; PORTB=PORTB|0x10; //使能SPI器件
sbi 0x18,4
.dbline 352
; SPDR=Address;
out 0xf,R16
L188:
.dbline 353
.dbline 353
.dbline 353
L189:
.dbline 353
; while(!(SPSR&0x80)) {;}
sbis 0xe,7
rjmp L188
.dbline 354
; clear=SPSR;
in R20,0xe
.dbline 355
; clear=SPDR;
in R20,0xf
.dbline 356
; SPDR=Data;
out 0xf,R18
L191:
.dbline 357
.dbline 357
.dbline 357
L192:
.dbline 357
; while(!(SPSR&0x80)) {;}
sbis 0xe,7
rjmp L191
.dbline 358
; clear=SPSR;
in R20,0xe
.dbline 359
; clear=SPDR;
in R20,0xf
.dbline 360
; PORTB=PORTB&0xef;
in R24,0x18
andi R24,239
out 0x18,R24
.dbline -2
.dbline 361
; }
L187:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r clear 20 c
.dbsym r Data 18 c
.dbsym r Address 16 c
.dbend
.dbfunc e DSRead_Byte _DSRead_Byte fc
; Data -> R20
; clear -> R22
; Address -> R16
.even
_DSRead_Byte::
rcall push_gset2
.dbline -1
.dbline 369
;
;
; //***************************通过SPI接口读数据函数*****************//
; //函数参数说明:
; //Address:DS1722寄存器地址
; //返回值:读取的温度数据
; uchar DSRead_Byte(uchar Address)
; {uchar clear;
.dbline 371
; uchar Data;
; PORTB=PORTB|0x10;
sbi 0x18,4
.dbline 372
; SPDR=Address;
out 0xf,R16
L195:
.dbline 373
.dbline 373
.dbline 373
L196:
.dbline 373
; while(!(SPSR&0x80)) {;}
sbis 0xe,7
rjmp L195
.dbline 374
; clear=SPSR;
in R22,0xe
.dbline 375
; clear=SPDR;
in R22,0xf
.dbline 376
; SPDR=Address; //发空数据
out 0xf,R16
L198:
.dbline 377
.dbline 377
.dbline 377
L199:
.dbline 377
; while(!(SPSR&0x80)) {;}
sbis 0xe,7
rjmp L198
.dbline 378
; clear=SPSR;
in R22,0xe
.dbline 379
; Data=SPDR;
in R20,0xf
.dbline 380
; PORTB=PORTB&0xef;
in R24,0x18
andi R24,239
out 0x18,R24
.dbline 381
; return(Data);
mov R16,R20
.dbline -2
L194:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r Data 20 c
.dbsym r clear 22 c
.dbsym r Address 16 c
.dbend
.area lit(rom, con, rel)
L202:
.byte 2,0
.byte 0,4
.byte 1,2
.byte 2,7
.byte 1,1
.byte 7,3
.byte 0,0
.byte 0,0
L203:
.byte 'P,48
.byte 32,3
.byte 5,1
.byte 5
.area text(rom, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第十章程序\RTC.C
.dbfunc e main _main fV
; i -> <dead>
; SD2303_Controller2 -> R20
; SD2303_Controller1 -> R22
; DS -> R20
; SD -> y+26
; Set_Time -> y+19
; time -> y+3
.even
_main::
sbiw R28,27
.dbline -1
.dbline 385
; }
;
; void main(void)
; {uchar i;
.dbline 386
; uchar time[16]={2,0,0,4,1,2,2,7,1,1,7,3,0,0,0,0};
ldi R24,<L202
ldi R25,>L202
mov R30,R28
mov R31,R29
adiw R30,3
ldi R16,16
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
rcall asgncblk
.dbline 387
; uchar Set_Time[7]={0x50,0x30,0x20,0x03,0x05,0x01,0x05};
ldi R24,<L203
ldi R25,>L203
mov R30,R28
mov R31,R29
adiw R30,19
ldi R16,7
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
rcall asgncblk
.dbline 390
; //初始化时间 2005-01-05 Wed 20-30-50
; uchar SD,DS;
; uchar SD2303_Controller1=0x00; //禁止中断
clr R22
.dbline 391
; uchar SD2303_Controller2=0x20; //时间格式:24小时制
ldi R20,32
.dbline 392
; DDRA=0xff; //A口输出
ldi R24,255
out 0x1a,R24
.dbline 393
; DDRC=0xff; //C口输出
out 0x14,R24
.dbline 394
; DDRD=0x80; //D口最高位输出,其他带上拉输入
ldi R24,128
out 0x11,R24
.dbline 395
; PORTD=0x7F;
ldi R24,127
out 0x12,R24
.dbline 396
; DDRB=0xF3; //B口带第2、3位带上拉输入,其他输出
ldi R24,243
out 0x17,R24
.dbline 397
; PORTB=0xF3;
out 0x18,R24
.dbline 398
; Write_1byte(SD2303,0x0e,SD2303_Controller1);//写控制字
std y+0,R22
ldi R18,14
ldi R16,100
rcall _Write_1byte
.dbline 399
; Write_1byte(SD2303,0x0f,SD2303_Controller2);//写控制字
std y+0,R20
ldi R18,15
ldi R16,100
rcall _Write_1byte
.dbline 400
; Write_Nbyte(SD2303,0x00,Set_Time,7); //初始化时间
ldi R24,7
std y+2,R24
mov R24,R28
mov R25,R29
adiw R24,19
std y+1,R25
std y+0,R24
clr R18
ldi R16,100
rcall _Write_Nbyte
.dbline 401
; SPCR=0b01011100;
ldi R24,92
out 0xd,R24
.dbline 402
; DSWrite_Byte(0x80,0xf0); //DS1722 8位分辨率自由转换模式
ldi R18,240
ldi R16,128
rcall _DSWrite_Byte
rjmp L205
L204:
.dbline 404
; while(1)
; {Key_Process(); //按键处理
.dbline 404
rcall _Key_Process
.dbline 405
; Read_Nbyte(SD2303,0x00,Set_Time,7); //读取时间
ldi R24,7
std y+2,R24
mov R24,R28
mov R25,R29
adiw R24,19
std y+1,R25
std y+0,R24
clr R18
ldi R16,100
rcall _Read_Nbyte
.dbline 406
; time[2]=Set_Time[6]>>4; //年高位;
ldd R24,y+25
swap R24
andi R24,#0x0F
std y+5,R24
.dbline 407
; time[3]=Set_Time[6]&0x0f; //年低位;
ldd R24,y+25
andi R24,15
std y+6,R24
.dbline 408
; time[4]=Set_Time[5]>>4; //月高位;
ldd R24,y+24
swap R24
andi R24,#0x0F
std y+7,R24
.dbline 409
; time[5]=Set_Time[5]&0x0f; //月低位;
ldd R24,y+24
andi R24,15
std y+8,R24
.dbline 410
; time[6]=Set_Time[4]>>4; //日高位;
ldd R24,y+23
swap R24
andi R24,#0x0F
std y+9,R24
.dbline 411
; time[7]=Set_Time[4]&0x0f; //日低位;
ldd R24,y+23
andi R24,15
std y+10,R24
.dbline 412
; time[8]=Set_Time[3]; //星期;
ldd R2,y+22
std y+11,R2
.dbline 413
; time[9]=Set_Time[2]>>4; //时高位;
ldd R24,y+21
swap R24
andi R24,#0x0F
std y+12,R24
.dbline 414
; time[10]=Set_Time[2]&0x0f; //时低位;
ldd R24,y+21
andi R24,15
std y+13,R24
.dbline 415
; time[11]=Set_Time[1]>>4; //分高位;
ldd R24,y+20
swap R24
andi R24,#0x0F
std y+14,R24
.dbline 416
; time[12]=Set_Time[1]&0x0f; //分低位;
ldd R24,y+20
andi R24,15
std y+15,R24
.dbline 417
; time[13]=Set_Time[0]>>4; //秒高位;
ldd R24,y+19
swap R24
andi R24,#0x0F
std y+16,R24
.dbline 418
; time[14]=Set_Time[0]&0x0f; //秒低位;
ldd R24,y+19
andi R24,15
std y+17,R24
.dbline 419
; Read_Nbyte(SD2303,0x0f,&SD,1); //读取中断标志位
ldi R24,1
std y+2,R24
mov R24,R28
mov R25,R29
adiw R24,26
std y+1,R25
std y+0,R24
ldi R18,15
ldi R16,100
rcall _Read_Nbyte
.dbline 420
; if(SD&0x02) PORTD=PORTD|0x80; //响铃1分钟
ldd R2,y+26
sbrs R2,1
rjmp L231
.dbline 420
sbi 0x12,7
rjmp L232
L231:
.dbline 421
; else PORTD=PORTD&0x7F; //关闭闹铃
in R24,0x12
andi R24,127
out 0x12,R24
L232:
.dbline 422
ldi R16,2
rcall _DSRead_Byte
mov R20,R16
.dbline 423
mov R18,R28
mov R19,R29
subi R18,253 ; offset = 3
sbci R19,255
rcall _Convert
.dbline 424
mov R16,R28
mov R17,R29
subi R16,253 ; offset = 3
sbci R17,255
rcall _Display
.dbline 425
L205:
.dbline 403
rjmp L204
X21:
.dbline -2
.dbline 426
; DS=DSRead_Byte(0x02); //读取温度值
; Convert(DS,time);
; Display(time); //时间显示
; }
; }
L201:
adiw R28,27
.dbline 0 ; func end
ret
.dbsym l i 4 c
.dbsym r SD2303_Controller2 20 c
.dbsym r SD2303_Controller1 22 c
.dbsym r DS 20 c
.dbsym l SD 26 c
.dbsym l Set_Time 19 A[7:7]c
.dbsym l time 3 A[16:16]c
.dbend
.area bss(ram, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第十章程序\RTC.C
_F_Flag::
.blkb 1
.dbsym e F_Flag _F_Flag c
_Enter_Flag::
.blkb 1
.dbsym e Enter_Flag _Enter_Flag c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -