93C46读写的51程序
扫描二维码
随时随地手机看文章
// 93C46读写程序,8位数据格式
#include
sbit CS_93C46=P2^7;
sbit SK_93C46=P2^6;
sbit DI_93C46=P2^5;
sbit DO_93C46=P2^4;
unsigned char RD_93C46_byte(unsigned char addr); // 读93c46内部指定地址的1个字节数据
void WR_93C46_byte(unsigned char addr,unsigned char dat); // 向93c46内部指定地址写1个字节数据
void EWEN_93C46(void); // 擦写允许
void EWDS_93C46(void); // 擦写禁止
void ERASE_93C46(unsigned char addr);// 擦除指定地址的数据
void delaynms(unsigned char k); // ms延时
void leddisplay(); // 数码管显示
unsigned char co
//共阴极代码 0-F, 全灭,全亮
unsigned char ledxs[8]={16,16,16,16,16,0,0,0}; // 数码管显示缓冲区
void main()
{
unsigned char temp;
delaynms(200);
leddisplay();
delaynms(200);delaynms(200);delaynms(200);
WR_93C46_byte(0x01,123);
temp=RD_93C46_byte(0x01);
ledxs[7]=temp%10;
ledxs[6]=(temp/10)%10;
ledxs[5]=temp/100;
leddisplay();
while(1);
}
//--------------------------------------------------------------------
// 读93c46内部指定地址的1个字节数据
//--------------------------------------------------------------------
unsigned char RD_93C46_byte(unsigned char addr)
{
unsigned char dat=0,i;
SK_93C46=0;
CS_93C46=0;
CS_93C46=1;
DI_93C46=1;SK_93C46=1;SK_93C46=0;
DI_93C46=1;SK_93C46=1;SK_93C46=0;
DI_93C46=0;SK_93C46=1;SK_93C46=0; // 读数据指令:110
for(i=0;i<7;i++) // 写7位地址
{
addr<<=1;
if((addr&0x80)==0x80)
DI_93C46=1;
else
DI_93C46=0;
SK_93C46=1;
SK_93C46=0;
}
DO_93C46=1; // DO=1,为读取做准备
for(i=0;i<8;i++) // 读8位数据
{
dat<<=1;
SK_93C46=1;
if(DO_93C46) dat+=1;
SK_93C46=0;
}
CS_93C46=0;
return(dat);
}
//---------------------------------------------------------------------------------
// 向93c46内部指定地址写1个字节数据
//---------------------------------------------------------------------------------
void WR_93C46_byte(unsigned char addr,unsigned char dat)
{
unsigned char i;
EWEN_93C46(); // 擦写允许
CS_93C46=0;
SK_93C46=0;
CS_93C46=1;
DI_93C46=1;SK_93C46=1;SK_93C46=0;
DI_93C46=0;SK_93C46=1;SK_93C46=0;
DI_93C46=1;SK_93C46=1;SK_93C46=0; // 写数据指令:101
for(i=0;i<7;i++) // 写7位地址
{
addr<<=1;
if((addr&0x80)==0x80)
DI_93C46=1;
else
DI_93C46=0;
SK_93C46=1;
SK_93C46=0;
}
for(i=0;i<8;i++) // 写8位数据
{
if((dat&0x80)==0x80)
DI_93C46=1;
else
DI_93C46=0;
SK_93C46=1;
SK_93C46=0;
dat<<=1;
}
CS_93C46=0;
DO_93C46=1;
CS_93C46=1;
while(DO_93C46==0); // 检测忙闲
SK_93C46=0;
CS_93C46=0;
EWDS_93C46(); // 擦写禁止
}
//----------------------------------------------------------------------------
// 擦写允许,指令格式:100 地址:11xxxxx (7位)
//----------------------------------------------------------------------------
void EWEN_93C46(void)
{
unsigned char i,addr;
CS_93C46=0;
SK_93C46=0;
CS_93C46=1;
DI_93C46=1;SK_93C46=1;SK_93C46=0;
DI_93C46=0;SK_93C46=1;SK_93C46=0;
DI_93C46=0;SK_93C46=1;SK_93C46=0; // 100
addr=0x7f; // 01111111B
for(i=0;i<7;i++) // 写7位地址 11xxxxx
{
addr<<=1;
if((addr&0x80)==0x80)
DI_93C46=1;
else
DI_93C46=0;
SK_93C46=1;
SK_93C46=0;
}
CS_93C46=0;
}
//-----------------------------------------------------------------------------
// 擦写禁止,指令格式:100 地址:00xxxxx (7位)
//-----------------------------------------------------------------------------
void EWDS_93C46(void)
{
unsigned char i,addr;
CS_93C46=0;
SK_93C46=0;
CS_93C46=1;
DI_93C46=1;SK_93C46=1;SK_93C46=0;
DI_93C46=0;SK_93C46=1;SK_93C46=0;
DI_93C46=0;SK_93C46=1;SK_93C46=0; // 100
addr=0x00; // 00000000B
for(i=0;i<7;i++) // 写7位地址 00xxxxx
{
addr<<=1;
if((addr&0x80)==0x80)
DI_93C46=1;
else
DI_93C46=0;
SK_93C46=1;
SK_93C46=0;
}
CS_93C46=0;
}
//------------------------------------
//串行数码管显示
//------------------------------------
void leddisplay()
{
unsigned char i;
for(i=0;i<8;i++)
{
SBUF=tab[ledxs[i]];
while(TI==0);
TI=0;
}
}
//---------------------------------------------------------------
//延时 n ms
//---------------------------------------------------------------
void delaynms(unsigned char k)
{
while(k)
{
int i;
i=110;
while(i--);
k=k-1;
}
}