网上看到的x5043读写程序

来源:互联网 发布:淘宝闲鱼上拍卖的翡翠 编辑:程序博客网 时间:2024/05/22 10:27
 #include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define  CS  P10            /*x5043的片选*/
#define  SI  P11            /*x5043的串行输入*/
#define  SCK P12            /*x5043的时钟*/
#define  SO  P13            /*x5043的输出*/
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
 /******************************************************************************
向 x5043 发送命令 (8 bit) (初始:CS = 0), SCK上升沿锁存数据
******************************************************************************/
void sent_x5043(uchar n)
{
    uchar i;
    for ( i=0x80; i>=0x01; i=i>>1 )
       {
       SCK = 0;
       _nop_();      /* SCK=0 */
       if ( ( n & i ) == 0 ) SI = 0; else SI = 1;    /* 置SI */
       SCK = 1;    /* SCK=1 */
       _nop_();
       }
}
/******************************************************************************
从 x5043 读出数据 (8 bit) (初始:CS = 0), SCK下降沿输出数据
******************************************************************************/
uchar get_x5043(void)
{
    uchar i,n;
    n=0x00;
    for ( i=0x80; i>=0x01; i=i>>1 )
       {
       SCK = 1;
       _nop_();
       SCK = 0;
       _nop_();
       if ( SO == 1 ) n = ( n | i );   
       }
   return( n );
}
/******************************************************************************
读 x5043 状态寄存器 (8 bit)
******************************************************************************/
uchar rdsr_x5043(void)
{
    uchar n;
    CS=1;
    _nop_();
    CS=0;
    sent_x5043( 0x04 );     /* WREN => x5043 写禁止 */
    CS=1;
    _nop_(); 
    CS=0;
    sent_x5043( 0x05 );     /* RDSR => x5043 */
    n = get_x5043( );
    return( n );
}
/******************************************************************************
写 x5043 等待完成
******************************************************************************/
void wrok_x5043(void)
{
    uchar i;
    for ( i=0; i<=99; i++ )
    {
       if ( ( rdsr_x5043() & 0x01 ) == 0x00 ) break;
    }
}
/******************************************************************************
初始化 x5043
******************************************************************************/
void ini_x5043(uchar n)/*n为状态寄存器的值,初始化时要给予设定*/            -----------------------------------------------这里不明白,n到底设定什么啊

    if ( rdsr_x5043() != n )
      {
      CS=1;
      _nop_();
      CS=0;
      sent_x5043( 0x06 );   //写使能
      CS=1;
      _nop_();
      CS=0;
      sent_x5043( 0x01 );     /* WRSE => x5043 */
      sent_x5043( n );     /* n => x5043 看门狗定时, 块保护范围,  */
      wrok_x5043();
      CS=1;
      _nop_();
      CS=0;
      sent_x5043( 0x04 );     /* WREN => x5043 写禁止 */
      }
}
/******************************************************************************
从 x5043 读1个字节
uchar Cread_EEPROM( uint addr )
输入:    addr 地址范围 0x000-0x1FF [512B]
输出:    数据 (uchar,char)
******************************************************************************/
uchar Cread_EEPROM(uint addr)
{
    uchar n;
    n = 0x03;    /* 0000 (A8)011 READ */
    if ( ( addr & 0x0100 ) != 0 )
        n = ( n | 0x08 );
     CS=1;
    _nop_();
    CS=0;
    sent_x5043( 0x04 );     /* WREN => x5043 写禁止*/
    CS=1;
    _nop_();
    CS=0;
    sent_x5043( n );         /* READ => x5043 */
    sent_x5043( (uchar)(addr) );    /* addr => x5043 */
    n = get_x5043( );         /* x5043 => n */
    return( n );
}
/******************************************************************************
向 x5043 写1个字节
void Cwrite_EEPROM( uint addr, uchar n )
输入:    addr 地址范围 0x000-0x1FF [512B]
    n 数据(uchar,char)
******************************************************************************/
void Cwrite_EEPROM( uint addr, uchar n )
{
    uchar i;
    if(Cread_EEPROM(addr)==n)
        return; 
    i = 0x02;                               /* 0000 (A8)010 WRITE */
    if((addr & 0x0100 )!= 0)
       i=(i|0x08);
    CS=1;
    _nop_();
    CS=0;
    sent_x5043( 0x06 );  
    CS=1;
    _nop_();
    CS=0;
    sent_x5043( i );         /* WRITE => x5043 */
    sent_x5043( (uchar)(addr) );    /* addr => x5043 */
    sent_x5043( n );         /* n => x5043 */
    wrok_x5043();
    CS=1;
    _nop_();
    CS=0;
    sent_x5043( 0x04 );     /* WREN => x5043 写禁止 */
}
void delay10ms1(uint count)
{
 uint j,k;
 while(count--!=0)
 {
            for(k=0;k<10;k++)
  for(j=0;j<75;j++) ;
  }
 }