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

📄 ds1302.lst

📁 AVR单片机C语言编程及应用实例 适合初学者的学习研究 其中包含Atmega16中文资料及Protel部分电路图
💻 LST
📖 第 1 页 / 共 3 页
字号:
    01D0 3A05      CPI	R16,0xA5
    01D1 F411      BNE	0x01D4
(0230) 	{
(0231) 	 exist=TRUE;							  //如果读取值与写入值相等,返回TRUE
    01D2 E041      LDI	R20,1
(0232) 	}
    01D3 C001      RJMP	0x01D5
(0233)     else 	
(0234) 	{
(0235) 	 exist=FALSE;							  //如果读取值与写入值不相等,返回FALSE
    01D4 2744      CLR	R20
(0236) 	}	
(0237) 	return exist;
    01D5 2F04      MOV	R16,R20
    01D6 940E02BA  CALL	pop_gset1
    01D8 9508      RET
(0238) }
(0239) /*******************************************
(0240) 函数名称: DS1302_init
(0241) 功    能: 初始化DS1302
(0242) 参    数: 无
(0243) 返回值  : 无
(0244) /********************************************/
(0245) void DS1302_init(void)
(0246) {
(0247)  DS1302_writeD(C_WP|WR,UPROTECT);		  //写入写允许命令
_DS1302_init:
    01D9 2722      CLR	R18
    01DA E80E      LDI	R16,0x8E
    01DB DF70      RCALL	_DS1302_writeD
(0248)  DS1302_writeD(C_SEC|WR,CLK_START);		//启动振荡器,DS1302开始工作
    01DC 2722      CLR	R18
    01DD E800      LDI	R16,0x80
    01DE DF6D      RCALL	_DS1302_writeD
(0249)  DS1302_writeD(C_WP|WR,PROTECT); 		//控制命令,WP位为1,不允许写操作	  
    01DF E820      LDI	R18,0x80
    01E0 E80E      LDI	R16,0x8E
(0250) }
    01E1 CF6A      RJMP	_DS1302_writeD
_BCD_ASCII:
  ptasc                --> R20
  BCD                  --> R22
    01E2 940E02CE  CALL	push_gset2
    01E4 01A9      MOVW	R20,R18
    01E5 2F60      MOV	R22,R16
(0251) /*******************************************
(0252) 函数名称: BCD_ASCII
(0253) 功    能: 将压缩BCD码转换成ascii码
(0254) 参    数: BCD--将要转换的压缩BCD码
(0255) 	  	  ptasc--转换后的ASCII码数组指针
(0256) 返回值  : 无
(0257) /********************************************/
(0258) void BCD_ASCII(uchar BCD,uchar ptasc[])
(0259) { 	
(0260) 	ptasc[0]=BCD/16|0x30;	//0X58	35  38 //转换十位
    01E6 E110      LDI	R17,0x10
    01E7 2F06      MOV	R16,R22
    01E8 940E0295  CALL	div8u
    01EA 2F80      MOV	R24,R16
    01EB 6380      ORI	R24,0x30
    01EC 01FA      MOVW	R30,R20
    01ED 8380      STD	R24,0+Z
(0261) 	ptasc[1]=BCD&0x0F|0x30;  //转换个位
    01EE 2F86      MOV	R24,R22
    01EF 708F      ANDI	R24,0xF
    01F0 6380      ORI	R24,0x30
    01F1 8381      STD	R24,1+Z
(0262) }
    01F2 940E02D6  CALL	pop_gset2
    01F4 9508      RET
_Disp_time:
  line1                --> Y+11
  line2                --> Y+2
  asc                  --> Y+0
  i                    --> R20
  time                 --> R22
    01F5 940E02CE  CALL	push_gset2
    01F7 01B8      MOVW	R22,R16
    01F8 9766      SBIW	R28,0x16
(0263) /*******************************************
(0264) 函数名称: Disp_time
(0265) 功    能: 在1602液晶上显示当前时间(第1行格式:年-月-日 星期;第2行格式:时-分-秒)
(0266) 参    数: time[]--时间数组
(0267) 返回值  : 无
(0268) /********************************************/
(0269) void Disp_time(uchar time[])
(0270) {
(0271)  uchar i,asc[2];
(0272)  uchar line1[11]={0,0,'-',0,0,'-',0,0,' ',0,'\0'};//显示第1行的字符数组
    01F9 E680      LDI	R24,0x60
    01FA E090      LDI	R25,0
    01FB 01FE      MOVW	R30,R28
    01FC 963B      ADIW	R30,0xB
    01FD E00B      LDI	R16,0xB
    01FE E010      LDI	R17,0
    01FF 93FA      ST	R31,-Y
    0200 93EA      ST	R30,-Y
    0201 939A      ST	R25,-Y
    0202 938A      ST	R24,-Y
    0203 940E02DC  CALL	asgncblk
(0273)  uchar line2[9]={0,0,':',0,0,':',0,0,'\0'};		  //显示第2行的字符数组
    0205 E68B      LDI	R24,0x6B
    0206 E090      LDI	R25,0
    0207 01FE      MOVW	R30,R28
    0208 9632      ADIW	R30,2
    0209 E009      LDI	R16,0x9
    020A E010      LDI	R17,0
    020B 93FA      ST	R31,-Y
    020C 93EA      ST	R30,-Y
    020D 939A      ST	R25,-Y
    020E 938A      ST	R24,-Y
    020F 940E02DC  CALL	asgncblk
(0274)  for(i=0;i<3;i++)								  //为第2行的字符数组赋值
    0211 2744      CLR	R20
    0212 C01E      RJMP	0x0231
(0275)  {
(0276)   BCD_ASCII(time[2-i],asc);
    0213 019E      MOVW	R18,R28
    0214 2E24      MOV	R2,R20
    0215 2433      CLR	R3
    0216 E0E2      LDI	R30,2
    0217 E0F0      LDI	R31,0
    0218 19E2      SUB	R30,R2
    0219 09F3      SBC	R31,R3
    021A 0FE6      ADD	R30,R22
    021B 1FF7      ADC	R31,R23
    021C 8100      LDD	R16,0+Z
    021D DFC4      RCALL	_BCD_ASCII
(0277)   line2[i*3]=asc[0];
    021E E083      LDI	R24,3
    021F 9F84      MUL	R24,R20
    0220 01F0      MOVW	R30,R0
    0221 01CE      MOVW	R24,R28
    0222 9602      ADIW	R24,2
    0223 0FE8      ADD	R30,R24
    0224 1FF9      ADC	R31,R25
    0225 8028      LDD	R2,0+Y
    0226 8220      STD	R2,0+Z
(0278)   line2[i*3+1]=asc[1];
    0227 E083      LDI	R24,3
    0228 9F84      MUL	R24,R20
    0229 01F0      MOVW	R30,R0
    022A 01CE      MOVW	R24,R28
    022B 9603      ADIW	R24,3
    022C 0FE8      ADD	R30,R24
    022D 1FF9      ADC	R31,R25
    022E 8029      LDD	R2,1+Y
    022F 8220      STD	R2,0+Z
    0230 9543      INC	R20
    0231 3043      CPI	R20,3
    0232 F300      BCS	0x0213
(0279)  } 
(0280)  BCD_ASCII(time[6],asc);   						  //为第1行的年赋值
    0233 019E      MOVW	R18,R28
    0234 01FB      MOVW	R30,R22
    0235 8106      LDD	R16,6+Z
    0236 DFAB      RCALL	_BCD_ASCII
(0281)  line1[0]=asc[0];
    0237 8028      LDD	R2,0+Y
    0238 862B      STD	R2,11+Y
(0282)  line1[1]=asc[1];
    0239 8029      LDD	R2,1+Y
    023A 862C      STD	R2,12+Y
(0283)  BCD_ASCII(time[4],asc);						  //为第1行的月赋值
    023B 019E      MOVW	R18,R28
    023C 01FB      MOVW	R30,R22
    023D 8104      LDD	R16,4+Z
    023E DFA3      RCALL	_BCD_ASCII
(0284)  line1[3]=asc[0];
    023F 8028      LDD	R2,0+Y
    0240 862E      STD	R2,14+Y
(0285)  line1[4]=asc[1];
    0241 8029      LDD	R2,1+Y
    0242 862F      STD	R2,15+Y
(0286)  BCD_ASCII(time[3],asc);						  //为第1行的日赋值
    0243 019E      MOVW	R18,R28
    0244 01FB      MOVW	R30,R22
    0245 8103      LDD	R16,3+Z
    0246 DF9B      RCALL	_BCD_ASCII
(0287)  line1[6]=asc[0];
    0247 8028      LDD	R2,0+Y
    0248 8A29      STD	R2,17+Y
(0288)  line1[7]=asc[1];
    0249 8029      LDD	R2,1+Y
    024A 8A2A      STD	R2,18+Y
(0289)  BCD_ASCII(time[5],asc);						  //为第1行的星期赋值
    024B 019E      MOVW	R18,R28
    024C 01FB      MOVW	R30,R22
    024D 8105      LDD	R16,5+Z
    024E DF93      RCALL	_BCD_ASCII
(0290)  line1[9]=asc[1];
    024F 8029      LDD	R2,1+Y
    0250 8A2C      STD	R2,20+Y
(0291)  
(0292)  while(LCD1602_readBF());
    0251 DE5A      RCALL	_LCD1602_readBF
    0252 2300      TST	R16
    0253 F7E9      BNE	0x0251
(0293)  LCD1602_gotoXY(1,2);	 						  //第1行从第3个位置开始显示
    0254 E022      LDI	R18,2
    0255 E001      LDI	R16,1
    0256 DE63      RCALL	_LCD1602_gotoXY
(0294)  LCD1602_sendstr("20");							  //将07年显示为2007的形式
    0257 E600      LDI	R16,0x60
    0258 E010      LDI	R17,0
    0259 DE3C      RCALL	_LCD1602_sendstr
(0295)  LCD1602_sendstr(line1); 						  //第1行显示
    025A 018E      MOVW	R16,R28
    025B 5F05      SUBI	R16,0xF5
    025C 4F1F      SBCI	R17,0xFF
    025D DE38      RCALL	_LCD1602_sendstr
(0296)  while(LCD1602_readBF());
    025E DE4D      RCALL	_LCD1602_readBF
    025F 2300      TST	R16
    0260 F7E9      BNE	0x025E
(0297)  LCD1602_gotoXY(2,4); 	 						  //第2行从第5个位置开始显示
    0261 E024      LDI	R18,4
    0262 E002      LDI	R16,2
    0263 DE56      RCALL	_LCD1602_gotoXY
(0298)  LCD1602_sendstr(line2);						  //第2行显示
    0264 018E      MOVW	R16,R28
    0265 5F0E      SUBI	R16,0xFE
    0266 4F1F      SBCI	R17,0xFF
    0267 DE2E      RCALL	_LCD1602_sendstr
(0299) }
    0268 9666      ADIW	R28,0x16
    0269 940E02D6  CALL	pop_gset2
    026B 9508      RET
_main:
  dis_y                --> Y+1
  dis_x                --> Y+1
  shift                --> Y+1
  setdat               --> Y+1
  setadd               --> Y+1
  settime              --> Y+7
  gettime              --> Y+0
    026C 972E      SBIW	R28,0xE
(0300) /*******************************************
(0301) 函数名称: main
(0302) 功    能: 1. 在1602液晶上显示当前时间 2.可以设置时间(M1-M9为数字0-9,M13为设置模式和显示模式选择,M14为当前设置位选择)
(0303) 参    数: 无
(0304) 返回值  : 无
(0305) /********************************************/
(0306) void main(void)
(0307) {
(0308)  	
(0309) 	
(0310) 	uchar setadd,setdat,shift;	  //setadd指定将当前数值送入DS1302的哪个寄存器
(0311)  	   						  //setdat是当前设置的数值,即被送入DS1302指定寄存器的数
(0312) 							  //shift来实现十位和各位的设置相互独立(因为十位和个位是在一个寄存器里的)
(0313)  uchar dis_x,dis_y;			  //存储1602液晶当前光标的位置
(0314)  uchar settime[7]={0x50,0x59,0x23,0x01,0x01,0x06,0x07};//设置的秒,分,时,日,月,星期,年
    026D E784      LDI	R24,0x74
    026E E090      LDI	R25,0
    026F 01FE      MOVW	R30,R28
    0270 9637      ADIW	R30,7
    0271 E007      LDI	R16,7
    0272 E010      LDI	R17,0
    0273 93FA      ST	R31,-Y
    0274 93EA      ST	R30,-Y
    0275 939A      ST	R25,-Y
    0276 938A      ST	R24,-Y
    0277 940E02DC  CALL	asgncblk
(0315)  uchar gettime[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};//保存当前时间的数组
    0279 E78B      LDI	R24,0x7B
    027A E090      LDI	R25,0
    027B 01FE      MOVW	R30,R28
    027C E007      LDI	R16,7
    027D E010      LDI	R17,0
    027E 93FA      ST	R31,-Y
    027F 93EA      ST	R30,-Y
    0280 939A      ST	R25,-Y
    0281 938A      ST	R24,-Y
    0282 940E02DC  CALL	asgncblk
(0316)  LCD1602_initial(); 		//初始化1602液晶
    0284 DE4B      RCALL	_LCD1602_initial
(0317)  DS1302_portinit();			//初始化DS1302的三根数据线
    0285 DE8F      RCALL	_DS1302_portinit
(0318)  DS1302_init();				//启动振荡器,DS1302开始工作 
    0286 DF52      RCALL	_DS1302_init
(0319)  DS1302_setT(settime);		//设置初始时间
    0287 018E      MOVW	R16,R28
    0288 5F09      SUBI	R16,0xF9
    0289 4F1F      SBCI	R17,0xFF
    028A DEFD      RCALL	_DS1302_setT
    028B C004      RJMP	0x0290
(0320)  while(1)					//以下程序完成显示和设置时间
(0321)  {
(0322)    DS1302_getT(gettime);	//获得当前时间
    028C 018E      MOVW	R16,R28
    028D DF1A      RCALL	_DS1302_getT
(0323)    
(0324)    Disp_time(gettime);		//显示当前时间
    028E 018E      MOVW	R16,R28
    028F DF65      RCALL	_Disp_time
    0290 CFFB      RJMP	0x028C
(0325)  }
(0326) }
FILE: <library>
    0291 962E      ADIW	R28,0xE
    0292 9508      RET
mod8u:
    0293 9468      BSET	6
    0294 C001      RJMP	xdiv8u
div8u:
    0295 94E8      BCLR	6
xdiv8u:
    0296 932A      ST	R18,-Y
    0297 92FA      ST	R15,-Y
    0298 24FF      CLR	R15
    0299 E028      LDI	R18,0x8
    029A 0F00      LSL	R16
    029B 1CFF      ROL	R15
    029C 16F1      CP	R15,R17
    029D F010      BCS	0x02A0
    029E 1AF1      SUB	R15,R17
    029F 9503      INC	R16
    02A0 952A      DEC	R18
    02A1 F7C1      BNE	0x029A
    02A2 F40E      BRTC	0x02A4
    02A3 2D0F      MOV	R16,R15
    02A4 90F9      LD	R15,Y+
    02A5 9129      LD	R18,Y+
    02A6 9508      RET
empy16s:
    02A7 920A      ST	R0,-Y
    02A8 921A      ST	R1,-Y
    02A9 938A      ST	R24,-Y
    02AA 939A      ST	R25,-Y
    02AB 9F02      MUL	R16,R18
    02AC 01C0      MOVW	R24,R0
    02AD 9F12      MUL	R17,R18
    02AE 0D90      ADD	R25,R0
    02AF 9F03      MUL	R16,R19
    02B0 0D90      ADD	R25,R0
    02B1 018C      MOVW	R16,R24
    02B2 9199      LD	R25,Y+
    02B3 9189      LD	R24,Y+
    02B4 9019      LD	R1,Y+
    02B5 9009      LD	R0,Y+
    02B6 9508      RET
push_gset1:
    02B7 935A      ST	R21,-Y
    02B8 934A      ST	R20,-Y
    02B9 9508      RET
pop_gset1:
    02BA E0E1      LDI	R30,1
pop:
    02BB 9149      LD	R20,Y+
    02BC 9159      LD	R21,Y+
    02BD FDE0      SBRC	R30,0
    02BE 9508      RET
    02BF 9169      LD	R22,Y+
    02C0 9179      LD	R23,Y+
    02C1 FDE1      SBRC	R30,1
    02C2 9508      RET
    02C3 90A9      LD	R10,Y+
    02C4 90B9      LD	R11,Y+
    02C5 FDE2      SBRC	R30,2
    02C6 9508      RET
    02C7 90C9      LD	R12,Y+
    02C8 90D9      LD	R13,Y+
    02C9 FDE3      SBRC	R30,3
    02CA 9508      RET
    02CB 90E9      LD	R14,Y+
    02CC 90F9      LD	R15,Y+
    02CD 9508      RET
push_gset2:
    02CE 937A      ST	R23,-Y
    02CF 936A      ST	R22,-Y
    02D0 940C02B7  JMP	push_gset1
push_gset3:
    02D2 92BA      ST	R11,-Y
    02D3 92AA      ST	R10,-Y
    02D4 940C02CE  JMP	push_gset2
pop_gset2:
    02D6 E0E2      LDI	R30,2
    02D7 940C02BB  JMP	pop
pop_gset3:
    02D9 E0E4      LDI	R30,4
    02DA 940C02BB  JMP	pop
asgncblk:
    02DC 93AA      ST	R26,-Y
    02DD 93BA      ST	R27,-Y
    02DE 93EA      ST	R30,-Y
    02DF 93FA      ST	R31,-Y
    02E0 920A      ST	R0,-Y
    02E1 81AF      LDD	R26,7+Y
    02E2 85B8      LDD	R27,8+Y
    02E3 81ED      LDD	R30,5+Y
    02E4 81FE      LDD	R31,6+Y
    02E5 3000      CPI	R16,0
    02E6 0701      CPC	R16,R17
    02E7 F031      BEQ	0x02EE
    02E8 95C8      LPM
    02E9 920D      ST	R0,X+
    02EA 9631      ADIW	R30,1
    02EB 5001      SUBI	R16,1
    02EC 4010      SBCI	R17,0
    02ED CFF7      RJMP	0x02E5
    02EE 9009      LD	R0,Y+
    02EF 91F9      LD	R31,Y+
    02F0 91E9      LD	R30,Y+
    02F1 91B9      LD	R27,Y+
    02F2 91A9      LD	R26,Y+
    02F3 9624      ADIW	R28,4
    02F4 9508      RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -