技術頻道

      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所有,未經許可不得轉載。

      主站蜘蛛池模板: 一区二区三区中文字幕| 美女啪啪一区二区三区| 99精品一区二区免费视频| 韩国资源视频一区二区三区| 熟女性饥渴一区二区三区| 亚洲爽爽一区二区三区| 成人精品一区久久久久| 人妻av无码一区二区三区| 性色av一区二区三区夜夜嗨| 国产免费伦精品一区二区三区| 国产免费一区二区三区VR| 无码av中文一区二区三区桃花岛| 国产日韩精品视频一区二区三区 | 国产精品资源一区二区| 成人欧美一区二区三区在线视频| 亚洲av乱码一区二区三区| 亚洲一区中文字幕| 久久精品免费一区二区| 精品无码国产一区二区三区AV| 日韩一区精品视频一区二区| 日本精品一区二区三区在线观看| 国内偷窥一区二区三区视频 | 国内精自品线一区91| 色一情一乱一区二区三区啪啪高| 亚洲AV无码一区二区三区人 | 亚洲一区二区在线视频| 亚洲av福利无码无一区二区| 亚洲A∨无码一区二区三区| 91video国产一区| 午夜AV内射一区二区三区红桃视| 国产精品99精品一区二区三区| 日本免费一区二区三区最新vr| 国产一区二区精品久久岳√| 一区二区三区在线免费观看视频| 嫩B人妻精品一区二区三区| 91亚洲一区二区在线观看不卡| 日韩伦理一区二区| 国偷自产Av一区二区三区吞精| 色窝窝无码一区二区三区 | 精品视频无码一区二区三区 | 久久久久99人妻一区二区三区|