/*************************************** 读写AVR单片机EEPROM实验。 先向单片机EEPROM写入254,然后读出254, 并在数码管上显示出来 ***************************************/ #include<iom16v.h> const unsigned char duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; const unsigned char weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char shu[8]; unsigned int num; /**************************************** 延时函数 ****************************************/ void delay(unsigned char t) { unsigned char x,y; for(x=t;x>0;x--) for(y=100;y>0;y--); } /**************************************** 显示函数 ****************************************/ void display(void) { unsigned char i; for(i=0;i<4;i++) { PORTB =0X00; PORTA|=0X01; PORTA&=0XFE; PORTB =weima[i]; PORTA|=0x02; PORTA&=0XFD; PORTB=shu[i]; PORTA|=0X01; PORTA&=0XFE; delay(4); } } /*************************************** 写EEPROM ***************************************/ void write_eep(unsigned int add,unsigned int data) { //data为待写数据,add为某单元地址 while(EECR&(1<<EEWE)); //等待前一次写操作完成 EEAR=add; //设定单元地址 EEDR=data; //将数据写入EEDR EECR|=(1<<EEMWE); //允许EEPROM操作 EECR|=(1<<EEWE); //开始EEPROM操作 } /*************************************** 读EEPROM ***************************************/ unsigned char read_eep(unsigned int add) { //add为某单元地址 while(EECR&(1<<EEWE));//等待前一次写操作完成 EEAR=add; //设定单元地址 EECR|=(1<<EERE); //开始EEPROM写操作 return EEDR; //返回读出的数据 } /*************************************** 数据转换子函数 ***************************************/ void change(unsigned int i) { shu[0]=duanma[i/1000]; shu[1]=duanma[i/100%10]; shu[2]=duanma[i%100/10]; shu[3]=duanma[i%10]; } /*************************************** 端口初始化 ***************************************/ void init_port(void) { PORTA=0XFF; DDRA=0XFF; PORTB=0XFF; DDRB=0XFF; } /*************************************** MAIN ***************************************/ void main(void) { init_port(); write_eep(488,254); delay(20); num=read_eep(488); delay(20); change(num); while(1) { display(); } }