技術頻道

      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无码一区二区三区四区| 亚洲国产精品一区二区三区在线观看| 一区二区三区精密机械| 无码人妻精品一区二区三区99不卡| 国产一区二区高清在线播放| 无码人妻久久一区二区三区| 久久精品成人一区二区三区| 国产精品亚洲一区二区三区久久 | 亚洲一区视频在线播放| 国产成人精品一区二区三区无码 | 精品乱码一区二区三区在线| 成人免费av一区二区三区| 精品一区二区三区自拍图片区| 国产一区二区好的精华液| 国产在线精品一区二区不卡麻豆| 国产精品视频一区二区三区经| 精彩视频一区二区| 久久久老熟女一区二区三区| 日韩人妻无码免费视频一区二区三区| 99久久精品国产高清一区二区| 亚洲乱码一区二区三区国产精品| 国产精品女同一区二区久久 | 国产美女露脸口爆吞精一区二区| 日韩精品无码一区二区中文字幕 | 精品女同一区二区三区免费站 | 久久精品国内一区二区三区| 清纯唯美经典一区二区| 日韩一区二区三区不卡视频| 无码人妻精品一区二区三区东京热 | 中文乱码精品一区二区三区| 蜜桃无码一区二区三区| 久久国产三级无码一区二区| 精品无码综合一区二区三区 |