|
楼主 |
发表于 2006-7-20 22:46:56
|
显示全部楼层
再上传一个mega16内部EEPROM的读写范例
功能如下:
向EEPROM的01、02、03地址分别写入0x55、0xAA、0x00,然后读这三个中任一地址,将内容显示在数码管上验证,此程序以读02地址为例,02地址中写入了0xAA(170),所以LED数码管上显示170。
#include <iom16v.h>
#include <macros.h>
#include <eeprom.h>
extern const unsigned char tab[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//#define osccal 0x7d //内部RC校正常数
#define sclon PORTB |=BIT(0); //时钟高
#define scloff PORTB &=~BIT(0);
#define dion PORTB |=BIT(1); //数据高
#define dioff PORTB &=~BIT(1);
void delay(void)
{
int i;
for(i=0;i<200;i++)
;
}
void dataOUT(unsigned char temp)
{
unsigned char i,temp1;
temp1 = tab[temp];
for(i = 0;i < 8;i++ )
{
scloff;
if((temp1&0x80)!= 0x80)
{ dioff;}
else
{ dion;}
sclon;
temp1 <<=1;
scloff;
}
}
void display(unsigned int k)
{
dataOUT(k/1000);
PORTB &=0xC7; //DIG1
delay();
dataOUT(k/100%10);
PORTB |=0x08;
PORTB &=0xCF; //DIG2
delay();
dataOUT(k/10%10);
PORTB &=0xD7; //DIG3
PORTB |=0x10;
delay();
dataOUT(k%10);
PORTB |=0x18;
PORTB &=0xDF; //DIG4
delay();
}
void eeprom_write(unsigned int E_add,unsigned char E_data)
{
while(EECR&(1<<EEWE));
EEAR=E_add;
EEDR=E_data;
EECR|=(1<<EEMWE);
EECR|=(1<<EEWE);
}
unsigned char eeprom_read(unsigned int E_add)
{
while(EECR&(1<<EEWE));
EEAR=E_add;
EECR|=(1<<EERE);
return EEDR;
}
void main(void)
{
unsigned char readdata;
DDRB=0xff;
eeprom_write(0x01,0x55);//85
eeprom_write(0x02,0xAA);//170
eeprom_write(0x03,0x00);//0
readdata=eeprom_read(0x02);
while(1)
{
display(readdata);
}
} |
|