📄 eeprom.s
字号:
.module EEPROM.c
.area text(rom, con, rel)
.dbfile C:/icc/include/AVR_PQ1A.h
.dbfunc e Delayus _Delayus fV
; i -> R20,R21
; US -> R22,R23
.even
_Delayus::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 28
; /*******************************************
; 文件:EEPROM.C
; 环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
; 硬件:ATMEGA16芯片
; 日期:2006年12月10日
; 功能:实现MEGA16的EEPROM的读和写操作
; 备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
; /******************************************/
; #include <iom16v.h> //包含型号头文件
; #include <macros.h> //包含"位"操作头文件
; #include <stdio.h> //标准输入输出头文件
; #include <AVR_PQ1A.h> //包含自定义常量头文件
;
; /*******************************************
; 函数名称: Eeprom_writeB
; 功 能: 向EEPROM中的指定地址写入一个字节
; 参 数: eaddr--EEPROM的指定地址
; edata--写入EEPROM的数据
; 返回值 : 无
; /********************************************/
; void Eeprom_writeB(uint eaddr,uchar edata)
; {
; SREG&=~BIT(7); //在写入EEPROM期间应该关闭全局中断,防止中断打断写EEPROM的特殊时序
; while(EECR&BIT(EEWE)); //等待上次写操作完毕
; EEAR=eaddr; //配置地址寄存器
; EEDR=edata; //配置数据寄存器
; EECR|=BIT(EEMWE); //主写使能置高
; EECR|=BIT(EEWE); //EEMWE置高后,4个时钟周期内将EEWE置高才能将数据写入
.dbline 30
; SREG|=BIT(7); //写入完毕后,开放全局中断
; }
ldi R16,5
ldi R17,0
movw R18,R22
xcall empy16s
movw R22,R16
lsr R23
ror R22
lsr R23
ror R22
.dbline 31
clr R20
clr R21
xjmp L5
L2:
.dbline 31
L3:
.dbline 31
subi R20,255 ; offset = 1
sbci R21,255
L5:
.dbline 31
; /*******************************************
cp R20,R22
cpc R21,R23
brlo L2
.dbline -2
.dbline 32
; 函数名称: Eeprom_readB
L1:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r US 22 i
.dbend
.dbfunc e Delayms _Delayms fV
; i -> R20,R21
; j -> R22,R23
; MS -> R16,R17
.even
_Delayms::
xcall push_gset2
.dbline -1
.dbline 40
; 功 能: 从EEPROM中的指定地址读出一个字节
; 参 数: eaddr--EEPROM的指定地址
; 返回值 : edata--读出的EEPROM数据
; /********************************************/
; uchar Eeprom_readB(uint eaddr)
; {
; uchar edata;
; while(EECR&BIT(EEWE)); //等待上次写操作完毕
.dbline 42
; EEAR=eaddr; //配置地址寄存器
; EECR|=BIT(EERE); //读使能置高
clr R20
clr R21
xjmp L10
L7:
.dbline 43
clr R22
clr R23
xjmp L14
L11:
.dbline 43
L12:
.dbline 43
subi R22,255 ; offset = 1
sbci R23,255
L14:
.dbline 43
cpi R22,117
ldi R30,4
cpc R23,R30
brlo L11
L8:
.dbline 42
subi R20,255 ; offset = 1
sbci R21,255
L10:
.dbline 42
cp R20,R16
cpc R21,R17
brlo L7
.dbline -2
.dbline 44
; edata=EEDR; //读出数据
; return edata; //返回读出的数据
L6:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r j 22 i
.dbsym r MS 16 i
.dbend
.dbfunc e Board_init _Board_init fV
.even
_Board_init::
.dbline -1
.dbline 52
; }
; /*******************************************
; 函数名称: main
; 功 能: 实现EEPROM的0-254地址单元写入0-254,然后读出
; 参 数: 无
; 返回值 : 无
; /********************************************/
; void main(void)
.dbline 53
; {
ldi R24,255
out 0x1a,R24
.dbline 54
; uchar i;
out 0x17,R24
.dbline 55
; Board_init( ); //初始化开发板
out 0x14,R24
.dbline 56
; for(i=0;i<255;i++) //连续写入
out 0x11,R24
.dbline 58
; {
; Eeprom_writeB(i,i);
clr R2
out 0xd,R2
.dbline 60
; }
; for(i=0;i<255;i++) //连续读出
sbi 0x1b,6
.dbline 61
; {
cbi 0x15,6
.dbline 62
; Eeprom_readB(i);
cbi 0x1b,1
.dbline 63
; }
out 0x18,R24
.dbline 64
; }
sbi 0x1b,2
.dbline 65
; }
ldi R16,5
ldi R17,0
xcall _Delayus
.dbline 66
; }
cbi 0x1b,2
.dbline 68
; }
; }
clr R2
out 0x18,R2
.dbline 69
; }
sbi 0x1b,3
.dbline 70
; }
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 71
; }
cbi 0x1b,3
.dbline 73
; }
; }
ldi R24,255
out 0x18,R24
.dbline 74
; }
sbi 0x1b,4
.dbline 75
; }
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 76
; }
cbi 0x1b,4
.dbline 78
; }
; }
ldi R24,255
out 0x12,R24
.dbline 79
; }
sbi 0x1b,7
.dbline 80
; }
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 81
; }
cbi 0x1b,7
.dbline -2
.dbline 84
; }
; }
; }
L15:
.dbline 0 ; func end
ret
.dbend
.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\18_EEPROM\EEPROM.c
.dbfunc e Eeprom_writeB _Eeprom_writeB fV
; edata -> R18
; eaddr -> R16,R17
.even
_Eeprom_writeB::
.dbline -1
.dbline 22
.dbline 23
bclr 7
L17:
.dbline 24
L18:
.dbline 24
sbic 0x1c,1
rjmp L17
.dbline 25
sts 62+1,R17
sts 62,R16
.dbline 26
out 0x1d,R18
.dbline 27
sbi 0x1c,2
.dbline 28
sbi 0x1c,1
.dbline 29
bset 7
.dbline -2
.dbline 30
L16:
.dbline 0 ; func end
ret
.dbsym r edata 18 c
.dbsym r eaddr 16 i
.dbend
.dbfunc e Eeprom_readB _Eeprom_readB fc
; edata -> R20
; eaddr -> R16,R17
.even
_Eeprom_readB::
xcall push_gset1
.dbline -1
.dbline 38
L21:
.dbline 40
L22:
.dbline 40
sbic 0x1c,1
rjmp L21
.dbline 41
sts 62+1,R17
sts 62,R16
.dbline 42
sbi 0x1c,0
.dbline 43
in R20,0x1d
.dbline 44
mov R16,R20
.dbline -2
L20:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r edata 20 c
.dbsym r eaddr 16 i
.dbend
.dbfunc e main _main fV
; i -> R20
.even
_main::
.dbline -1
.dbline 53
.dbline 55
xcall _Board_init
.dbline 56
clr R20
xjmp L28
L25:
.dbline 57
.dbline 58
mov R18,R20
mov R16,R20
clr R17
xcall _Eeprom_writeB
.dbline 59
L26:
.dbline 56
inc R20
L28:
.dbline 56
cpi R20,255
brlo L25
.dbline 60
clr R20
xjmp L32
L29:
.dbline 61
.dbline 62
mov R16,R20
clr R17
xcall _Eeprom_readB
.dbline 63
L30:
.dbline 60
inc R20
L32:
.dbline 60
cpi R20,255
brlo L29
.dbline -2
.dbline 64
L24:
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -