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

📄 eeprom.s

📁 AVR16单片机2EPRAM
💻 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 + -