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

📄 eeprom.s

📁 //实验板的AVR程序
💻 S
字号:
	.module eeprom.c
	.area text(rom, con, rel)
	.dbfile E:\iccavr代码\实验16_片内EEPROM的使用\eeprom.c
	.dbfunc e DelaymS _DelaymS fV
;              j -> R20,R21
;              k -> R22,R23
;              i -> R16,R17
	.even
_DelaymS::
	rcall push_gset2
	.dbline -1
	.dbline 36
; //******************************************************************************
; //                                                                             *
; //    FileName   : 实验板eeprom片内.c           ICCAVR V6.31A编译              *
; //    Function   : 片内eeprom操作练习                                          *
; //    Date       : 2006-11-14                                                  *
; //    Version    : 1.0                                                         *
; //                                                                             *
; //    Author     : 开关电源              hongtusy@163.com                      *
; //    Company    : 电子信息技术咨询网    http://www.itsn.cn                    *
; //                                                                             *
; //***************************描述与记事*****************************************
; //实验板的AVR程序,片内eeprom操作练习,和计算机通讯,上电后首先发送保存在片内的数据
; //然后接收PC发送的数据并保存起来,然后读取数据返回给pc,断电后数据不丢失。
; //接线定义:将串口经rs232连接pc机  即PW6-7/8.
; //记事:本程序旨在对片内eeprom使用的理解与演示,程序适合初学者使用.
; //使用8MHz晶体。
; //******************************************************************************
; 
; #include <iom8535v.h>             //头文件,ATmega8535单片机的寄存器定义
; #include <macros.h>               //
; 
; typedef unsigned char uchar;
; typedef unsigned int uint;
; 
; #define BAUDRATE        9600	 //波特率
; #define F_CPU			8000000  //系统晶体频率
; 
; /************************************************
; 函 数 名:    DelaymS()
; 功    能:    毫秒级延时函数
; 输入参数:     延迟时间/系统晶体
; 输出参数:    做相应的延迟处理
; 描    述:    /
; ***********************************************/
; void DelaymS (uint i)            //延时函数,参数i为延时时间
; {
	.dbline 38
;     uint j,k;                        //双重延时
; 	for (j=0;j<i;j++)
	clr R20
	clr R21
	rjmp L5
L2:
	.dbline 39
; 	{
	.dbline 40
	clr R22
	clr R23
	rjmp L9
L6:
	.dbline 40
L7:
	.dbline 40
	subi R22,255  ; offset = 1
	sbci R23,255
L9:
	.dbline 40
	ldi R24,500
	ldi R25,1
	cp R24,R22
	cpc R25,R23
	brsh L6
	.dbline 41
L3:
	.dbline 38
	subi R20,255  ; offset = 1
	sbci R21,255
L5:
	.dbline 38
	cp R20,R16
	cpc R21,R17
	brlo L2
	.dbline -2
L1:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r j 20 i
	.dbsym r k 22 i
	.dbsym r i 16 i
	.dbend
	.dbfunc e Send_word _Send_word fV
;              h -> R16
	.even
_Send_word::
	.dbline -1
	.dbline 51
; 	    for (k=0;k<=500;k++);
; 	}
; }
; /********************************************************
;   子程序名:   Send_word()
;   功    能:   串口发送一个字节
;   输入参数:   /
;   输出参数:   /
;   描    述:   把数据发送出去先发送再检测,发完后,才离开
; ********************************************************/
; void Send_word(uchar h)
; {
	.dbline 52
;  	 UDR = h;                     //发送一个字符数据
	out 0xc,R16
L11:
	.dbline 54
L12:
	.dbline 53
;  	 while(!(UCSRA&(1<<UDRE)))     //1字节发送完毕?
	sbis 0xb,5
	rjmp L11
	.dbline -2
L10:
	.dbline 0 ; func end
	ret
	.dbsym r h 16 c
	.dbend
	.dbfunc e receive_word _receive_word fc
	.even
_receive_word::
	.dbline -1
	.dbline 64
; 	 ;
; }
; /********************************************************
;   子程序名:   receive_word()
;   功    能:   串口接收一个字节数据
;   输入参数:   /
;   输出参数:   /
;   描    述:   /
; ********************************************************/
; uchar receive_word (void)
; {
L15:
	.dbline 66
L16:
	.dbline 65
;  	 while(!(UCSRA&(1<<RXC)))          //1字节接收完成?
	sbis 0xb,7
	rjmp L15
	.dbline 67
; 	 ;
; 	 return  UDR;                  //输出接收到的数据
	in R16,0xc
	.dbline -2
L14:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e mcu_Init _mcu_Init fV
	.even
_mcu_Init::
	.dbline -1
	.dbline 77
; }
; /************************************************
; 函 数 名:    Init_port()
; 功    能:    单片机初始化函数
; 输入参数:     /
; 输出参数:    /
; 描    述:    相关口方向的设置等
; ***********************************************/
; void mcu_Init(void)
; {
	.dbline 78
; 	DDRD = 0xff;//PD口为推挽1输出,位码,PD7为485DE脚。口方向不影响串口。
	ldi R24,255
	out 0x11,R24
	.dbline -2
L18:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e usart_Init _usart_Init fV
	.even
_usart_Init::
	.dbline -1
	.dbline 88
; }
; /********************************************************
;   子程序名:   usart_Init()
;   功    能:   串口初始化
;   输入参数:   /
;   输出参数:   /
;   描    述:   /
; ********************************************************/
; void usart_Init (void)
; {
	.dbline 89
; 	 CLI();    //关闭中断
	cli
	.dbline 90
; 	 UBRRL= (F_CPU/BAUDRATE/16-1)%256;
	ldi R24,51
	out 0x9,R24
	.dbline 91
;      UBRRH= (F_CPU/BAUDRATE/16-1)/256;
	clr R2
	out 0x20,R2
	.dbline 93
; 	 //UBRRL=51; //波特率寄存器,UART:9600bps,8.000MHz
; 	 UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);  //接收结束中断使能,RXD&TXD使能
	ldi R24,152
	out 0xa,R24
	.dbline 94
; 	 UCSRC = (1<<URSEL)|(1<<UPM1)|(1<<UCSZ0)|(1<<UCSZ1);
	ldi R24,166
	out 0x20,R24
	.dbline -2
L19:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e EEPROM_write _EEPROM_write fV
;          uData -> R18
;          uAddr -> R16,R17
	.even
_EEPROM_write::
	.dbline -1
	.dbline 106
; 	  //访问UCSRC寄存器,偶校验,8个数据位,默认一个停止位,
; 	 //SEI();      //开全局中断使能
; }
; /********************************************************
;   子程序名:   EEPROM_write
;   功    能:   写一字节数据到片内指定地址单元
;   输入参数:   /
;   输出参数:   /
;   描    述:   /
; ********************************************************/
; void EEPROM_write(uint uAddr,uchar uData)
; {
	.dbline 107
; 	 EEAR = uAddr;              //写操作的16位地址寄存器
	out 0x1f,R17
	out 0x1e,R16
	.dbline 108
; 	 EEDR = uData;              //写数据到数据寄存器
	out 0x1d,R18
	.dbline 109
; 	 EECR |= (1<<EEMWE);        //允许EEPROM操作
	sbi 0x1c,2
	.dbline 110
; 	 EECR |= (1<<EEWE);         //开始写操作
	sbi 0x1c,1
L21:
	.dbline 112
L22:
	.dbline 111
; 	 while (EECR & (1<<EEWE))   //等待写操作完成
	sbic 0x1c,1
	rjmp L21
	.dbline -2
L20:
	.dbline 0 ; func end
	ret
	.dbsym r uData 18 c
	.dbsym r uAddr 16 i
	.dbend
	.dbfunc e EEPROM_read _EEPROM_read fc
;          uAddr -> R16,R17
	.even
_EEPROM_read::
	.dbline -1
	.dbline 122
; 	 ;
; }
; /********************************************************
;   子程序名:   EEPROM_read
;   功    能:   从片内指定地址单元读一字节数据
;   输入参数:   /
;   输出参数:   /
;   描    述:   /
; ********************************************************/
; uchar EEPROM_read(uint uAddr)
; {
L25:
	.dbline 124
L26:
	.dbline 123
;      while (EECR & (1<<EEWE))   //等待前一次写操作完成
	sbic 0x1c,1
	rjmp L25
	.dbline 125
; 	 ;
; 	 EEAR = uAddr;              //写操作的16位地址寄存器
	out 0x1f,R17
	out 0x1e,R16
	.dbline 126
; 	 EECR |= (1<<EERE);         //开始读操作
	sbi 0x1c,0
	.dbline 127
; 	 return EEDR;               //输出读出的数据
	in R16,0x1d
	.dbline -2
L24:
	.dbline 0 ; func end
	ret
	.dbsym r uAddr 16 i
	.dbend
	.dbfunc e main _main fV
;           temp -> <dead>
;              i -> R20
;              k -> R22
;              j -> R20
	.even
_main::
	.dbline -1
	.dbline 131
; }
; //*****************主程序**********************************
; void main (void)
; {
	.dbline 133
;      uchar temp,i,j,k;
;      mcu_Init();       //单片机初始化
	rcall _mcu_Init
	.dbline 134
; 	 usart_Init();   //串口初始化
	rcall _usart_Init
	.dbline 135
; 	 i=EEPROM_read(0x10);     //读片内EEPROM地址为0x10的数据,
	ldi R16,16
	ldi R17,0
	rcall _EEPROM_read
	mov R20,R16
	.dbline 136
; 	 Send_word(i);           //发送数据到PC,这个数是掉电前保存的。
	rcall _Send_word
	rjmp L30
L29:
	.dbline 138
	.dbline 139
	rcall _receive_word
	mov R20,R16
	.dbline 140
	mov R18,R20
	ldi R16,16
	ldi R17,0
	rcall _EEPROM_write
	.dbline 142
	ldi R16,16
	ldi R17,0
	rcall _EEPROM_read
	mov R22,R16
	.dbline 143
	rcall _Send_word
	.dbline 144
L30:
	.dbline 137
	rjmp L29
X0:
	.dbline -2
L28:
	.dbline 0 ; func end
	ret
	.dbsym l temp 1 c
	.dbsym r i 20 c
	.dbsym r k 22 c
	.dbsym r j 20 c
	.dbend

⌨️ 快捷键说明

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