📄 e2prom.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 + -