您的位置 首页 软件

ATmega128(EEPROM)

//atmega128的读写EEPROM示例程序,记录CPU启动的次数到EEPROM中//在LED数码管上显示读出的数据,可用复位键刷新显示//编译环境AVRStudi…

//atmega128的读写EEPROM示例程序,记载CPU发动的次数到EEPROM中

//在LED数码管上显现读出的数据,可用复位键刷新显现
//编译环境 AVR Studio 4.17/AVR GCC
//体系时钟7.3728MHZ,设置熔丝位为外部高频石英晶体振荡,发动时刻4.1ms

//***********************************************************************
//包括文件
//***********************************************************************

#include
#include
#define F_CPU7372800// 单片机主频为7.3728MHz,用于延时子程序
#include
#include <avr/io.h>
#include
#include interrupt.h> //中止信号头文件

//***********************************************************************
//界说变量区
//***********************************************************************

#define Data_IO PORTA //数码管数据口
#define Data_DDR DDRA //数码管数据口方向寄存器
#define D_LE0 PORTD &= ~(1 << PD4) //数码管段操控位为0,锁存端口数据
#define D_LE1 PORTD |= (1 << PD4) //数码管段操控位为1,锁存器输出与端口共同
#define W_LE0 PORTD &= ~(1 << PD5) //数码管位操控位为0
#define W_LE1 PORTD |= (1 << PD5) //数码管位操控位为1

#define delay_us(x) _delay_us(x) //AVR GCC延时函数 x(us)
#define delay_ms(x) _delay_ms(x) //AVR GCC延时函数 x(ms)

#define uchar unsigned char
#define uint unsigned int

//***********************************************************************
//共阴数码管显现的断码表0~F
//***********************************************************************

uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint A1,A2,A3; //界说的变量,显现数据处理

//***********************************************************************
//IO端口初始化
//***********************************************************************

void system_init()
{
Data_IO=0xFF; //数据口为输出
Data_DDR=0xFF;

PORTD=0xFF; //74HC573的操控口,设置为输出
DDRD=0xFF;
PORTB=0XFF;
DDRB=0XFF;
}

//*************************************************************************
//74HC573操控数码管动态扫描显现函数,显现收集到的温度
//*************************************************************************

void Display_EEPROM(void)
{
uchar i,j;
system_init();
j=0x01; //此数据用来操控位选
for(i=0;i<5;i++) //用后3位数码管来显现
{
D_LE1;
W_LE1;
Data_IO=~j;
W_LE0;
j=(j<<1);
Data_IO=0x00;
D_LE0;
delay_ms(1);
}
D_LE1;
W_LE1;
Data_IO=~j;
W_LE0;
j=(j<<1);
Data_IO=table[A1];
D_LE0;
delay_ms(1);

D_LE1;
W_LE1;
Data_IO=~j;
W_LE0;
j=(j<<1);
Data_IO=table[A2];
D_LE0;
delay_ms(1);

D_LE1;
W_LE1;
Data_IO=~j;
W_LE0;
j=(j<<1);
Data_IO=table[A3];
D_LE0;
delay_ms(1);

D_LE1;
W_LE1;
Data_IO=0xff;
W_LE0;

}

//*************************************************************************
//数据处理函数
//*************************************************************************
void data_do(uchar temp_d)
{
uint A2t;
A1=temp_d/100; //分出百,十,和个位
A2t=temp_d%100;
A2=A2t/10;
A3=A2t%10;
}

//***********************************************************************
// EEPROM读取函数*/
// addr:地址;number:长度;p_buff:读出数据寄存指针
//***********************************************************************
void eprom_read(unsigned int addr, unsigned char number, unsigned char *p_buff) {

while(EECR & (1 << EEWE)); //等候前面的写完结

EEARH = 0x00; //写高字节地址

while(number –) {
EEARL = addr ++; //写地址低字节
EECR |= (1 << EERE); //读答应方位1
*p_buff++ = EEDR; //读出EEDR中的数据
}
}
//***********************************************************************
// EEPROM写入函数
// addr:地址;number:长度;p_buff:写入数据寄存指针
//***********************************************************************
void eprom_write(unsigned int addr, unsigned char number, unsigned char *p_buff) {

EEARH = 0x00;

while(number –) {
while(EECR & (1 << EEWE)); //等候前面的写完结
EEARL = addr ++; //写地址
EEDR = *p_buff ++; //写数据到EEDR
EECR |= (1 << EEMWE); //主机写入答应位
EECR&=~(1<EECR |= (1 << EEWE); //EEWE为1,履行写操作
}
}

//***********************************************************************
// 主函数
//***********************************************************************
int main(void)
{

unsigned char temp;
system_init(); //体系初始化
eprom_read(0x10, 0x01, &temp);//读出记载
delay_ms(10);
temp ++; //计数值加1
eprom_write(0x10, 0x01, &temp);//写入记载
delay_ms(10);

while (1)
{
data_do(temp); //每发动一次temp加1,记载到EEPROM中
Display_EEPROM();//显现计数值
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/276142.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部