⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wrfram.c

📁 写铁电存储器程序,铁电存储广泛应用于快速存取的场所,作存储器用
💻 C
字号:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long
#define _Nop()  _nop_()          /*define nop */

sfr WDTC=0x9F;                   /*WATCH DOG USE*/
sfr SCONF=0xBF;

bit ack;
bdata uchar a,b,sendata;
sbit sendbit_0=sendata^0;
sbit a_0=a^0;sbit a_7=a^7;
ulong cost;

sbit PSW_5=PSW^5;
sbit sda=P1^1;    sbit scl=P1^0;      /*FM24C16A use*/
sbit SER=P1^5;    sbit RCLK=P1^7; sbit SRCLK=P1^6;  /*display use*/
sbit ALARM=P2^0;

uchar  Rst_Buf;
uchar idata DispBuf[5];
uchar code  FM24C16A_Page[8]={0xa0,0xa2,0xa4,0xa6,0xa8,0xaa,0xac,0xae};
uchar code  disptab[23]={0x88,0xeb,0x4c,0x49,0x2b,0x19,0x18,0xcb,0x08,0x0b,
                         0x7f,0x0e,0xff,0x80,0xe3,0x44,0x41,0x23,0x11,0x10,
                         0xc3,0x00,0x03};
/*88H-"0",ebH-"1",4cH-"2",49H-"3",2bH-"4",19H-"5",18H-"6",cbH-"7",08H-"8"*/
/*0bH-"9",7fH-"-",0eH-"P",ffH-" "  because add not-gat  no-logic */
/*g f a b dp c d e*/

void Rst_Wdog(void);

void Start();                  /*IIC总线*/
void Stop();
void Ack_NoAck(bit askbit);
void SendByte(uchar c);
uchar RcvByte();
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no);
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no);

void sendchar(uchar *dispbuf1);
                    
void main()                
{ uchar addr;
/*0012306777 100.26  0012306778 100.27  0012306779 100.28  0012306780 100.29*/
/*0012306783 100.30 */ 
/* uchar dat[5]={0x00,0x00,0xbb,0xc9,0x5f};*/
   uchar    dat[6]={0x05,0x31,0x64,0x17,0x58,0x06};
                    /*0x00,0x26,
                    0x00,0x00,0xBB,0xC9,0x5A,0x01,0x00,0x27,
                    0x00,0x00,0xBB,0xC9,0x5B,0x01,0x00,0x28,
                    0x00,0x00,0xBB,0xC9,0x5D,0x01,0x01,0x30,
                    0x00,0x00,0xBB,0xC9,0x5E,0x01,0x02,0x31,
                    0x00,0x00,0xBB,0xC9,0x5F,0x01,0x03,0x32,
                    0x00,0x00,0xBB,0xC9,0x60,0x01,0x30,0x26,
                    0x00,0x00,0xBB,0xC9,0x61,0x01,0x40,0x27,
                    0x00,0x00,0xBB,0xC9,0x62,0x01,0x50,0x28
                    0x00,0x00,0xBB,0xC9,0x63,0x01,0x60,0x29,
                    0x00,0x00,0xBB,0xC9,0x64,0x01,0x71,0x30,
                    0x00,0x00,0xBB,0xC9,0x65,0x01,0x82,0x31,
                    0x00,0x00,0xBB,0xC9,0x66,0x01,0x93,0x32,
                    0x00,0x00,0xBB,0xC9,0x67,0x01,0x60,0x29,
                    0x00,0x00,0xBB,0xC9,0x68,0x02,0x71,0x30,
                    0x00,0x00,0xBB,0xC9,0x69,0x03,0x82,0x31,
                    0x00,0x00,0xBB,0xC9,0x6a,0x04,0x93,0x32,
                    0x00,0x00,0xBB,0xC9,0x6b,0x05,0x99,0x99
                  }; */
  uchar  dat1[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  ALARM=0;
  addr=0;
  ISendStr(FM24C16A_Page[4],addr,dat,5);
  addr=0x00;
  IRcvStr(FM24C16A_Page[0],addr,dat1,8);
  DispBuf[0]=dat1[5]&0x0f;
  DispBuf[1]=(dat1[6]>>4)&0x0f;
  DispBuf[2]=(uchar)(dat1[6]&0x0f)+13;
  DispBuf[3]=(dat1[7]>>4)&0x0f;
  DispBuf[4]=dat1[7]&0x0f;

  b=dat1[7]&0x0f;
  cost=(ulong)b;
  b=(dat1[7]>>4)&0x0f;
  cost=cost+(ulong)b*10;
  b=dat1[6]&0x0f;
  cost=cost+(ulong)b*100;
  b=(dat1[6]>>4)&0x0f;
  cost=cost+(ulong)b*1000;
  b=dat1[5]&0x0f;
  cost=cost+(ulong)b*10000;

  SP=0xd0;
  Rst_Buf=SCONF;
  if((Rst_Buf&0x80)==0) WDTC=0x81;
     else  { Rst_Buf=SCONF;
             SCONF=Rst_Buf&0x7f;
             Rst_Buf=WDTC;
             WDTC=Rst_Buf|0x20;
             WDTC=0x81;
           }  
  while(1)
   { Rst_Wdog();
     sendchar(DispBuf);
   }
 }

void Rst_Wdog(void)
 {  Rst_Buf=WDTC;
    WDTC=Rst_Buf|0x20;
 }

void Start()
{  EA=0;
   sda=1;      /*发送起始条件的数据信号*/
   scl=1;
   _Nop();     /*起始条件建立时间大于4.7US延时*/
   _Nop();
   _Nop();
   _Nop();
   _Nop();
   sda=0;      /*发送起始信号*/
   _Nop();     /*起始条件锁定*/
   _Nop();
   _Nop();
   _Nop();
   _Nop();
   scl=0;
 }
void Stop()
{  sda=0;      /*发结束条件的数据信号*/
   scl=1;      /*发结束条件的时钟信号*/
   _Nop();
   _Nop();
   _Nop();
   _Nop();
   _Nop();
   sda=1;     /*发送IIC总线结束信号*/
   _Nop();
   _Nop();
   _Nop();
   _Nop();
   sda=0;
   scl=0;
   EA=1;
}

void Ack_NoAck(bit askbit)
{
   if(askbit==0) sda=0;    /*在此发应答或非应答信号*/
         else sda=1;
   _Nop();
   _Nop();
   _Nop();
   scl=1;
   _Nop();
   _Nop();
   _Nop();
   _Nop();
   _Nop();
   scl=0;               /*清时钟线,钳住IIC总线以便继续接收*/
   _Nop();
   _Nop();
}

void SendByte(uchar c)
{
   uchar BitCnt;

   for(BitCnt=0;BitCnt<8;BitCnt++)    /*要传送的数据长度为8位*/
     {
        if((c<<BitCnt)&0x80) sda=1;   /*判断发送位*/
          else sda=0;
        _Nop();
        scl=1;                        /*置时钟为高,通知被控器开始接收数据*/
        _Nop();
        _Nop();
        _Nop();
        _Nop();
        _Nop();
        scl=0;
       }
        _Nop();
        _Nop();
        sda=1;                         /*8 位发送完后释放数据线,准备接收应答位*/
        _Nop();
        _Nop();
        scl=1;
        _Nop();
        _Nop();
        _Nop();
        if(sda==1) ack=0;
           else  ack=1;               /*判断是否接收到应答信号*/
        scl=0;
        _Nop();
        _Nop();
}

bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
   uchar i;
   Start();                         /*启动总线*/
   SendByte(sla);                   /*发送器件地址*/
     if(ack==0) return(0);
   SendByte(suba);                  /*发送器件子地址*/
     if(ack==0) return(0);
   for(i=0;i<no;i++)
    {
      SendByte(*s);                 /*发送数据*/
        if(ack==0) return(0);
      s++;
    }
   Stop();                          /*结束总线*/
   return (1);
}

uchar RcvByte()
{
   uchar retc;
   uchar BitCnt;
   retc=0;
   sda=1;                           /*置数据线为输入方式*/
   for(BitCnt=0;BitCnt<8;BitCnt++)
        {
          _Nop();
          scl=0;                    /*置时钟线为低,准备接收数据*/
          _Nop();
          _Nop();
          _Nop();
          _Nop();
          _Nop();
          scl=1;                    /*置时钟线为高使数据线上数据有效*/ 
          _Nop();
          _Nop();
          retc=retc<<1;
          if(sda==1) retc=retc+1;   /*读数据位,接收的数据放入RETC中*/
          _Nop();
          _Nop();
        }
   scl=0;
   _Nop();
   _Nop();
   return(retc);
}

bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{
   uchar i;
   Start();                        /*启动总线 */
   SendByte(sla);                  /*发送器件地址*/
     if(ack==0) return(0);
   SendByte(suba);                 /*发送器件子地址*/
     if(ack==0) return(0);
   Start();
   SendByte(sla+1);
     if(ack==0) return(0);
   for(i=0;i<no-1;i++)
    {
       *s=RcvByte();              /*发送数据*/
       Ack_NoAck(0);              /*发送应答位*/
       s++;
    }
   *s=RcvByte();
   Ack_NoAck(1);                  /*发送非应答位*/
   Stop();                        /*结束总线*/
   return(1);
 }
 
void sendchar(uchar *dispbuf1)
 {
  uchar dispbit ,disptime;
  RCLK=0;
   for(dispbit=0;dispbit<5;dispbit++)
     {sendata=disptab[dispbuf1[dispbit]];
      for(disptime=0;disptime<8;disptime++)
       {SRCLK=0;
        SER=sendbit_0;
        SRCLK=1;
        sendata=sendata>>1;
       }
     }
   RCLK=1;
 }


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -