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

📄 eeprom.lst

📁 实现MEGA16的EEPROM的读和写操作
💻 LST
字号:
__text_start:
__start:
    0030 E5CF      LDI	R28,0x5F
    0031 E0D4      LDI	R29,4
    0032 BFCD      OUT	P3D,R28
    0033 BFDE      OUT	P3E,R29
    0034 51C0      SUBI	R28,0x10
    0035 40D0      SBCI	R29,0
    0036 EA0A      LDI	R16,0xAA
    0037 8308      STD	R16,0+Y
    0038 2400      CLR	R0
    0039 E6E0      LDI	R30,0x60
    003A E0F0      LDI	R31,0
    003B E010      LDI	R17,0
    003C 36E0      CPI	R30,0x60
    003D 07F1      CPC	R31,R17
    003E F011      BEQ	0x0041
    003F 9201      ST	R0,Z+
    0040 CFFB      RJMP	0x003C
    0041 8300      STD	R16,0+Z
    0042 E6E0      LDI	R30,0x60
    0043 E0F0      LDI	R31,0
    0044 E6A0      LDI	R26,0x60
    0045 E0B0      LDI	R27,0
    0046 E010      LDI	R17,0
    0047 36E0      CPI	R30,0x60
    0048 07F1      CPC	R31,R17
    0049 F021      BEQ	0x004E
    004A 95C8      LPM
    004B 9631      ADIW	R30,1
    004C 920D      ST	R0,X+
    004D CFF9      RJMP	0x0047
    004E 940E00BF  CALL	_main
_exit:
    0050 CFFF      RJMP	_exit
_Delayus:
  i                    --> R20
  US                   --> R22
    0051 940E00F9  CALL	push_gset2
    0053 01B8      MOVW	R22,R16
FILE: C:\icc\include\AVR_PQ1A.h
(0001) /*******************************************
(0002)   文件:AVR_PQ1A.H
(0003)   功能:定义一些AVR_PQ1A开发板上应用程序用到的常量
(0004) /******************************************/
(0005) 
(0006) #include <iom16v.h>			//包含型号头文件
(0007) #include <macros.h>			//包含"位"操作头文件
(0008) 
(0009) /******************数据类型宏定义******************/
(0010) #define uchar unsigned char
(0011) #define uint unsigned int
(0012) 
(0013) /******************数码管和LED常量******************/
(0014) #define LEDLK PA2	//LED锁存器控制端
(0015) #define SEGLK PA3	//数码管段选锁存器控制端
(0016) #define BITLK PA4	//数码管位选锁存器控制端
(0017) 
(0018) #define TRUE 1
(0019) #define FALSE 0
(0020) #define ALLLED 0XFF
(0021) /*******************************************
(0022) 函数名称: Delayus
(0023) 功    能: 延时指定微秒(8M晶振)
(0024) 参    数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
(0025) 返回值  : 无
(0026) /********************************************/
(0027) void Delayus(uint US)		  
(0028) {
(0029)  uint i;
(0030)  US=US*5/4;		  	 //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
    0054 E005      LDI	R16,5
    0055 E010      LDI	R17,0
    0056 019B      MOVW	R18,R22
    0057 940E00D2  CALL	empy16s
    0059 01B8      MOVW	R22,R16
    005A 9576      LSR	R23
    005B 9567      ROR	R22
    005C 9576      LSR	R23
    005D 9567      ROR	R22
(0031)  for( i=0;i<US;i++); 
    005E 2744      CLR	R20
    005F 2755      CLR	R21
    0060 C002      RJMP	0x0063
    0061 5F4F      SUBI	R20,0xFF
    0062 4F5F      SBCI	R21,0xFF
    0063 1746      CP	R20,R22
    0064 0757      CPC	R21,R23
    0065 F3D8      BCS	0x0061
(0032) }
    0066 940E00FD  CALL	pop_gset2
    0068 9508      RET
_Delayms:
  i                    --> R20
  j                    --> R22
  MS                   --> R16
    0069 940E00F9  CALL	push_gset2
(0033) /*******************************************
(0034) 函数名称: Delayms
(0035) 功    能: 延时指定毫秒(8M晶振)
(0036) 参    数: MS--延时的毫秒数
(0037) 返回值  : 无
(0038) /********************************************/
(0039) void Delayms(uint MS)		  
(0040) {
(0041)  uint i,j;
(0042)  for( i=0;i<MS;i++)
    006B 2744      CLR	R20
    006C 2755      CLR	R21
    006D C00B      RJMP	0x0079
(0043)  for(j=0;j<1141;j++);	//1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
    006E 2766      CLR	R22
    006F 2777      CLR	R23
    0070 C002      RJMP	0x0073
    0071 5F6F      SUBI	R22,0xFF
    0072 4F7F      SBCI	R23,0xFF
    0073 3765      CPI	R22,0x75
    0074 E0E4      LDI	R30,4
    0075 077E      CPC	R23,R30
    0076 F3D0      BCS	0x0071
    0077 5F4F      SUBI	R20,0xFF
    0078 4F5F      SBCI	R21,0xFF
    0079 1740      CP	R20,R16
    007A 0751      CPC	R21,R17
    007B F390      BCS	0x006E
(0044) }
    007C 940E00FD  CALL	pop_gset2
    007E 9508      RET
(0045) /*******************************************
(0046) 函数名称: Board_init
(0047) 功    能: 初始化实验板,关闭全部功能
(0048) 参    数: 无
(0049) 返回值  : 无
(0050) /********************************************/
(0051) void Board_init(void)
(0052) {
(0053) 	DDRA=0xFF;	//将四个IO口全部配置为输出
_Board_init:
    007F EF8F      LDI	R24,0xFF
    0080 BB8A      OUT	P1A,R24
(0054) 	DDRB=0xFF;
    0081 BB87      OUT	P17,R24
(0055) 	DDRC=0xFF;
    0082 BB84      OUT	P14,R24
(0056) 	DDRD=0xFF;
    0083 BB81      OUT	P11,R24
(0057) 
(0058) 	SPCR=0x00;	//还原SPI口,使其为正常端口	
    0084 2422      CLR	R2
    0085 B82D      OUT	P0D,R2
(0059) 
(0060) 	PORTA|=BIT(PA6);//(BEEP)关闭蜂鸣器
    0086 9ADE      SBI	P1B,6
(0061) 	PORTC&=~BIT(PC6);	  //(RELAY)初始化继电器为常闭连接状态	
    0087 98AE      CBI	P15,6
(0062) 	PORTA&=~BIT(PA1);	//关闭SPI总线DA
    0088 98D9      CBI	P1B,1
(0063) 	PORTB=0xFF;	//关闭LED
    0089 BB88      OUT	P18,R24
(0064) 	PORTA|=BIT(LEDLK);	//锁存数据,使LED熄灭
    008A 9ADA      SBI	P1B,2
(0065)  	Delayus(5);		
    008B E005      LDI	R16,5
    008C E010      LDI	R17,0
    008D DFC3      RCALL	_Delayus
(0066)  	PORTA&=~BIT(LEDLK);
    008E 98DA      CBI	P1B,2
(0067) 	
(0068) 	PORTB=0x00;	   //输出段选
    008F 2422      CLR	R2
    0090 BA28      OUT	P18,R2
(0069)  	PORTA|=BIT(SEGLK);		  
    0091 9ADB      SBI	P1B,3
(0070)  	Delayus(50);			  
    0092 E302      LDI	R16,0x32
    0093 E010      LDI	R17,0
    0094 DFBC      RCALL	_Delayus
(0071)  	PORTA&=~BIT(SEGLK);	    
    0095 98DB      CBI	P1B,3
(0072)  	
(0073)  	PORTB=0xFF;	   //输出位选
    0096 EF8F      LDI	R24,0xFF
    0097 BB88      OUT	P18,R24
(0074)  	PORTA|=BIT(BITLK);		   
    0098 9ADC      SBI	P1B,4
(0075)  	Delayus(50);				   
    0099 E302      LDI	R16,0x32
    009A E010      LDI	R17,0
    009B DFB5      RCALL	_Delayus
(0076)  	PORTA&=~BIT(BITLK);	   
    009C 98DC      CBI	P1B,4
(0077) 	
(0078) 	PORTD=0xFF;
    009D EF8F      LDI	R24,0xFF
    009E BB82      OUT	P12,R24
(0079) 	PORTA|=BIT(PA7);
    009F 9ADF      SBI	P1B,7
(0080) 	Delayus(50);
    00A0 E302      LDI	R16,0x32
    00A1 E010      LDI	R17,0
    00A2 DFAE      RCALL	_Delayus
(0081) 	PORTA&=~BIT(PA7);
    00A3 98DF      CBI	P1B,7
(0082) 
(0083) 	
(0084) }
    00A4 9508      RET
FILE: C:\icc\examples.avr\AVR_PQ1A_DEMO\18_EEPROM\EEPROM.c
(0001) /*******************************************
(0002)   文件:EEPROM.C
(0003)   环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
(0004)   硬件:ATMEGA16芯片
(0005)   日期:2006年12月10日 
(0006)   功能:实现MEGA16的EEPROM的读和写操作
(0007)   备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
(0008) /******************************************/
(0009) #include <iom16v.h>			//包含型号头文件
(0010) #include <macros.h>			//包含"位"操作头文件
(0011) #include <stdio.h>			//标准输入输出头文件
(0012) #include <AVR_PQ1A.h>		//包含自定义常量头文件
(0013) 
(0014) /*******************************************
(0015) 函数名称: Eeprom_writeB
(0016) 功    能: 向EEPROM中的指定地址写入一个字节
(0017) 参    数: eaddr--EEPROM的指定地址
(0018) 	  	  edata--写入EEPROM的数据
(0019) 返回值  : 无
(0020) /********************************************/
(0021) void Eeprom_writeB(uint eaddr,uchar edata)
(0022) {
(0023)  SREG&=~BIT(7);			//在写入EEPROM期间应该关闭全局中断,防止中断打断写EEPROM的特殊时序
_Eeprom_writeB:
  edata                --> R18
  eaddr                --> R16
    00A5 94F8      BCLR	7
(0024)  while(EECR&BIT(EEWE));	//等待上次写操作完毕
    00A6 99E1      SBIC	P1C,1
    00A7 CFFE      RJMP	0x00A6
(0025)  EEAR=eaddr;			//配置地址寄存器
    00A8 9310003F  STS	R17,0x3F
    00AA 9300003E  STS	R16,0x3E
(0026)  EEDR=edata;			//配置数据寄存器
    00AC BB2D      OUT	P1D,R18
(0027)  EECR|=BIT(EEMWE);		//主写使能置高
    00AD 9AE2      SBI	P1C,2
(0028)  EECR|=BIT(EEWE);		//EEMWE置高后,4个时钟周期内将EEWE置高才能将数据写入
    00AE 9AE1      SBI	P1C,1
(0029)  SREG|=BIT(7);			//写入完毕后,开放全局中断
    00AF 9478      BSET	7
(0030) }
    00B0 9508      RET
_Eeprom_readB:
  edata                --> R20
  eaddr                --> R16
    00B1 940E00E2  CALL	push_gset1
(0031) /*******************************************
(0032) 函数名称: Eeprom_readB
(0033) 功    能: 从EEPROM中的指定地址读出一个字节
(0034) 参    数: eaddr--EEPROM的指定地址
(0035) 返回值  : edata--读出的EEPROM数据
(0036) /********************************************/
(0037) uchar Eeprom_readB(uint eaddr)
(0038) {
(0039)  uchar edata;
(0040)  while(EECR&BIT(EEWE));	//等待上次写操作完毕
    00B3 99E1      SBIC	P1C,1
    00B4 CFFE      RJMP	0x00B3
(0041)  EEAR=eaddr;			//配置地址寄存器
    00B5 9310003F  STS	R17,0x3F
    00B7 9300003E  STS	R16,0x3E
(0042)  EECR|=BIT(EERE);		//读使能置高
    00B9 9AE0      SBI	P1C,0
(0043)  edata=EEDR;			//读出数据
    00BA B34D      IN	R20,P1D
(0044)  return edata;			//返回读出的数据
    00BB 2F04      MOV	R16,R20
    00BC 940E00E5  CALL	pop_gset1
    00BE 9508      RET
(0045) }
(0046) /*******************************************
(0047) 函数名称: main
(0048) 功    能: 实现EEPROM的0-254地址单元写入0-254,然后读出
(0049) 参    数: 无
(0050) 返回值  : 无
(0051) /********************************************/
(0052) void main(void)
(0053) {
(0054)  uchar i; 
(0055)  Board_init( );	   							  //初始化开发板 
_main:
  i                    --> R20
    00BF DFBF      RCALL	_Board_init
(0056)  for(i=0;i<255;i++)							  //连续写入
    00C0 2744      CLR	R20
    00C1 C005      RJMP	0x00C7
(0057)  {
(0058)   Eeprom_writeB(i,i);
    00C2 2F24      MOV	R18,R20
    00C3 2F04      MOV	R16,R20
    00C4 2711      CLR	R17
    00C5 DFDF      RCALL	_Eeprom_writeB
    00C6 9543      INC	R20
    00C7 3F4F      CPI	R20,0xFF
    00C8 F3C8      BCS	0x00C2
(0059)  }
(0060)  for(i=0;i<255;i++)	 						  //连续读出
    00C9 2744      CLR	R20
    00CA C004      RJMP	0x00CF
(0061)  {
(0062)   Eeprom_readB(i);
    00CB 2F04      MOV	R16,R20
    00CC 2711      CLR	R17
    00CD DFE3      RCALL	_Eeprom_readB
    00CE 9543      INC	R20
    00CF 3F4F      CPI	R20,0xFF
    00D0 F3D0      BCS	0x00CB
(0063)  }
(0064) }FILE: <library>
    00D1 9508      RET
empy16s:
    00D2 920A      ST	R0,-Y
    00D3 921A      ST	R1,-Y
    00D4 938A      ST	R24,-Y
    00D5 939A      ST	R25,-Y
    00D6 9F02      MUL	R16,R18
    00D7 01C0      MOVW	R24,R0
    00D8 9F12      MUL	R17,R18
    00D9 0D90      ADD	R25,R0
    00DA 9F03      MUL	R16,R19
    00DB 0D90      ADD	R25,R0
    00DC 018C      MOVW	R16,R24
    00DD 9199      LD	R25,Y+
    00DE 9189      LD	R24,Y+
    00DF 9019      LD	R1,Y+
    00E0 9009      LD	R0,Y+
    00E1 9508      RET
push_gset1:
    00E2 935A      ST	R21,-Y
    00E3 934A      ST	R20,-Y
    00E4 9508      RET
pop_gset1:
    00E5 E0E1      LDI	R30,1
pop:
    00E6 9149      LD	R20,Y+
    00E7 9159      LD	R21,Y+
    00E8 FDE0      SBRC	R30,0
    00E9 9508      RET
    00EA 9169      LD	R22,Y+
    00EB 9179      LD	R23,Y+
    00EC FDE1      SBRC	R30,1
    00ED 9508      RET
    00EE 90A9      LD	R10,Y+
    00EF 90B9      LD	R11,Y+
    00F0 FDE2      SBRC	R30,2
    00F1 9508      RET
    00F2 90C9      LD	R12,Y+
    00F3 90D9      LD	R13,Y+
    00F4 FDE3      SBRC	R30,3
    00F5 9508      RET
    00F6 90E9      LD	R14,Y+
    00F7 90F9      LD	R15,Y+
    00F8 9508      RET
push_gset2:
    00F9 937A      ST	R23,-Y
    00FA 936A      ST	R22,-Y
    00FB 940C00E2  JMP	push_gset1
pop_gset2:
    00FD E0E2      LDI	R30,2
    00FE 940C00E6  JMP	pop

⌨️ 快捷键说明

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