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

📄 eeprom.lst

📁 avr mega16 读取内部EEPRom
💻 LST
字号:
__text_start:
__start:
    0033 E5CF      LDI	R28,0x5F
    0034 E0D4      LDI	R29,4
    0035 BFCD      OUT	0x3D,R28
    0036 BFDE      OUT	0x3E,R29
    0037 51C0      SUBI	R28,0x10
    0038 40D0      SBCI	R29,0
    0039 EA0A      LDI	R16,0xAA
    003A 8308      STD	Y+0,R16
    003B 2400      CLR	R0
    003C E6E8      LDI	R30,0x68
    003D E0F0      LDI	R31,0
    003E E010      LDI	R17,0
    003F 36E8      CPI	R30,0x68
    0040 07F1      CPC	R31,R17
    0041 F011      BEQ	0x0044
    0042 9201      ST	R0,Z+
    0043 CFFB      RJMP	0x003F
    0044 8300      STD	Z+0,R16
    0045 E5EE      LDI	R30,0x5E
    0046 E0F0      LDI	R31,0
    0047 E6A0      LDI	R26,0x60
    0048 E0B0      LDI	R27,0
    0049 E010      LDI	R17,0
    004A 36E6      CPI	R30,0x66
    004B 07F1      CPC	R31,R17
    004C F021      BEQ	0x0051
    004D 95C8      LPM
    004E 9631      ADIW	R30,1
    004F 920D      ST	R0,X+
    0050 CFF9      RJMP	0x004A
    0051 940E00C5  CALL	_main
_exit:
    0053 CFFF      RJMP	_exit
FILE: D:\YM200\内部EEPROM\main.c
(0001) /*内部EEPROM读写实验,本实验涉及数码管串行显示,建议在掌握数码管串行显示的
(0002) 基础上,来学习本例程。本实验可记录系统启动次数,每启动一次,数码管显示数据
(0003) 加一,此数据保存于ATmega16内部EEPROM中。*/
(0004) #include <iom16v.h>
(0005) #include <macros.h>
(0006) #include <led.h>
(0007) 
(0008) #define uchar unsigned char
(0009) #define uint unsigned int
(0010) 
(0011) const uchar tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管段码
(0012) uchar buff[8]={0,0,0,0,0,0,0,0};                          //8位显示缓冲区
(0013) 
(0014) 
(0015) extern void EEPROM_write(unsigned int addr, unsigned char dd);
(0016) extern void EEPROM_read(unsigned int addr,unsigned char *dd);
(0017) 
(0018) /*-------------------------------------------------------------------
(0019) delay      :短延时函数
(0020) 输入参数 x :粗略延时,x越大,延时越长
(0021) 输出参数   :无
(0022) --------------------------------------------------------------------*/
(0023) void delay(unsigned int x)
(0024) {
(0025)   while(x--);
_delay:
  x                    --> R16
    0054 0118      MOVW	R2,R16
    0055 5001      SUBI	R16,1
    0056 4010      SBCI	R17,0
    0057 2022      TST	R2
    0058 F7D9      BNE	0x0054
    0059 2033      TST	R3
    005A F7C9      BNE	0x0054
    005B 9508      RET
_L_delay:
  y                    --> R20
    005C 940E0125  CALL	push_gset1
    005E 01A8      MOVW	R20,R16
(0026)  }
(0027) /*------------------------------------------------------------------
(0028) L_delay     :长延时函数
(0029) 输入参数 y  :粗略延时,y越大,延时越长
(0030) 输出参数    :无
(0031) --------------------------------------------------------------------*/
(0032) void L_delay(unsigned int y)
(0033) {
    005F C003      RJMP	0x0063
(0034)   while(y--) delay(65000);
    0060 EE08      LDI	R16,0xE8
    0061 EF1D      LDI	R17,0xFD
    0062 DFF1      RCALL	_delay
    0063 011A      MOVW	R2,R20
    0064 5041      SUBI	R20,1
    0065 4050      SBCI	R21,0
    0066 2022      TST	R2
    0067 F7C1      BNE	0x0060
    0068 2033      TST	R3
    0069 F7B1      BNE	0x0060
    006A 940E0128  CALL	pop_gset1
    006C 9508      RET
(0035)  }
(0036) /*-----------------------------------------------------------
(0037) PORT_init   :端口初始化函数
(0038) 输入参数    :无
(0039) 输出参数    :无
(0040) ------------------------------------------------------------*/
(0041) void PORT_init(void)
(0042) {
(0043)   LED_DATA_DDR|=LED_NCS|LED_SCK|LED_MOSI;       //设置为输出
_PORT_init:
    006D B38A      IN	R24,0x1A
    006E 618C      ORI	R24,0x1C
    006F BB8A      OUT	0x1A,R24
(0044)   LED_SEL_DDR |=LED_SELA|LED_SELB|LED_SELC;     //设置为输出
    0070 B38A      IN	R24,0x1A
    0071 6E80      ORI	R24,0xE0
    0072 BB8A      OUT	0x1A,R24
(0045)    
(0046)   LED_DATA_PORT&=~(LED_NCS|LED_SCK|LED_MOSI);   //输出0
    0073 B38B      IN	R24,0x1B
    0074 7E83      ANDI	R24,0xE3
    0075 BB8B      OUT	0x1B,R24
(0047)   LED_SEL_PORT &=~(LED_SELA|LED_SELB|LED_SELC); //输出0
    0076 B38B      IN	R24,0x1B
    0077 718F      ANDI	R24,0x1F
    0078 BB8B      OUT	0x1B,R24
(0048)    
(0049)   PORTC=0xff;
    0079 EF8F      LDI	R24,0xFF
    007A BB85      OUT	0x15,R24
(0050)   DDRC=0x00;
    007B 2422      CLR	R2
    007C BA24      OUT	0x14,R2
    007D 9508      RET
_disp:
  i                    --> R20
  aa                   --> R22
  j                    --> R10
    007E 940E0121  CALL	push_gset3
(0051) }
(0052) /*-----------------------------------------------------------
(0053) disp        :数码管显示函数
(0054) 输入参数    :无
(0055) 输出参数    :无
(0056) ------------------------------------------------------------*/
(0057) void disp(void)
(0058) {
(0059)   uchar aa,i,j;
(0060)   
(0061)   for(i=0;i<8;i++)
    0080 2744      CLR	R20
    0081 C03D      RJMP	0x00BF
(0062)   {
(0063)     aa=~tab[buff[7-i]];
    0082 2E24      MOV	R2,R20
    0083 2433      CLR	R3
    0084 E0E7      LDI	R30,7
    0085 E0F0      LDI	R31,0
    0086 19E2      SUB	R30,R2
    0087 09F3      SBC	R31,R3
    0088 E680      LDI	R24,0x60
    0089 E090      LDI	R25,0
    008A 0FE8      ADD	R30,R24
    008B 1FF9      ADC	R31,R25
    008C 81E0      LDD	R30,Z+0
    008D 27FF      CLR	R31
    008E E584      LDI	R24,0x54
    008F E090      LDI	R25,0
    0090 0FE8      ADD	R30,R24
    0091 1FF9      ADC	R31,R25
    0092 9164      LPM	R22,0(Z)
    0093 9560      COM	R22
(0064) 	for(j=0;j<8;j++)
    0094 24AA      CLR	R10
    0095 C009      RJMP	0x009F
(0065) 	{
(0066) 	   if((aa&0x80)!=0) LED_DATA_PORT|=LED_MOSI;
    0096 FF67      SBRS	R22,7
    0097 C002      RJMP	0x009A
    0098 9ADC      SBI	0x1B,4
    0099 C001      RJMP	0x009B
(0067) 	   else LED_DATA_PORT&=~LED_MOSI;
    009A 98DC      CBI	0x1B,4
(0068) 	   LED_DATA_PORT|=LED_SCK; 
    009B 9ADB      SBI	0x1B,3
(0069) 	   LED_DATA_PORT&=~LED_SCK;       //产生移位信号
    009C 98DB      CBI	0x1B,3
(0070) 	   aa=(aa<<1);
    009D 0F66      LSL	R22
    009E 94A3      INC	R10
    009F 2D8A      MOV	R24,R10
    00A0 3088      CPI	R24,0x8
    00A1 F3A0      BCS	0x0096
(0071) 	}
(0072) 	LED_SEL_PORT&=0x1f;
    00A2 B38B      IN	R24,0x1B
    00A3 718F      ANDI	R24,0x1F
    00A4 BB8B      OUT	0x1B,R24
(0073) 	LED_SEL_PORT+=(i<<5);             //74HC138译码
    00A5 2E24      MOV	R2,R20
    00A6 0C22      LSL	R2
    00A7 0C22      LSL	R2
    00A8 0C22      LSL	R2
    00A9 0C22      LSL	R2
    00AA 0C22      LSL	R2
    00AB B23B      IN	R3,0x1B
    00AC 0C32      ADD	R3,R2
    00AD BA3B      OUT	0x1B,R3
(0074) 	
(0075) 	LED_DATA_PORT|= LED_NCS;
    00AE 9ADA      SBI	0x1B,2
(0076) 	LED_DATA_PORT&=~LED_NCS;          //数据输出到并行口上
    00AF 98DA      CBI	0x1B,2
(0077) 	
(0078) 	delay(2000);
    00B0 ED00      LDI	R16,0xD0
    00B1 E017      LDI	R17,7
    00B2 DFA1      RCALL	_delay
(0079) 	for(j=0;j<8;j++)                  //使输出置1
    00B3 24AA      CLR	R10
    00B4 C004      RJMP	0x00B9
(0080) 	{
(0081) 	   LED_DATA_PORT|=LED_MOSI;
    00B5 9ADC      SBI	0x1B,4
(0082) 	   LED_DATA_PORT|=LED_SCK;
    00B6 9ADB      SBI	0x1B,3
(0083) 	   LED_DATA_PORT&=~LED_SCK;
    00B7 98DB      CBI	0x1B,3
    00B8 94A3      INC	R10
    00B9 2D8A      MOV	R24,R10
    00BA 3088      CPI	R24,0x8
    00BB F3C8      BCS	0x00B5
(0084) 	}
(0085)     LED_DATA_PORT|= LED_NCS;
    00BC 9ADA      SBI	0x1B,2
(0086) 	LED_DATA_PORT&=~LED_NCS;
    00BD 98DA      CBI	0x1B,2
    00BE 9543      INC	R20
    00BF 3048      CPI	R20,0x8
    00C0 F408      BCC	0x00C2
    00C1 CFC0      RJMP	0x0082
    00C2 940E011A  CALL	pop_gset3
    00C4 9508      RET
_main:
  aa                   --> Y+0
    00C5 9721      SBIW	R28,1
(0087)   }
(0088) }  
(0089) /*-----------------------------------------------------------
(0090) main        :主函数
(0091) 输入参数    :无
(0092) 输出参数    :无
(0093) ------------------------------------------------------------*/
(0094) void main(void)
(0095) {
(0096)   uchar aa;
(0097)   PORT_init();
    00C6 DFA6      RCALL	_PORT_init
(0098)   EEPROM_read(0x08, &aa);
    00C7 019E      MOVW	R18,R28
    00C8 E008      LDI	R16,0x8
    00C9 E010      LDI	R17,0
    00CA 940E00F9  CALL	_EEPROM_read
(0099)   PORTB=~aa;
    00CC 8028      LDD	R2,Y+0
    00CD 9420      COM	R2
    00CE BA28      OUT	0x18,R2
(0100)   aa++;
    00CF 8188      LDD	R24,Y+0
    00D0 5F8F      SUBI	R24,0xFF
    00D1 8388      STD	Y+0,R24
(0101)   EEPROM_write(0x08, aa);
    00D2 2F28      MOV	R18,R24
    00D3 E008      LDI	R16,0x8
    00D4 E010      LDI	R17,0
    00D5 940E00F1  CALL	_EEPROM_write
(0102)   
(0103)   buff[7]=aa%10;
    00D7 E01A      LDI	R17,0xA
    00D8 8108      LDD	R16,Y+0
    00D9 940E0102  CALL	mod8u
    00DB 93000067  STS	0x67,R16
(0104)   buff[6]=(aa/10)%10;
    00DD E01A      LDI	R17,0xA
    00DE 8108      LDD	R16,Y+0
    00DF 940E0104  CALL	div8u
    00E1 E01A      LDI	R17,0xA
    00E2 940E0102  CALL	mod8u
    00E4 93000066  STS	0x66,R16
(0105)   buff[5]=aa/100;
    00E6 E614      LDI	R17,0x64
    00E7 8108      LDD	R16,Y+0
    00E8 940E0104  CALL	div8u
    00EA 93000065  STS	0x65,R16
    00EC C001      RJMP	0x00EE
(0106) 
(0107)   while(1)
(0108)   {
(0109)     disp(); 
    00ED DF90      RCALL	_disp
    00EE CFFE      RJMP	0x00ED
    00EF 9621      ADIW	R28,1
    00F0 9508      RET
FILE: D:\YM200\内部EEPROM\EEPROM.c
(0001) #include <iom16v.h>
(0002) /*-----------------------------------------------------------
(0003) EEPROM_write  :EEPROM单字节写入
(0004) 输入参数 addr :地址
(0005)          dd   :数据
(0006) 输出参数      :无
(0007) ------------------------------------------------------------*/
(0008) void EEPROM_write(unsigned int addr, unsigned char dd)
(0009) {
(0010)   while(EECR & (1<<EEWE));        //等待上一次写操作结束
_EEPROM_write:
  dd                   --> R18
  addr                 --> R16
    00F1 99E1      SBIC	0x1C,1
    00F2 CFFE      RJMP	_EEPROM_write
(0011)   EEAR = addr;                    //设置地址和数据寄存器
    00F3 BB1F      OUT	0x1F,R17
    00F4 BB0E      OUT	0x1E,R16
(0012)   EEDR = dd;
    00F5 BB2D      OUT	0x1D,R18
(0013)   EECR |= (1<<EEMWE);             //置位EEMWE
    00F6 9AE2      SBI	0x1C,2
(0014)   EECR |= (1<<EEWE);              //置位EEWE 以启动写操作
    00F7 9AE1      SBI	0x1C,1
    00F8 9508      RET
(0015)  }
(0016) /*-----------------------------------------------------------
(0017) EEPROM_read   :EEPROM单字节读取
(0018) 输入参数 addr :地址
(0019)          dd   :数据保存指针
(0020) 输出参数      :无
(0021) ------------------------------------------------------------*/
(0022) void EEPROM_read(unsigned int uiAddress,unsigned char *ucData)
(0023) {
(0024)   while(EECR & (1<<EEWE));         //等待上一次写操作结束
_EEPROM_read:
  ucData               --> R18
  uiAddress            --> R16
    00F9 99E1      SBIC	0x1C,1
    00FA CFFE      RJMP	_EEPROM_read
(0025)   EEAR = uiAddress;                //设置地址寄存器
    00FB BB1F      OUT	0x1F,R17
    00FC BB0E      OUT	0x1E,R16
(0026)   EECR |= (1<<EERE);               //设置EERE 以启动读操作
    00FD 9AE0      SBI	0x1C,0
(0027)   *ucData=EEDR;                     //自数据寄存器返回数据
FILE: <library>
    00FE B22D      IN	R2,0x1D
    00FF 01F9      MOVW	R30,R18
    0100 8220      STD	Z+0,R2
    0101 9508      RET
mod8u:
    0102 9468      BSET	6
    0103 C001      RJMP	xdiv8u
div8u:
    0104 94E8      BCLR	6
xdiv8u:
    0105 932A      ST	R18,-Y
    0106 92FA      ST	R15,-Y
    0107 92EA      ST	R14,-Y
    0108 24FF      CLR	R15
    0109 24EE      CLR	R14
    010A E120      LDI	R18,0x10
    010B 0F00      LSL	R16
    010C 1CFF      ROL	R15
    010D 1CEE      ROL	R14
    010E 16E1      CP	R14,R17
    010F F010      BCS	0x0112
    0110 1AE1      SUB	R14,R17
    0111 9503      INC	R16
    0112 952A      DEC	R18
    0113 F7B9      BNE	0x010B
    0114 F40E      BRTC	0x0116
    0115 2D0E      MOV	R16,R14
    0116 90E9      LD	R14,Y+
    0117 90F9      LD	R15,Y+
    0118 9129      LD	R18,Y+
    0119 9508      RET
pop_gset3:
    011A E0E4      LDI	R30,4
    011B 940C0129  JMP	pop
push_gset5:
    011D 92FA      ST	R15,-Y
    011E 92EA      ST	R14,-Y
push_gset4:
    011F 92DA      ST	R13,-Y
    0120 92CA      ST	R12,-Y
push_gset3:
    0121 92BA      ST	R11,-Y
    0122 92AA      ST	R10,-Y
push_gset2:
    0123 937A      ST	R23,-Y
    0124 936A      ST	R22,-Y
push_gset1:
    0125 935A      ST	R21,-Y
    0126 934A      ST	R20,-Y
    0127 9508      RET
pop_gset1:
    0128 E0E1      LDI	R30,1
pop:
    0129 9149      LD	R20,Y+
    012A 9159      LD	R21,Y+
    012B FDE0      SBRC	R30,0
    012C 9508      RET
    012D 9169      LD	R22,Y+
    012E 9179      LD	R23,Y+
    012F FDE1      SBRC	R30,1
    0130 9508      RET
    0131 90A9      LD	R10,Y+
    0132 90B9      LD	R11,Y+
    0133 FDE2      SBRC	R30,2
    0134 9508      RET
    0135 90C9      LD	R12,Y+
    0136 90D9      LD	R13,Y+
    0137 FDE3      SBRC	R30,3
    0138 9508      RET
    0139 90E9      LD	R14,Y+
    013A 90F9      LD	R15,Y+
    013B 9508      RET

⌨️ 快捷键说明

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