/*************************************** 讀寫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(); } }