/*********************************************
*文 件 名:EEPROM.c
* 功 能:读写EEPROM实验
* 硬件条件:1.CPU型号:PIC16F877A
* 2.晶振:4.000MHz
* 作 者:hxj
* 日 期:2008年3月10号
***********************************************
**********************************************/
////////////头文件///////////////
#include <pic.h> //调用头文件
__CONFIG(0x3F31); //芯片配置字
////////////宏及变量定义//////////////////
#define u8 unsigned char
u8 table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
u8 date1;
u8 date2;
u8 addr1;
////////////初始化函数///////////////////
void init(void)
{
ADCON1=0X07; //设置A口为普通数字口
TRISA=0;
TRISC=0;
PORTA=0XFF;
}
////////////10ms去抖动延时子函数////////////////////US级延时子函数
void delayUS(u8 i)
{while(--i);}
void delayMS(u8 a)
{do{delayUS(199);}while(--a);}
//////////////////////////////////////////////////////////////////////MS级延时子函数
// 延时程序调试心得体会
// void delay(unsigned i)
// { while(--i); }
// 说明部分:
// i=199,延时1001um,计算过程为:i*5+6=S(延时时间um),
// 6um来自变量赋值,子程序调用(call),子程序返回
////////////////////////////////////////////////////////////////////
////////////EEPROM写函数/////////////////
void write(u8 addr,u8 date)
{ while(WR==1); //等待上一次写操作完成;
EEADR=addr; //写地址;
EEDATA=date; //写数据;
EEPGD=0; //选择EEPROM为访问对象
WREN=1; //开放写操作使能控制
EECON2=0X55; //送55H到EECON2(固定的)
EECON2=0XAA; //送AAH到EECON2(固定的)
WR=1; //启动写操作
WREN=0; //禁止写操作发生
}
///////////EEPROM读函数/////////////////
u8 read(u8 addr)
{ EEADR=addr; //读地址;
RD=1; //读操作开始;
NOP();NOP(); //
return(EEDATA); //返回数据;
}
///////////显示函数////////////////////
void display(void)
{ PORTA=0xFF;
PORTC=table[date1]; //第一个数码管显示送入的数;
RA0=0;
delayMS(2);
RA0=1;
PORTA=0xFF;
PORTC=table[date2]; //第二个数码管显示读出的数;
RA5=0;
delayMS(2);
RA5=1;
}
///////////主函数//////////////////////
void main(void)
{ u8 i;
init();
while(1)
{ date1++;addr1++;
if(date1==10){date1=0;addr1=0;}
write(addr1,date1);
for(i=0;i<200;i++){display();display();}
for(i=0;i<200;i++){display();display();}
date2=read(addr1);
display();
}
}