×
单片机 > 单片机程序设计 > 详情

93C46读写的51程序

发布时间:2020-05-28 发布时间:
|
// 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 code tab[]={0xb7,0x12,0x67,0x76,0xd2,0xf4,0xf5,0x16,0xf7,0xf6,0xd7,0xf1,0xa5,0x73,0xe5,0xc5,0,0xff};
                          //共阴极代码 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;
  }
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会