📄 rtc.lst
字号:
(0156) {Start();
010B DF72 RCALL _Start
(0157) Write_Byte(Slave);
010C 2D0E MOV R16,R14
010D DFC8 RCALL _Write_Byte
(0158) Check_Ack();
010E DF9B RCALL _Check_Ack
(0159) }while(F_Flag==1);
010F 91800070 LDS R24,_F_Flag
0111 3081 CPI R24,1
0112 F3C1 BEQ 0x010B
(0160) do
(0161) {Write_Byte(Address<<4); //送起始地址->检查应答位
0113 2D0C MOV R16,R12
0114 700F ANDI R16,0xF
0115 9502 SWAP R16
0116 DFBF RCALL _Write_Byte
(0162) Check_Ack();
0117 DF92 RCALL _Check_Ack
(0163) }while(F_Flag==1);
0118 91800070 LDS R24,_F_Flag
011A 3081 CPI R24,1
011B F3B9 BEQ 0x0113
(0164) for(k=0;k<Number;k++) //写Number个数据
011C 2744 CLR R20
011D C00B RJMP 0x0129
(0165) {Write_Byte(*Array);
011E 2DEA MOV R30,R10
011F 2DFB MOV R31,R11
0120 8100 LDD R16,Z+0
0121 DFB4 RCALL _Write_Byte
(0166) Array++;
0122 2D8A MOV R24,R10
0123 2D9B MOV R25,R11
0124 9601 ADIW R24,1
0125 2EA8 MOV R10,R24
0126 2EB9 MOV R11,R25
(0167) Check_Ack();} //检查应答位
0127 DF82 RCALL _Check_Ack
0128 9543 INC R20
0129 1746 CP R20,R22
012A F398 BCS 0x011E
(0168) Stop();
012B DF5E RCALL _Stop
(0169) }
012C D34A RCALL pop_gset5
012D 9508 RET
_Write_1byte:
Data --> R20
Address --> R22
Slave --> R10
012E D364 RCALL push_gset3
012F 2F62 MOV R22,R18
0130 2EA0 MOV R10,R16
0131 814E LDD R20,Y+6
(0170)
(0171) //****************************写一个字节子程序**********************//
(0172) //函数参数说明:
(0173) //Slave:IIC器件地址,如上文定义的SD2303
(0174) //Address:IIC器件寄存器地址
(0175) //Data:数据
(0176) void Write_1byte(uchar Slave,uchar Address,uchar Data)
(0177) {writ:do //开始->写IIC器件地址->检查应答位
(0178) {Start();
0132 DF4B RCALL _Start
(0179) Write_Byte(Slave);
0133 2D0A MOV R16,R10
0134 DFA1 RCALL _Write_Byte
(0180) Check_Ack();
0135 DF74 RCALL _Check_Ack
(0181) }while(F_Flag==1);
0136 91800070 LDS R24,_F_Flag
0138 3081 CPI R24,1
0139 F3C1 BEQ 0x0132
(0182) do
(0183) {Write_Byte(Address<<4); //送起始地址->检查应答位
013A 2F06 MOV R16,R22
013B 700F ANDI R16,0xF
013C 9502 SWAP R16
013D DF98 RCALL _Write_Byte
(0184) Check_Ack();
013E DF6B RCALL _Check_Ack
(0185) }while(F_Flag==1);
013F 91800070 LDS R24,_F_Flag
0141 3081 CPI R24,1
0142 F3B9 BEQ 0x013A
(0186) Write_Byte(Data);
0143 2F04 MOV R16,R20
0144 DF91 RCALL _Write_Byte
(0187) Check_Ack(); //检查应答位
0145 DF64 RCALL _Check_Ack
(0188) Stop(); //停止信号
0146 DF43 RCALL _Stop
(0189) }
0147 D32B RCALL pop_gset3
0148 9508 RET
_Read_Nbyte:
data0 --> R20
x --> R22
Number --> R10
Array --> R12
Address --> R14
Slave --> Y+10
0149 D30A RCALL push_arg4
014A D34E RCALL push_gset5
014B 2EE2 MOV R14,R18
014C 84CE LDD R12,Y+14
014D 84DF LDD R13,Y+15
014E 88A8 LDD R10,Y+16
(0190)
(0191)
(0192) //***************************读N个字节子程序***********************//
(0193) //函数参数说明:
(0194) //Slave:IIC器件地址,如上文定义的SD2303
(0195) //Address:起始地址
(0196) //Array:读数据存放的数组
(0197) //Number:读取的字节数
(0198) void Read_Nbyte(uchar Slave,uchar Address,uchar *Array,uchar Number)
(0199) {uchar data0,x;
(0200) //第一步:开始信号->写IIC器件地址->检查应答位
(0201) do{Start();Write_Byte(Slave);Check_Ack();}while(F_Flag==1);
014F DF2E RCALL _Start
0150 850A LDD R16,Y+10
0151 DF84 RCALL _Write_Byte
0152 DF57 RCALL _Check_Ack
0153 91800070 LDS R24,_F_Flag
0155 3081 CPI R24,1
0156 F3C1 BEQ 0x014F
(0202) //第二步:写起始地址->检查应答位
(0203) do {Write_Byte(Address<<4);Check_Ack();}while(F_Flag==1);
0157 2D0E MOV R16,R14
0158 700F ANDI R16,0xF
0159 9502 SWAP R16
015A DF7B RCALL _Write_Byte
015B DF4E RCALL _Check_Ack
015C 91800070 LDS R24,_F_Flag
015E 3081 CPI R24,1
015F F3B9 BEQ 0x0157
(0204) //第三步:开始信号->写IIC器件地址+1(表示读)->检查应答位
(0205) do{Start();Write_Byte(Slave+1);Check_Ack();}while(F_Flag==1);
0160 DF1D RCALL _Start
0161 850A LDD R16,Y+10
0162 5F0F SUBI R16,0xFF
0163 DF72 RCALL _Write_Byte
0164 DF45 RCALL _Check_Ack
0165 91800070 LDS R24,_F_Flag
0167 3081 CPI R24,1
0168 F3B9 BEQ 0x0160
(0206) //第四步:读N字节,每读完一字节发一个Ack应答,最后一字节发Nack
(0207) for(x=0;x<Number;x++)
0169 2766 CLR R22
016A C010 RJMP 0x017B
(0208) {data0=Read_Byte();*Array=data0;Array++;
016B DF7C RCALL _Read_Byte
016C 2F40 MOV R20,R16
016D 2DEC MOV R30,R12
016E 2DFD MOV R31,R13
016F 8340 STD Z+0,R20
0170 2F8E MOV R24,R30
0171 2F9F MOV R25,R31
0172 9601 ADIW R24,1
0173 2EC8 MOV R12,R24
0174 2ED9 MOV R13,R25
(0209) if(x<(Number-1)) { Ack(); }}
0175 2D8A MOV R24,R10
0176 5081 SUBI R24,1
0177 1768 CP R22,R24
0178 F408 BCC 0x017A
0179 DF1C RCALL _Ack
017A 9563 INC R22
017B 156A CP R22,R10
017C F370 BCS 0x016B
(0210) Nack();
017D DF22 RCALL _Nack
(0211) //第五步:发停止信号,结束读操作
(0212) Stop();
017E DF0B RCALL _Stop
(0213) }
017F D2F7 RCALL pop_gset5
0180 9624 ADIW R28,4
0181 9508 RET
_Key_Process:
temp3 --> Y+27
temp2 --> Y+20
Flag --> R22
Key --> R10
temp1 --> Y+3
i --> R20
0182 D313 RCALL push_gset4
0183 976E SBIW R28,0x1E
(0214)
(0215) //***************************按键处理程序**************************//
(0216) //说明:为简化程序设计,此程序不保证输入的时间数据的合理性。
(0217) void Key_Process(void)
(0218) {uchar temp1[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
0184 E080 LDI R24,0
0185 E090 LDI R25,0
0186 2FEC MOV R30,R28
0187 2FFD MOV R31,R29
0188 9633 ADIW R30,3
0189 E101 LDI R16,0x11
018A E010 LDI R17,0
018B 93FA ST R31,-Y
018C 93EA ST R30,-Y
018D 939A ST R25,-Y
018E 938A ST R24,-Y
018F D318 RCALL asgncblk
(0219) //输入数据格式依次为年、月、日、星期、小时和分钟
(0220) uchar temp2[7]={0,0,0,0,0,0,0,};
0190 E181 LDI R24,0x11
0191 E090 LDI R25,0
0192 2FEC MOV R30,R28
0193 2FFD MOV R31,R29
0194 9674 ADIW R30,0x14
0195 E007 LDI R16,7
0196 E010 LDI R17,0
0197 93FA ST R31,-Y
0198 93EA ST R30,-Y
0199 939A ST R25,-Y
019A 938A ST R24,-Y
019B D30C RCALL asgncblk
(0221) uchar temp3[3]={0,0,0xff};
019C E188 LDI R24,0x18
019D E090 LDI R25,0
019E 2FEC MOV R30,R28
019F 2FFD MOV R31,R29
01A0 967B ADIW R30,0x1B
01A1 E003 LDI R16,3
01A2 E010 LDI R17,0
01A3 93FA ST R31,-Y
01A4 93EA ST R30,-Y
01A5 939A ST R25,-Y
01A6 938A ST R24,-Y
01A7 D300 RCALL asgncblk
(0222) //输入数据格式依次为小时和分钟
(0223) uchar Key;
(0224) uchar *Flag;
(0225) uchar i;
(0226) Flag=temp1;
01A8 2F6C MOV R22,R28
01A9 2F7D MOV R23,R29
01AA 5F6D SUBI R22,0xFD
01AB 4F7F SBCI R23,0xFF
(0227) if(PIND!=0xff)
01AC B380 IN R24,0x10
01AD 3F8F CPI R24,0xFF
01AE F409 BNE 0x01B0
01AF C1C2 RJMP 0x0372
(0228) {DelayMs(20); //延时去抖
01B0 E104 LDI R16,0x14
01B1 DE8F RCALL _DelayMs
(0229) if(PIND!=0xff)
01B2 B380 IN R24,0x10
01B3 3F8F CPI R24,0xFF
01B4 F009 BEQ 0x01B6
(0230) Key=PINB;
01B5 B2A6 IN R10,0x16
(0231) if(Key==0xfe) //"时间设置"键按下
01B6 2D8A MOV R24,R10
01B7 3F8E CPI R24,0xFE
01B8 F009 BEQ 0x01BA
01B9 C0D7 RJMP 0x0291
(0232) {temp1[0]|=0x80; //年高位设置提示
01BA 818B LDD R24,Y+3
01BB 6880 ORI R24,0x80
01BC 838B STD Y+3,R24
01BD C0A0 RJMP 0x025E
(0233) while(!Enter_Flag) //直到按下确定键方停止
(0234) {for(i=0;i<50;i++)
01BE 2744 CLR R20
01BF C006 RJMP 0x01C6
(0235) Display(temp1); //显示和延时
01C0 2F0C MOV R16,R28
01C1 2F1D MOV R17,R29
01C2 5F0D SUBI R16,0xFD
01C3 4F1F SBCI R17,0xFF
01C4 DE88 RCALL _Display
01C5 9543 INC R20
01C6 3342 CPI R20,0x32
01C7 F3C0 BCS 0x01C0
(0236) Key=~PIND;
01C8 B2A0 IN R10,0x10
01C9 94A0 COM R10
(0237) switch(Key)
01CA 2CCA MOV R12,R10
01CB 24DD CLR R13
01CC 2D8C MOV R24,R12
01CD 2D9D MOV R25,R13
01CE 3180 CPI R24,0x10
01CF E0E0 LDI R30,0
01D0 079E CPC R25,R30
01D1 F409 BNE 0x01D3
01D2 C043 RJMP 0x0216
01D3 E180 LDI R24,0x10
01D4 158C CP R24,R12
01D5 059D CPC R25,R13
01D6 F094 BLT 0x01E9
01D7 2D8C MOV R24,R12
01D8 2D9D MOV R25,R13
01D9 3084 CPI R24,4
01DA E0E0 LDI R30,0
01DB 079E CPC R25,R30
01DC F101 BEQ 0x01FD
01DD 3084 CPI R24,4
01DE E0E0 LDI R30,0
01DF 079E CPC R25,R30
01E0 F40C BGE 0x01E2
01E1 C07C RJMP 0x025E
01E2 2D8C MOV R24,R12
01E3 2D9D MOV R25,R13
01E4 3088 CPI R24,0x8
01E5 E0E0 LDI R30,0
01E6 079E CPC R25,R30
01E7 F109 BEQ 0x0209
01E8 C075 RJMP 0x025E
01E9 2D8C MOV R24,R12
01EA 2D9D MOV R25,R13
01EB 3280 CPI R24,0x20
01EC E0E0 LDI R30,0
01ED 079E CPC R25,R30
01EE F409 BNE 0x01F0
01EF C04A RJMP 0x023A
01F0 3280 CPI R24,0x20
01F1 E0E0 LDI R30,0
01F2 079E CPC R25,R30
01F3 F40C BGE 0x01F5
01F4 C069 RJMP 0x025E
01F5 2D8C MOV R24,R12
01F6 2D9D MOV R25,R13
01F7 3480 CPI R24,0x40
01F8 E0E0 LDI R30,0
01F9 079E CPC R25,R30
01FA F409 BNE 0x01FC
01FB C05F RJMP 0x025B
01FC C061 RJMP 0x025E
(0238) {case 0x04: //"+"键处理
(0239) (*Flag)++;
01FD 2FE6 MOV R30,R22
01FE 2FF7 MOV R31,R23
01FF 8180 LDD R24,Z+0
0200 5F8F SUBI R24,0xFF
0201 8380 STD Z+0,R24
(0240) if(((*Flag)&0x7f)==10) *Flag=0|0x80;
0202 778F ANDI R24,0x7F
0203 308A CPI R24,0xA
0204 F009 BEQ 0x0206
0205 C058 RJMP 0x025E
0206 E880 LDI R24,0x80
0207 8380 STD Z+0,R24
(0241) break;
0208 C055 RJMP 0x025E
(0242) case 0x08: //"-"键处理
(0243) if(((*Flag)&0x7f)==0) *Flag=10|0x80;
0209 2FE6 MOV R30,R22
020A 2FF7 MOV R31,R23
020B 8180 LDD R24,Z+0
020C 778F ANDI R24,0x7F
020D F411 BNE 0x0210
020E E88A LDI R24,0x8A
020F 8380 STD Z+0,R24
(0244) (*Flag)--;
0210 2FE6 MOV R30,R22
0211 2FF7 MOV R31,R23
0212 8180 LDD R24,Z+0
0213 5081 SUBI R24,1
0214 8380 STD Z+0,R24
(0245) break;
0215 C048 RJMP 0x025E
(0246) case 0x10: //"下一位"键处理
(0247) Flag++;
0216 5F6F SUBI R22,0xFF
0217 4F7F SBCI R23,0xFF
(0248) (*(Flag-1))&=0x7f; //上一位去掉小数点显示
0218 2F86 MOV R24,R22
0219 2F97 MOV R25,R23
021A 9701 SBIW R24,1
021B 2FE8 MOV R30,R24
021C 2FF9 MOV R31,R25
021D 8180 LDD R24,Z+0
021E 778F ANDI R24,0x7F
021F 8380 STD Z+0,R24
(0249) (*Flag)|=0x80; //当前位加上小数点显示
0220 2FE6 MOV R30,R22
0221 2FF7 MOV R31,R23
0222 8180 LDD R24,Z+0
0223 6880 ORI R24,0x80
0224 8380 STD Z+0,R24
(0250) if(Flag==temp1+13)
0225 2F8C MOV R24,R28
0226 2F9D MOV R25,R29
0227 9640 ADIW R24,0x10
0228 17E8 CP R30,R24
0229 07F9 CPC R31,R25
022A F009 BEQ 0x022C
022B C032 RJMP 0x025E
(0251) {Flag=temp1;
022C 2F6C MOV R22,R28
022D 2F7D MOV R23,R29
022E 5F6D SUBI R22,0xFD
022F 4F7F SBCI R23,0xFF
(0252) (*Flag)|=0x80;
0230 2FE6 MOV R30,R22
0231 2FF7 MOV R31,R23
0232 8180 LDD R24,Z+0
0233 6880 ORI R24,0x80
0234 8380 STD Z+0,R24
(0253) (*(Flag+13))&=0x7f;}
0235 963D ADIW R30,0xD
0236 8180 LDD R24,Z+0
0237 778F ANDI R24,0x7F
0238 8380 STD Z+0,R24
(0254) break;
0239 C024 RJMP 0x025E
(0255) case 0x20: //"上一位"键处理
(0256) if(Flag==temp1)
023A 2F8C MOV R24,R28
023B 2F9D MOV R25,R29
023C 9603 ADIW R24,3
023D 1768 CP R22,R24
023E 0779 CPC R23,R25
023F F479 BNE 0x024F
(0257) {(*Flag)&=0x7f;
0240 2FE6 MOV R30,R22
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -