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