/*************************************************
*文件名 :EEprom.C
*************************************************/
#include "reg935.h"
#define uchar unsigned char
sbit LED=P2^6; //定义运行指示灯
sbit BEEP=P2^7; //定义蜂鸣器
sbit KEY1=P0^0; //定义按键
sbit KEY2=P0^1;
sbit KEY3=P0^2;
sbit KEY4=P0^3;
/* 74HC595控制管脚定义 */
sbit HC595_CS = P2^4; //片选线
sbit HC595_CLK = P2^5; //时钟线
sbit HC595_DAT = P2^2; //数据线
void SendHC595(uchar dat);
main()
{
uchar Temp;
uchar Count;
uchar Data;
uchar Addr;
P0M1=0x00; //定义IO口工作模
P0M2=0x00; //四种输出类型分别为:准双向口00(标准8051输出模式),推挽01,开漏输出10,输入高阻11
P2M1=0xC0; //输入高阻11 指示灯蜂鸣器
P2M2=0xC0;
while(1)
{
if(KEY1==0) //当KEY1按下,向 地址为0-->0xff的区域写入数据0->0xff.
{
LED=0; //点亮运行指示灯
Addr=0x00; //地址初始值
Data=0x00; //待写入数据初始值
Count=0xFF; //循环次数
EA=0; //写操作前关闭中断功能,避免干扰
while(Count>0)
{
DEECON=0x00; //初始化DEECON
DEEDAT=Data; //赋值DEEDAT
DEEADR=Addr; //赋值DEEADR
while((DEECON&0x80)==0); //等待写完成
DEECON=DEECON&0x7F; //清0写完成标志位
Data++; //待写入数据递增
Addr++; //地址递增
Count--; //循环次数递减
if(Count==0)
{
LED=1; //最后一次循环,熄灭运行指示灯
}
}
EA=1; //开中断
}
//read--------------------------
if(KEY2==0) //当KEY2按下时,校验地址0-->0xff区域间的数据,不对则BEEP
{
LED=0;
Addr=0x00; //首地址
Data=0x00; //首数据
Count=0xFF; //循环次数
while(Count>0)
{
DEECON=0x00; //初始化DEECON
DEEADR=Addr; //赋值DEEADR
while((DEECON&0x80)==0); //等待
Temp=DEEDAT; //将读出的值赋给Temp
if(Temp!=Data) //判断
{
BEEP=0; //BEEP鸣叫
SendHC595(~Temp); //显示时的数据(可以判断出操作第?位EEPROM出错)
break;
}
Data++; //待校验数据递增
Addr++; //地址递增
Count--; //循环次数递减
}
SendHC595(~Data); //若循环结束,显示最后一次操作的数据
}
//----------------100~~~~1FFH--------------
if(KEY3==0) //KEY3按下,对地址为100-->1FF的区域进行写操作
{
LED=0; //点亮运行指示灯
Addr=0x00; //地址低8位初值
Data=0x00;
Count=0xFF; //循环次数
EA=0; //关中断,避免干扰
while(Count>0)
{
DEECON=0x01; //初始化DEECON,并置地址最高位为1
DEEDAT=Data; //赋值DEEDAT
DEEADR=Addr; //赋值DEEADR
while((DEECON&0x80)==0); //等待写完成
DEECON=DEECON&0x7F; //清0写完成标志位
Data++; //待写入数据递增
Addr++; //待写入地址递增
Count--; //循环次数递减
if(Count==0)
{
LED=1; //循环结束关闭运行指示灯
}
}
EA=1; //恢复中断
}
//read--------------------------
if(KEY4==0) //KEY4按下,对地址100-->1FF进行校验
{
LED=0; //点亮运行指示灯
Addr=0x00; //初始化地址低8位: x 0000 0000
Data=0x00; //循环次数
Count=0xFF;
while(Count>0)
{
DEECON=0x01; //初始化DEECON,并置位地址最高位
DEEADR=Addr; //赋值DEEADR
while((DEECON&0x80)==0); //等待读完成
Temp=DEEDAT; //将读出的值赋给DEEDAT
if(Temp!=Data)
{
BEEP=0; //如果读出不正确,则BEEP
SendHC595(~Temp); //并显示出错数据(可以判断出错地址)
break;
}
Data++; //数据递增
Addr++; //地址递增
Count--; //循环嫡减
}
SendHC595(~Data); //循环结束,显示最后一次的数据
}
}
}
/*******************************************************
*SendHC595()
*******************************************************/
void SendHC595(uchar dat)
{ uchar i;
HC595_CS=0; //片选
for(i=0; i<8; i++)
{ HC595_CLK=0; //CLK置低
if( (dat&0x80)!=0 )HC595_DAT=1; //赋值
else HC595_DAT=0;
HC595_CLK=1; //CLK置高
dat=dat<<1; //循环移位
}
HC595_CS=1; //关闭
}
评论0