⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtc.lst

📁 AVRkaifashili.rar
💻 LST
📖 第 1 页 / 共 4 页
字号:
(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 + -