技術頻道

      FM24C64匯編測試程序c語言(8052)

      //THIS CODE WAS DESIGNED TO DEMONSTRATE HOW THE FM24C04/FM24C04A SERIAL FRAM COULD
      //BE INTERFACED TO THE 8051 MICROCONTROLLER. THE INTERFACE USES 2 LINES
      //FROM PORT 2 (P2.7 AND P2.6) TO COMMUNICATE.
      //THE CODE SHOWN DEMONSTRATES A 'RANDOM READ' AND 'BYTE WRITE'. THE OTHER *
      //MODES OF OPERATION CAN BE CREATED BY EXPANDING UPON THESE ROUTINES.
      //深圳市華胄科技有限公司
      //the first date writed:2003-11-20
      //=============================
      #include
      #include
      #define uchar unsigned char
      #define uint unsigned int
      #define IIC_READ 0XA1 //定義讀指令
      #define IIC_WRITE 0XA0 //定義寫指令
      #define NOP _nop_()
      //#define SDA INT0
      //#define SCL T0
      //==============================
      uchar idata buff[32]; //save the byte read out form iic device in test operation
      uchar idata readbuff[32];//測試數組,暫存寫入讀出數據
      //uchar writebuff[32];
      //===============================
      sbit SDA=P1^4;//P2^7; //THE SDA BIT IS PORT 2 BIT 7
      sbit SCL=P1^7;//P2^6; //THE SCL BIT IS PORT 2 BIT 6
      //sbit WP=P2^5;
      //sbit test=P1^0;
      //===============================
      //define a bit_operation byte to use in shift operation
      //use this mode can achieve high operation speed
      uchar bdata bbyte;//定義位操作用數組,采用此方法可提高位操作速度
      sbit a0=bbyte^0;
      sbit a1=bbyte^1;
      sbit a2=bbyte^2;
      sbit a3=bbyte^3;
      sbit a4=bbyte^4;
      sbit a5=bbyte^5;
      sbit a6=bbyte^6;
      sbit a7=bbyte^7;
      //========================================
      bit IFACK; //record the SDA state to confirn if ACK has happened
      bit NO_ACK; //no ack flag
      bit BUS_FAULT; //bus fault flag
      //========================================
      //FUNCTION:ROUTES TO PROVIDE A START SIGNAL
      void start(void)
      {
      SCL=0;SDA=1;SCL=1;SDA=0;SCL=0;
      }
      //=======================================
      //FUNCTION:ROUTES TO PROVIDE A STOP SIGNAL
      void stop(void)
      {
      SCL=0;SDA=0;SCL=1;SDA=1;SCL=0;
      }
      //=====================================
      //FUNCTION:ROUTES TO PROVIDE ACK SINGAL
      void ack(void)
      {
      SCL=0;SDA=0;SCL=1;SCL=0;
      }
      //=====================================
      //FUNCTION:ROUTES TO RELEASE THE SDA TO RECEIVE A ACK SIGNAL
      // OR TO PROVIDE A NO_ACK SIGNAL
      //type=1等待應答信號
      //type=0 產生無應答信號
      void nack(uchar type)
      {
      SCL=0;SDA=1;SCL=1;IFACK=SDA; SCL=0;
      if(type)
      {
      if(IFACK)//如果無應答信號,則置標志位NO_ACK,程序中止
      {
      NO_ACK=1;//用戶可以加入自己的異常處理程序
      //while(1);
      }
      else NO_ACK=0;
      }
      }
      //=======================================================
      //FUNCTION:THE IIC DEVICE SHIFT OUT A BYTE TO THE MASTER
      uchar inbyte(void) {//從IIC器件中讀出數據
      SDA=1;
      SCL=1;a7=SDA;SCL=0;
      SCL=1;a6=SDA;SCL=0;
      SCL=1;a5=SDA;SCL=0;
      SCL=1;a4=SDA;SCL=0;
      SCL=1;a3=SDA;SCL=0;
      SCL=1;a2=SDA;SCL=0;
      SCL=1;a1=SDA;SCL=0;
      SCL=1;a0=SDA;SCL=0;
      return(bbyte);
      }
      //=======================================================
      //FUNCTION:THE IIC DEVICE SHIFT IN A BYTE FROM THE MASTER
      void outbyte(uchar outdata) {//將數據寫放IIC器件
      bbyte=outdata;
      SDA=a7;SCL=1;SCL=0;
      SDA=a6;SCL=1;SCL=0;
      SDA=a5;SCL=1;SCL=0;
      SDA=a4;SCL=1;SCL=0;
      SDA=a3;SCL=1;SCL=0;
      SDA=a2;SCL=1;SCL=0;
      SDA=a1;SCL=1;SCL=0;
      SDA=a0;SCL=1;SCL=0;
      }
      //======================================================
      //FUNCTION:BYTE WRITE. 'add' THE WRITE ADDRESS, 'wbyte' THE DATA WANT TO WRITE
      void writebyte(uint add,uchar wbyte)//add為寫入地址,wbyte為寫入數據
      {
      uchar temph,templ;
      temph=(uchar)(add/256);
      templ=(uchar)(add%256);
      start(); //開始信號
      outbyte(IIC_WRITE); //寫命令
      nack(1); //等待應答
      outbyte(temph); //寫地址
      nack(1); //等待應答
      outbyte(templ); //寫地址
      nack(1);
      outbyte(wbyte); //寫數據
      nack(1); //等待應答
      stop(); //停止信號
      }
      //=====================================================
      //FUNCTION:RANDOM READ.'add' IS THE ADDRESS WANT TO READ
      uchar readbyte (uint add)//add為讀地址
      {
      uchar temp,temph,templ;
      temph=(uchar)(add/256);
      templ=(uchar)(add%256);
      start(); //開始信號
      outbyte(IIC_WRITE); //寫命令
      nack(1); //等待應答
      outbyte(temph); //寫地址
      nack(1); //等待應答
      outbyte(templ); //寫地址
      nack(1);
      start(); //開始信號
      outbyte(IIC_READ); //讀命令
      nack(1); //等待應答
      temp=inbyte(); //讀數據
      nack(0); //無應答
      stop(); //停止信號
      return(temp);
      }
      //=================================================
      //連寫函數
      //add為讀起始地址,ptr數據保存指針,writelen為寫入數據長度
      void writebyteseq(uint add,uchar *ptr,uint writelen)
      {
      //uchar temp;
      uchar temph,templ;
      uint i;
      temph=(uchar)(add/256);
      templ=(uchar)(add%256);
      start();
      outbyte(IIC_WRITE);
      nack(1);
      outbyte(temph);
      nack(1);
      outbyte(templ);
      nack(1);
      for(i=0;i255){j=0;}
      for(i=0;i<32;i++) readbuff[i]=j;
      writebyteseq(0, readbuff, 32);
      for(i=0;i<32;i++) readbuff[i]=0;
      readbyteseq(0,readbuff,32);
      //for(i=0;i<32;i++)
      //writebyte(i,i);
      for(i=0;i<32;i++)
      buff[i]=readbyte(i);
      i=0;
      }
      }

      文章版權歸西部工控xbgk所有,未經許可不得轉載。

      主站蜘蛛池模板: 日韩精品一区二区亚洲AV观看 | 无码人妻精品一区二区三区东京热| 亚洲av综合av一区| 狠狠色婷婷久久一区二区| 无码一区二区三区| 韩日午夜在线资源一区二区 | 香蕉免费看一区二区三区| 成人午夜视频精品一区| 精品国产区一区二区三区在线观看 | 日韩欧国产精品一区综合无码| 中文字幕永久一区二区三区在线观看| 欧美日韩一区二区成人午夜电影| 亚洲AV无码一区二区三区人 | 亚洲av无码一区二区三区天堂古代 | 亚洲国产成人精品久久久国产成人一区二区三区综 | 动漫精品一区二区三区3d| 亚无码乱人伦一区二区| 精品成人一区二区三区四区| 国模极品一区二区三区| 精品国产一区在线观看| 午夜DV内射一区区| 内射少妇一区27P| AV天堂午夜精品一区| 中文字幕亚洲一区| 午夜天堂一区人妻| 99精品国产一区二区三区2021| 亚洲爆乳精品无码一区二区| 无码喷水一区二区浪潮AV| 国产成人无码精品一区不卡| 福利一区二区三区视频午夜观看| 大帝AV在线一区二区三区| 精品国产一区二区二三区在线观看| 国产精品无码一区二区三区在| 国产一区二区三区在线免费 | 色窝窝无码一区二区三区色欲| 久久久精品人妻一区二区三区四| 国模私拍福利一区二区| 国产成人一区二区在线不卡| 精品乱子伦一区二区三区| 国产精品无码一区二区三区电影 | 最新欧美精品一区二区三区|