📄 rtc.s
字号:
.dbsym r Number 22 c
.dbsym r Array 10 pc
.dbsym r Address 12 c
.dbsym r Slave 14 c
.dbend
.dbfunc e Write_1byte _Write_1byte fV
; Data -> R20
; Address -> R22
; Slave -> R10
.even
_Write_1byte::
rcall push_gset3
mov R22,R18
mov R10,R16
ldd R20,y+6
.dbline -1
.dbline 177
;
; //****************************写一个字节子程序**********************//
; //函数参数说明:
; //Slave:IIC器件地址,如上文定义的SD2303
; //Address:IIC器件寄存器地址
; //Data:数据
; void Write_1byte(uchar Slave,uchar Address,uchar Data)
; {writ:do //开始->写IIC器件地址->检查应答位
L62:
L63:
.dbline 178
; {Start();
.dbline 178
rcall _Start
.dbline 179
; Write_Byte(Slave);
mov R16,R10
rcall _Write_Byte
.dbline 180
; Check_Ack();
rcall _Check_Ack
.dbline 181
L64:
.dbline 181
; }while(F_Flag==1);
lds R24,_F_Flag
cpi R24,1
breq L63
L66:
.dbline 183
; do
; {Write_Byte(Address<<4); //送起始地址->检查应答位
.dbline 183
mov R16,R22
andi R16,#0x0F
swap R16
rcall _Write_Byte
.dbline 184
; Check_Ack();
rcall _Check_Ack
.dbline 185
L67:
.dbline 185
; }while(F_Flag==1);
lds R24,_F_Flag
cpi R24,1
breq L66
.dbline 186
; Write_Byte(Data);
mov R16,R20
rcall _Write_Byte
.dbline 187
; Check_Ack(); //检查应答位
rcall _Check_Ack
.dbline 188
; Stop(); //停止信号
rcall _Stop
.dbline -2
.dbline 189
; }
L61:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r Data 20 c
.dbsym r Address 22 c
.dbsym r Slave 10 c
.dbend
.dbfunc e Read_Nbyte _Read_Nbyte fV
; data0 -> R20
; x -> R22
; Number -> R10
; Array -> R12,R13
; Address -> R14
; Slave -> y+10
.even
_Read_Nbyte::
rcall push_arg4
rcall push_gset5
mov R14,R18
ldd R12,y+14
ldd R13,y+15
ldd R10,y+16
.dbline -1
.dbline 199
;
;
; //***************************读N个字节子程序***********************//
; //函数参数说明:
; //Slave:IIC器件地址,如上文定义的SD2303
; //Address:起始地址
; //Array:读数据存放的数组
; //Number:读取的字节数
; void Read_Nbyte(uchar Slave,uchar Address,uchar *Array,uchar Number)
; {uchar data0,x;
L70:
.dbline 201
.dbline 201
rcall _Start
.dbline 201
ldd R16,y+10
rcall _Write_Byte
.dbline 201
rcall _Check_Ack
.dbline 201
L71:
.dbline 201
; //第一步:开始信号->写IIC器件地址->检查应答位
; do{Start();Write_Byte(Slave);Check_Ack();}while(F_Flag==1);
lds R24,_F_Flag
cpi R24,1
breq L70
L73:
.dbline 203
.dbline 203
mov R16,R14
andi R16,#0x0F
swap R16
rcall _Write_Byte
.dbline 203
rcall _Check_Ack
.dbline 203
L74:
.dbline 203
; //第二步:写起始地址->检查应答位
; do {Write_Byte(Address<<4);Check_Ack();}while(F_Flag==1);
lds R24,_F_Flag
cpi R24,1
breq L73
L76:
.dbline 205
.dbline 205
rcall _Start
.dbline 205
ldd R16,y+10
subi R16,255 ; addi 1
rcall _Write_Byte
.dbline 205
rcall _Check_Ack
.dbline 205
L77:
.dbline 205
; //第三步:开始信号->写IIC器件地址+1(表示读)->检查应答位
; do{Start();Write_Byte(Slave+1);Check_Ack();}while(F_Flag==1);
lds R24,_F_Flag
cpi R24,1
breq L76
.dbline 207
; //第四步:读N字节,每读完一字节发一个Ack应答,最后一字节发Nack
; for(x=0;x<Number;x++)
clr R22
rjmp L82
L79:
.dbline 208
; {data0=Read_Byte();*Array=data0;Array++;
.dbline 208
rcall _Read_Byte
mov R20,R16
.dbline 208
mov R30,R12
mov R31,R13
std z+0,R20
.dbline 208
mov R24,R30
mov R25,R31
adiw R24,1
mov R12,R24
mov R13,R25
.dbline 209
mov R24,R10
subi R24,1
cp R22,R24
brsh L83
.dbline 209
.dbline 209
rcall _Ack
.dbline 209
L83:
.dbline 209
L80:
.dbline 207
inc R22
L82:
.dbline 207
cp R22,R10
brlo L79
.dbline 210
; if(x<(Number-1)) { Ack(); }}
; Nack();
rcall _Nack
.dbline 212
; //第五步:发停止信号,结束读操作
; Stop();
rcall _Stop
.dbline -2
.dbline 213
; }
L69:
rcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r data0 20 c
.dbsym r x 22 c
.dbsym r Number 10 c
.dbsym r Array 12 pc
.dbsym r Address 14 c
.dbsym l Slave 10 c
.dbend
.area lit(rom, con, rel)
L86:
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0
L87:
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0
L88:
.byte 0,0
.byte 255
.area text(rom, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第十章程序\RTC.C
.dbfunc e Key_Process _Key_Process fV
; temp3 -> y+27
; temp2 -> y+20
; Flag -> R22,R23
; Key -> R10
; temp1 -> y+3
; i -> R20
.even
_Key_Process::
rcall push_gset4
sbiw R28,30
.dbline -1
.dbline 218
;
; //***************************按键处理程序**************************//
; //说明:为简化程序设计,此程序不保证输入的时间数据的合理性。
; void Key_Process(void)
; {uchar temp1[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
.dbline 218
ldi R24,<L86
ldi R25,>L86
mov R30,R28
mov R31,R29
adiw R30,3
ldi R16,17
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
rcall asgncblk
.dbline 220
; //输入数据格式依次为年、月、日、星期、小时和分钟
; uchar temp2[7]={0,0,0,0,0,0,0,};
ldi R24,<L87
ldi R25,>L87
mov R30,R28
mov R31,R29
adiw R30,20
ldi R16,7
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
rcall asgncblk
.dbline 221
; uchar temp3[3]={0,0,0xff};
ldi R24,<L88
ldi R25,>L88
mov R30,R28
mov R31,R29
adiw R30,27
ldi R16,3
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
rcall asgncblk
.dbline 226
; //输入数据格式依次为小时和分钟
; uchar Key;
; uchar *Flag;
; uchar i;
; Flag=temp1;
mov R22,R28
mov R23,R29
subi R22,253 ; offset = 3
sbci R23,255
.dbline 227
; if(PIND!=0xff)
in R24,0x10
cpi R24,255
brne X2
rjmp L89
X2:
.dbline 228
; {DelayMs(20); //延时去抖
.dbline 228
ldi R16,20
rcall _DelayMs
.dbline 229
; if(PIND!=0xff)
in R24,0x10
cpi R24,255
breq L91
.dbline 230
; Key=PINB;
in R10,0x16
L91:
.dbline 231
; if(Key==0xfe) //"时间设置"键按下
mov R24,R10
cpi R24,254
breq X3
rjmp L93
X3:
.dbline 232
; {temp1[0]|=0x80; //年高位设置提示
.dbline 232
ldd R24,y+3
ori R24,128
std y+3,R24
rjmp L96
L95:
.dbline 234
; while(!Enter_Flag) //直到按下确定键方停止
; {for(i=0;i<50;i++)
.dbline 234
clr R20
rjmp L101
L98:
.dbline 235
mov R16,R28
mov R17,R29
subi R16,253 ; offset = 3
sbci R17,255
rcall _Display
L99:
.dbline 234
inc R20
L101:
.dbline 234
cpi R20,50
brlo L98
.dbline 236
; Display(temp1); //显示和延时
; Key=~PIND;
in R10,0x10
com R10
.dbline 237
; switch(Key)
mov R12,R10
clr R13
mov R24,R12
mov R25,R13
cpi R24,16
ldi R30,0
cpc R25,R30
brne X4
rjmp L111
X4:
ldi R24,16
cp R24,R12
cpc R25,R13
brlt L121
L120:
mov R24,R12
mov R25,R13
cpi R24,4
ldi R30,0
cpc R25,R30
breq L105
cpi R24,4
ldi R30,0
cpc R25,R30
brge X5
rjmp L103
X5:
L122:
mov R24,R12
mov R25,R13
cpi R24,8
ldi R30,0
cpc R25,R30
breq L108
rjmp L103
L121:
mov R24,R12
mov R25,R13
cpi R24,32
ldi R30,0
cpc R25,R30
brne X6
rjmp L115
X6:
cpi R24,32
ldi R30,0
cpc R25,R30
brge X7
rjmp L103
X7:
L123:
mov R24,R12
mov R25,R13
cpi R24,64
ldi R30,0
cpc R25,R30
brne X8
rjmp L119
X8:
rjmp L103
X0:
.dbline 238
; {case 0x04: //"+"键处理
L105:
.dbline 239
; (*Flag)++;
mov R30,R22
mov R31,R23
ldd R24,z+0
subi R24,255 ; addi 1
std z+0,R24
.dbline 240
; if(((*Flag)&0x7f)==10) *Flag=0|0x80;
andi R24,127
cpi R24,10
breq X9
rjmp L103
X9:
.dbline 240
ldi R24,128
std z+0,R24
.dbline 241
; break;
rjmp L103
L108:
.dbline 243
; case 0x08: //"-"键处理
; if(((*Flag)&0x7f)==0) *Flag=10|0x80;
mov R30,R22
mov R31,R23
ldd R24,z+0
andi R24,127
brne L109
.dbline 243
ldi R24,138
std z+0,R24
L109:
.dbline 244
; (*Flag)--;
mov R30,R22
mov R31,R23
ldd R24,z+0
subi R24,1
std z+0,R24
.dbline 245
; break;
rjmp L103
L111:
.dbline 247
; case 0x10: //"下一位"键处理
; Flag++;
subi R22,255 ; offset = 1
sbci R23,255
.dbline 248
; (*(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 249
; (*Flag)|=0x80; //当前位加上小数点显示
mov R30,R22
mov R31,R23
ldd R24,z+0
ori R24,128
std z+0,R24
.dbline 250
; if(Flag==temp1+13)
mov R24,R28
mov R25,R29
adiw R24,16
cp R30,R24
cpc R31,R25
breq X10
rjmp L103
X10:
.dbline 251
; {Flag=temp1;
.dbline 251
mov R22,R28
mov R23,R29
subi R22,253 ; offset = 3
sbci R23,255
.dbline 252
; (*Flag)|=0x80;
mov R30,R22
mov R31,R23
ldd R24,z+0
ori R24,128
std z+0,R24
.dbline 253
; (*(Flag+13))&=0x7f;}
adiw R30,13
ldd R24,z+0
andi R24,127
std z+0,R24
.dbline 253
.dbline 254
; break;
rjmp L103
L115:
.dbline 256
; case 0x20: //"上一位"键处理
; if(Flag==temp1)
mov R24,R28
mov R25,R29
adiw R24,3
cp R22,R24
cpc R23,R25
brne L116
.dbline 257
; {(*Flag)&=0x7f;
.dbline 257
mov R30,R22
mov R31,R23
ldd R24,z+0
andi R24,127
std z+0,R24
.dbline 258
; Flag=temp1+13;
mov R22,R28
mov R23,R29
subi R22,240 ; offset = 16
sbci R23,255
.dbline 259
; (*Flag)|=0x80;}
mov R30,R22
mov R31,R23
ldd R24,z+0
ori R24,128
std z+0,R24
.dbline 259
rjmp L117
L116:
.dbline 260
; else Flag--;
subi R22,1
sbci R23,0
L117:
.dbline 261
; (*Flag)|=0x80; //当前位加上小数点显示
mov R30,R22
mov R31,R23
ldd R24,z+0
ori R24,128
std z+0,R24
.dbline 262
; (*(Flag+1))&=0x7f; //下一位去掉点小数点显示
adiw R30,1
ldd R24,z+0
andi R24,127
std z+0,R24
.dbline 263
; break;
rjmp L103
L119:
.dbline 264
; case 0x40:Enter_Flag=1;break;//"确定"键处理
ldi R24,1
sts _Enter_Flag,R24
.dbline 264
.dbline 266
; // case 0x80:Enter_Flag=1;break; //测试用
; default:break;}
L103:
.dbline 268
L96:
.dbline 233
lds R2,_Enter_Flag
tst R2
brne X11
rjmp L95
X11:
.dbline 269
;
; }
; Enter_Flag=0; //按键状态恢复
clr R2
sts _Enter_Flag,R2
.dbline 270
; temp2[0]=0x00; //秒,默认从00开始计时
std y+20,R2
.dbline 271
; temp2[1]=(temp1[11]<<4)|temp1[12];//分
ldd R2,y+15
ldd R24,y+14
andi R24,#0x0F
swap R24
or R24,R2
std y+21,R24
.dbline 272
; temp2[2]=(temp1[9]<<4)|temp1[10]; //时
ldd R2,y+13
ldd R24,y+12
andi R24,#0x0F
swap R24
or R24,R2
std y+22,R24
.dbline 273
; temp2[3]=temp1[8]; //周
ldd R2,y+11
std y+23,R2
.dbline 274
; temp2[4]=(temp1[6]<<4)|temp1[7]; //日
ldd R2,y+10
ldd R24,y+9
andi R24,#0x0F
swap R24
or R24,R2
std y+24,R24
.dbline 275
; temp2[5]=(temp1[4]<<4)|temp1[5]; //月
ldd R2,y+8
ldd R24,y+7
andi R24,#0x0F
swap R24
or R24,R2
std y+25,R24
.dbline 276
; temp2[6]=(temp1[2]<<4)|temp1[3]; //年
ldd R2,y+6
ldd R24,y+5
andi R24,#0x0F
swap R24
or R24,R2
std y+26,R24
.dbline 277
; Write_Nbyte(SD2303,0x00,temp2,7); //初始化设定时间
ldi R24,7
std y+2,R24
mov R24,R28
mov R25,R29
adiw R24,20
std y+1,R25
std y+0,R24
clr R18
ldi R16,100
rcall _Write_Nbyte
.dbline 278
; }
L93:
.dbline 279
; if(Key==0xfd) //"闹铃设置"键按下
mov R24,R10
cpi R24,253
breq X12
rjmp L141
X12:
.dbline 280
; {temp1[9]|=0x80;
.dbline 280
ldd R24,y+12
ori R24,128
std y+12,R24
.dbline 281
; Flag=temp1+9; //定时小时高位设置提示
mov R22,R28
mov R23,R29
subi R22,244 ; offset = 12
sbci R23,255
rjmp L146
L145:
.dbline 283
; while(!Enter_Flag) //直到按下确定键方停止
; {for(i=0;i<50;i++)
.dbline 283
clr R20
rjmp L151
L148:
.dbline 284
mov R16,R28
mov R17,R29
subi R16,253 ; offset = 3
sbci R17,255
rcall _Display
L149:
.dbline 283
inc R20
L151:
.dbline 283
cpi R20,50
brlo L148
.dbline 285
; Display(temp1);
; Key=~PINB;
in R10,0x16
com R10
.dbline 286
; switch(Key)
mov R12,R10
clr R13
mov R24,R12
mov R25,R13
cpi R24,16
ldi R30,0
cpc R25,R30
brne X13
rjmp L161
X13:
ldi R24,16
cp R24,R12
cpc R25,R13
brlt L173
L172:
mov R24,R12
mov R25,R13
cpi R24,4
ldi R30,0
cpc R25,R30
breq L155
cpi R24,4
ldi R30,0
cpc R25,R30
brge X14
rjmp L153
X14:
L174:
mov R24,R12
mov R25,R13
cpi R24,8
ldi R30,0
cpc R25,R30
breq L158
rjmp L153
L173:
mov R24,R12
mov R25,R13
cpi R24,32
ldi R30,0
cpc R25,R30
brne X15
rjmp L166
X15:
cpi R24,32
ldi R30,0
cpc R25,R30
brge X16
rjmp L153
X16:
L175:
mov R24,R12
mov R25,R13
cpi R24,64
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -