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

📄 eeprom.lst

📁 使用ICCAVR编写的AT24C16的读写函数
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0067) 
(0068) /*从DS1302读出一字节数据*/
(0069) unsigned char ds1302_read_byte(unsigned char addr) {
(0070) 
(0071) 	unsigned char i;
(0072) 	unsigned char temp;
(0073) 	RST_SET;					/*启动DS1302总线*/
    027A 9A1C      SBI	0x03,4
(0074) 
(0075) 	/*写入目标地址:addr*/
(0076) 	IO_OUT;
    027B 9A13      SBI	0x02,3
(0077) 	addr = addr | 0x01;/*最低位置高*/
    027C 6001      ORI	R16,1
(0078) 	for (i = 0; i < 8; i ++) {
    027D 2766      CLR	R22
    027E C009      RJMP	0x0288
(0079) 		if (addr & 0x01) {
    027F FF00      SBRS	R16,0
    0280 C002      RJMP	0x0283
(0080) 			IO_SET;
    0281 9A1B      SBI	0x03,3
(0081) 			}
    0282 C001      RJMP	0x0284
(0082) 		else {
(0083) 			IO_CLR;
    0283 981B      CBI	0x03,3
(0084) 			}
(0085) 		SCK_SET;
    0284 9A1A      SBI	0x03,2
(0086) 		SCK_CLR;
    0285 981A      CBI	0x03,2
(0087) 		addr = addr >> 1;
    0286 9506      LSR	R16
    0287 9563      INC	R22
    0288 3068      CPI	R22,0x8
    0289 F3A8      BCS	0x027F
(0088) 		}
(0089) 	
(0090) 	/*输出数据:temp*/
(0091) 	IO_IN;
    028A 9813      CBI	0x02,3
(0092) 	for (i = 0; i < 8; i ++) {
    028B 2766      CLR	R22
    028C C009      RJMP	0x0296
(0093) 		temp = temp >> 1;
    028D 9546      LSR	R20
(0094) 		if (IO_R) {
    028E 9B0B      SBIS	0x01,3
    028F C002      RJMP	0x0292
(0095) 			temp |= 0x80;
    0290 6840      ORI	R20,0x80
(0096) 			}
    0291 C001      RJMP	0x0293
(0097) 		else {
(0098) 			temp &= 0x7F;
    0292 774F      ANDI	R20,0x7F
(0099) 			}
(0100) 		SCK_SET;
    0293 9A1A      SBI	0x03,2
(0101) 		SCK_CLR;
    0294 981A      CBI	0x03,2
    0295 9563      INC	R22
    0296 3068      CPI	R22,0x8
    0297 F3A8      BCS	0x028D
(0102) 		}
(0103) 	
(0104) 	RST_CLR;					/*停止DS1302总线*/
    0298 981C      CBI	0x03,4
(0105) 	return temp;
    0299 2F04      MOV	R16,R20
    029A 940E0361  CALL	pop_gset2
    029C 9508      RET
(0106) }
(0107) 
(0108) /*向DS302写入时钟数据*/
(0109) void ds1302_write_time(void) {
(0110) 
(0111) 	ds1302_write_byte(ds1302_control_add,0x00);			//关闭写保护 
_ds1302_write_time:
    029D 2722      CLR	R18
    029E E80E      LDI	R16,0x8E
    029F DFB4      RCALL	_ds1302_write_byte
(0112) 	ds1302_write_byte(ds1302_sec_add,0x80);				//暂停 
    02A0 E820      LDI	R18,0x80
    02A1 E800      LDI	R16,0x80
    02A2 DFB1      RCALL	_ds1302_write_byte
(0113) 	//ds1302_write_byte(ds1302_charger_add,0xa9);			//涓流充电 
(0114) 	ds1302_write_byte(ds1302_year_add,time_buf[1]);		//年 
    02A3 91200101  LDS	R18,time_buf+1
    02A5 E80C      LDI	R16,0x8C
    02A6 DFAD      RCALL	_ds1302_write_byte
(0115) 	ds1302_write_byte(ds1302_month_add,time_buf[2]);	//月 
    02A7 91200102  LDS	R18,time_buf+2
    02A9 E808      LDI	R16,0x88
    02AA DFA9      RCALL	_ds1302_write_byte
(0116) 	ds1302_write_byte(ds1302_date_add,time_buf[3]);		//日 
    02AB 91200103  LDS	R18,time_buf+3
    02AD E806      LDI	R16,0x86
    02AE DFA5      RCALL	_ds1302_write_byte
(0117) 	ds1302_write_byte(ds1302_day_add,time_buf[7]);		//周 
    02AF 91200107  LDS	R18,0x107
    02B1 E80A      LDI	R16,0x8A
    02B2 DFA1      RCALL	_ds1302_write_byte
(0118) 	ds1302_write_byte(ds1302_hr_add,time_buf[4]);		//时 
    02B3 91200104  LDS	R18,0x104
    02B5 E804      LDI	R16,0x84
    02B6 DF9D      RCALL	_ds1302_write_byte
(0119) 	ds1302_write_byte(ds1302_min_add,time_buf[5]);		//分
    02B7 91200105  LDS	R18,0x105
    02B9 E802      LDI	R16,0x82
    02BA DF99      RCALL	_ds1302_write_byte
(0120) 	ds1302_write_byte(ds1302_sec_add,time_buf[6]);		//秒
    02BB 91200106  LDS	R18,0x106
    02BD E800      LDI	R16,0x80
    02BE DF95      RCALL	_ds1302_write_byte
(0121) 	ds1302_write_byte(ds1302_day_add,time_buf[7]);		//周 
    02BF 91200107  LDS	R18,0x107
    02C1 E80A      LDI	R16,0x8A
    02C2 DF91      RCALL	_ds1302_write_byte
(0122) 	ds1302_write_byte(ds1302_control_add,0x80);			//打开写保护 
    02C3 E820      LDI	R18,0x80
    02C4 E80E      LDI	R16,0x8E
    02C5 DF8E      RCALL	_ds1302_write_byte
    02C6 9508      RET
(0123) }
(0124) 
(0125) /*从DS302读出时钟数据*/
(0126) void ds1302_read_time(void)  { 
(0127) 
(0128) 	time_buf[1]=ds1302_read_byte(ds1302_year_add);		//年 
_ds1302_read_time:
    02C7 E80C      LDI	R16,0x8C
    02C8 DFAF      RCALL	_ds1302_read_byte
    02C9 93000101  STS	time_buf+1,R16
(0129) 	time_buf[2]=ds1302_read_byte(ds1302_month_add);		//月 
    02CB E808      LDI	R16,0x88
    02CC DFAB      RCALL	_ds1302_read_byte
    02CD 93000102  STS	time_buf+2,R16
(0130) 	time_buf[3]=ds1302_read_byte(ds1302_date_add);		//日 
    02CF E806      LDI	R16,0x86
    02D0 DFA7      RCALL	_ds1302_read_byte
    02D1 93000103  STS	time_buf+3,R16
(0131) 	time_buf[4]=ds1302_read_byte(ds1302_hr_add);		//时 
    02D3 E804      LDI	R16,0x84
    02D4 DFA3      RCALL	_ds1302_read_byte
    02D5 93000104  STS	0x104,R16
(0132) 	time_buf[5]=ds1302_read_byte(ds1302_min_add);		//分 
    02D7 E802      LDI	R16,0x82
    02D8 DF9F      RCALL	_ds1302_read_byte
    02D9 93000105  STS	0x105,R16
(0133) 	time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7F;//秒 
    02DB E800      LDI	R16,0x80
    02DC DF9B      RCALL	_ds1302_read_byte
    02DD 2F80      MOV	R24,R16
    02DE 778F      ANDI	R24,0x7F
    02DF 93800106  STS	0x106,R24
(0134) 	time_buf[7]=ds1302_read_byte(ds1302_day_add);		//周 
    02E1 E80A      LDI	R16,0x8A
    02E2 DF95      RCALL	_ds1302_read_byte
    02E3 93000107  STS	0x107,R16
    02E5 9508      RET
(0135) }
(0136) 
(0137) /*DS302初始化函数*/
(0138) void ds1302_init(void) {
(0139) 	
(0140) 	RST_CLR;			/*RST脚置低*/
_ds1302_init:
    02E6 981C      CBI	0x03,4
(0141) 	SCK_CLR;			/*SCK脚置低*/
    02E7 981A      CBI	0x03,2
(0142) 	RST_OUT;			/*RST脚设置为输出*/
    02E8 9A14      SBI	0x02,4
(0143) 	SCK_OUT;			/*SCK脚设置为输出*/
    02E9 9A12      SBI	0x02,2
    02EA 9508      RET
_delay_ms:
  a                    --> R20
  b                    --> R22
  i                    --> R16
    02EB 940E036D  CALL	push_gset2
FILE: E:\icc\eeprom\eeprom.c
(0001) //ICC-AVR application builder : 2008-10-8 下午 04:03:04
(0002) // Target : M128
(0003) // Crystal: 8.0000Mhz
(0004) 
(0005) #include <iom128v.h>
(0006) #include <macros.h>
(0007) #include "lcd_init.h"
(0008) #include "eeprom_init.h"
(0009) #include "DS1302.h"
(0010) //iccavr
(0011) //extern unsigned char twi_write(unsigned char addr, unsigned char dd);
(0012) //extern unsigned char twi_read(unsigned char addr, unsigned char *dd);
(0013) /*延时函数*/
(0014) void delay_ms(unsigned char i) {
(0015)  unsigned char a, b;
(0016)  for (a = 1; a < i; a++) 
    02ED E041      LDI	R20,1
    02EE C006      RJMP	0x02F5
(0017)  {
(0018)   for (b = 1; b; b++) 
    02EF E061      LDI	R22,1
    02F0 C001      RJMP	0x02F2
    02F1 9563      INC	R22
    02F2 2366      TST	R22
    02F3 F7E9      BNE	0x02F1
    02F4 9543      INC	R20
    02F5 1740      CP	R20,R16
    02F6 F3C0      BCS	0x02EF
    02F7 940E0361  CALL	pop_gset2
    02F9 9508      RET
_main:
  temp                 --> Y+0
  time_read            --> R20
  send_flag            --> R22
  i                    --> R10
    02FA 9721      SBIW	R28,1
(0019)         {
(0020)          ;
(0021)         }
(0022)   }
(0023) }
(0024) void main(void)
(0025) {
(0026) 
(0027)  unsigned char temp,i;
(0028)  unsigned char send_flag=0,time_read=6;
    02FB 2766      CLR	R22
    02FC E046      LDI	R20,6
(0029)  PORTA = 0xFF;    /*打开上拉*/
    02FD EF8F      LDI	R24,0xFF
    02FE BB8B      OUT	0x1B,R24
(0030)  DDRA = 0x00;    /*方向输入*/
    02FF 2422      CLR	R2
    0300 BA2A      OUT	0x1A,R2
(0031)  PORTB = 0xF0;    /*电平设置*/
    0301 EF80      LDI	R24,0xF0
    0302 BB88      OUT	0x18,R24
(0032)  DDRB = 0xFF;    /*方向输出*/
    0303 EF8F      LDI	R24,0xFF
    0304 BB87      OUT	0x17,R24
(0033)  PORTC = 0xFF;
    0305 BB85      OUT	0x15,R24
(0034)  DDRC = 0x00;
    0306 BA24      OUT	0x14,R2
(0035)  PORTD = 0xFF;
    0307 BB82      OUT	0x12,R24
(0036)  DDRD = 0x00;
    0308 BA21      OUT	0x11,R2
(0037)  ds1302_init();//ds1302初始化
    0309 DFDC      RCALL	_ds1302_init
(0038)  ds1302_write_time();
    030A DF92      RCALL	_ds1302_write_time
(0039)  disp_init();
    030B DE33      RCALL	_disp_init
(0040)  for (i=0;i<20;i++)            //写入20个数据
    030C 24AA      CLR	R10
    030D C008      RJMP	0x0316
(0041)      {
(0042) 	  twi_write((0x100+i),i);
    030E 2D2A      MOV	R18,R10
    030F 2D0A      MOV	R16,R10
    0310 5000      SUBI	R16,0
    0311 DE69      RCALL	_twi_write
(0043) 	  delay(0xfff);
    0312 EF0F      LDI	R16,0xFF
    0313 E01F      LDI	R17,0xF
    0314 DD68      RCALL	_delay
    0315 94A3      INC	R10
    0316 2D8A      MOV	R24,R10
    0317 3184      CPI	R24,0x14
    0318 F3A8      BCS	0x030E
(0044) 	 }
(0045) 
(0046)  //twi_read(0x08, &temp);
(0047)  //PORTB = ~temp;
(0048)  //temp ++;
(0049)  //temp=0;
(0050)  //twi_write(0x08, temp);
(0051)  
(0052)  
(0053)  delay(0xffff);
    0319 EF0F      LDI	R16,0xFF
    031A EF1F      LDI	R17,0xFF
    031B DD61      RCALL	_delay
(0054) disp_word(0x80,"任务:EEPROM"); 
    031C E12F      LDI	R18,0x1F
    031D E031      LDI	R19,1
    031E E800      LDI	R16,0x80
    031F DDCB      RCALL	_disp_word
(0055) disp_word(0x90,"2008年10月09日");
    0320 E120      LDI	R18,0x10
    0321 E031      LDI	R19,1
    0322 E900      LDI	R16,0x90
    0323 DDC7      RCALL	_disp_word
(0056) disp_word(0x88,"AT24C16");
    0324 E028      LDI	R18,0x8
    0325 E031      LDI	R19,1
    0326 E808      LDI	R16,0x88
    0327 DDC3      RCALL	_disp_word
(0057) i=0;
    0328 24AA      CLR	R10
    0329 C01C      RJMP	0x0346
(0058) 
(0059) while (1) 
(0060)     {
(0061)     ds1302_read_time();
    032A DF9C      RCALL	_ds1302_read_time
(0062) 	disp_number16(0x8d,time_buf[6]);
    032B 91200106  LDS	R18,0x106
    032D E80D      LDI	R16,0x8D
    032E DDF0      RCALL	_disp_number16
(0063) 	if(time_buf[6]==0)
    032F 90200106  LDS	R2,0x106
    0331 2022      TST	R2
    0332 F431      BNE	0x0339
(0064) 	   {
(0065) 	    send_flag=1;
    0333 E061      LDI	R22,1
(0066) 		if(time_buf[5]==time_read)
    0334 90200105  LDS	R2,0x105
    0336 1624      CP	R2,R20
    0337 F409      BNE	0x0339
(0067) 		send_flag=0;
    0338 2766      CLR	R22
(0068) 	   }
(0069) 	   if(send_flag==1)
    0339 3061      CPI	R22,1
    033A F459      BNE	0x0346
(0070) 	   {
(0071) 	    twi_read((0x100+i),&temp);
    033B 019E      MOVW	R18,R28
    033C 2D0A      MOV	R16,R10
    033D 5000      SUBI	R16,0
    033E DE95      RCALL	_twi_read
(0072) 		i++;
    033F 94A3      INC	R10
(0073) 	    send_flag=0;
    0340 2766      CLR	R22
(0074) 		time_read=time_buf[5];
    0341 91400105  LDS	R20,0x105
(0075) 		disp_number10(0x98,temp);
FILE: <library>
    0343 8128      LDD	R18,Y+0
    0344 E908      LDI	R16,0x98
    0345 DDB8      RCALL	_disp_number10
    0346 CFE3      RJMP	0x032A
    0347 9621      ADIW	R28,1
    0348 9508      RET
mod8u:
    0349 9468      BSET	6
    034A C001      RJMP	xdiv8u
div8u:
    034B 94E8      BCLR	6
xdiv8u:
    034C 932A      ST	R18,-Y
    034D 92FA      ST	R15,-Y
    034E 92EA      ST	R14,-Y
    034F 24FF      CLR	R15
    0350 24EE      CLR	R14
    0351 E120      LDI	R18,0x10
    0352 0F00      LSL	R16
    0353 1CFF      ROL	R15
    0354 1CEE      ROL	R14
    0355 16E1      CP	R14,R17
    0356 F010      BCS	0x0359
    0357 1AE1      SUB	R14,R17
    0358 9503      INC	R16
    0359 952A      DEC	R18
    035A F7B9      BNE	0x0352
    035B F40E      BRTC	0x035D
    035C 2D0E      MOV	R16,R14
    035D 90E9      LD	R14,Y+
    035E 90F9      LD	R15,Y+
    035F 9129      LD	R18,Y+
    0360 9508      RET
pop_gset2:
    0361 E0E2      LDI	R30,2
    0362 940C0373  JMP	pop
pop_gset3:
    0364 E0E4      LDI	R30,4
    0365 940C0373  JMP	pop
push_gset5:
    0367 92FA      ST	R15,-Y
    0368 92EA      ST	R14,-Y
push_gset4:
    0369 92DA      ST	R13,-Y
    036A 92CA      ST	R12,-Y
push_gset3:
    036B 92BA      ST	R11,-Y
    036C 92AA      ST	R10,-Y
push_gset2:
    036D 937A      ST	R23,-Y
    036E 936A      ST	R22,-Y
push_gset1:
    036F 935A      ST	R21,-Y
    0370 934A      ST	R20,-Y
    0371 9508      RET
pop_gset1:
    0372 E0E1      LDI	R30,1
pop:
    0373 9149      LD	R20,Y+
    0374 9159      LD	R21,Y+
    0375 FDE0      SBRC	R30,0
    0376 9508      RET
    0377 9169      LD	R22,Y+
    0378 9179      LD	R23,Y+
    0379 FDE1      SBRC	R30,1
    037A 9508      RET
    037B 90A9      LD	R10,Y+
    037C 90B9      LD	R11,Y+
    037D FDE2      SBRC	R30,2
    037E 9508      RET
    037F 90C9      LD	R12,Y+
    0380 90D9      LD	R13,Y+
    0381 FDE3      SBRC	R30,3
    0382 9508      RET
    0383 90E9      LD	R14,Y+
    0384 90F9      LD	R15,Y+
    0385 9508      RET

⌨️ 快捷键说明

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