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

📄 e2prom.lis

📁 采用Mega16+VS1011B+SD卡制作的Mp3
💻 LIS
字号:
                        .module E2PROM.C
                        .area text(rom, con, rel)
 0000                   .dbfile D:\学习\AVRpro\Mega16程序\TestLCD\E2PROM.C
 0000                   .dbfunc e E2PROM_Write _E2PROM_Write fV
 0000           ;              i -> R10
 0000           ;            Cnt -> y+1
 0000           ;           Data -> R18,R19
 0000           ;       IAddress -> R16,R17
                        .even
 0000           _E2PROM_Write::
 0000 AA92              st -y,R10
 0002                   .dbline -1
 0002                   .dbline 17
 0002           ; //******************************************************************************
 0002           ;  //MCU:ATMEL AVR MEGA16L ,晶振频率:8MHz,频率越高,播放Mp3越流畅
 0002           ;  //用到硬件器件: MEGA16L内部的512B EEPROM
 0002           ;  //EEPROM用来保存基本的参数,如:
 0002           ;  //音量(0)、重低音(1)、当前歌曲(2,3)、遥控模式(4)
 0002           ;  //RECS80遥控按键(5-8,9-12,13-16,17-20).
 0002           ;  //RC5遥控按键(21-24,25-28,29-32,33-36).
 0002           ;  //制作人:平顶山工学院计算机系,郭猛
 0002           ; //******************************************************************************
 0002           ; # include "iom16v.h"
 0002           ; # include "macros.h"
 0002           ; 
 0002           ; //在E2PROM写入指定长度的数据
 0002           ; //IAddress:起始地址,*Data:要写入的数据首地址,Cnt:要写入的数据个数
 0002           ; //函数无返回值
 0002           ; void E2PROM_Write(unsigned int IAddress,unsigned char *Data,unsigned char Cnt)
 0002           ; {
 0002                   .dbline 19
 0002           ;    unsigned char i;
 0002           ;    CLI();     //程序进入临界区
 0002 F894              cli
 0004                   .dbline 20
 0004           ;    for(i=0;i<Cnt;i++)
 0004 AA24              clr R10
 0006 12C0              xjmp L5
 0008           L6:
 0008                   .dbline 23
 0008           ;    {
 0008           ;          //等待前一次写操作完毕
 0008           ;          while(EECR & BIT(EEWE)) ;
 0008           L7:
 0008                   .dbline 23
 0008 E199              sbic 0x1c,1
 000A FECF              rjmp L6
 000C           X0:
 000C                   .dbline 24
 000C           ;          EEAR = IAddress + i;
 000C 2A2C              mov R2,R10
 000E 3324              clr R3
 0010 2801              movw R4,R16
 0012 420C              add R4,R2
 0014 531C              adc R5,R3
 0016 5FBA              out 0x1f,R5
 0018 4EBA              out 0x1e,R4
 001A                   .dbline 25
 001A           ;          EEDR = Data[i];
 001A E22D              mov R30,R2
 001C FF27              clr R31
 001E E20F              add R30,R18
 0020 F31F              adc R31,R19
 0022 2080              ldd R2,z+0
 0024 2DBA              out 0x1d,R2
 0026                   .dbline 26
 0026           ;          EECR|= BIT(EEMWE);
 0026 E29A              sbi 0x1c,2
 0028                   .dbline 27
 0028           ;          ;;;;   //等待4个周期
 0028                   .dbline 27
 0028                   .dbline 27
 0028                   .dbline 27
 0028                   .dbline 28
 0028           ;          EECR|= BIT(EEWE);
 0028 E19A              sbi 0x1c,1
 002A                   .dbline 29
 002A           ;    } 
 002A           L3:
 002A                   .dbline 20
 002A A394              inc R10
 002C           L5:
 002C                   .dbline 20
 002C 0980              ldd R0,y+1
 002E A014              cp R10,R0
 0030 58F3              brlo L7
 0032           X1:
 0032                   .dbline 30
 0032           ;    SEI();     //程序退出临界区
 0032 7894              sei
 0034                   .dbline -2
 0034           L1:
 0034                   .dbline 0 ; func end
 0034 A990              ld R10,y+
 0036 0895              ret
 0038                   .dbsym r i 10 c
 0038                   .dbsym l Cnt 1 c
 0038                   .dbsym r Data 18 pc
 0038                   .dbsym r IAddress 16 i
 0038                   .dbend
 0038                   .dbfunc e E2PROM_Read_OneChar _E2PROM_Read_OneChar fc
 0038           ;       IAddress -> R16,R17
                        .even
 0038           _E2PROM_Read_OneChar::
 0038                   .dbline -1
 0038                   .dbline 37
 0038           ; }
 0038           ; 
 0038           ; //在E2PROM写入指定长度的数据
 0038           ; //IAddress:起始地址,*Data:要写入的数据首地址,Cnt:要写入的数据个数
 0038           ; //函数返回一个字节
 0038           ; unsigned char E2PROM_Read_OneChar(unsigned int IAddress)
 0038           ; {
 0038                   .dbline 38
 0038           ;    CLI();       //程序进入临界区
 0038 F894              cli
 003A           L10:
 003A                   .dbline 40
 003A           ;    //等待前一次操作完毕
 003A           ;    while(EECR & BIT(EEWE)) ;
 003A           L11:
 003A                   .dbline 40
 003A E199              sbic 0x1c,1
 003C FECF              rjmp L10
 003E           X2:
 003E                   .dbline 41
 003E           ;    EEAR = IAddress;
 003E 1FBB              out 0x1f,R17
 0040 0EBB              out 0x1e,R16
 0042                   .dbline 42
 0042           ;    EECR|= BIT(EERE);
 0042 E09A              sbi 0x1c,0
 0044                   .dbline 43
 0044           ;    ;    //等待1个周期
 0044                   .dbline 44
 0044           ;    SEI();      //程序退出临界区
 0044 7894              sei
 0046                   .dbline 45
 0046           ;    return EEDR;
 0046 0DB3              in R16,0x1d
 0048                   .dbline -2
 0048           L9:
 0048                   .dbline 0 ; func end
 0048 0895              ret
 004A                   .dbsym r IAddress 16 i
 004A                   .dbend
 004A           ; }

⌨️ 快捷键说明

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