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

📄 pcf8584_lib.c

📁 pcf8584应用实例
💻 C
字号:
//****************************************************************
// Modulname:    $Source: C:/c51_buecher/Teil2/software/I2CBus/PCF8584/rcs/PCF8584_lib.c $
// User:         $Author: MEBA $
// Version:      $Name: $  $Revision: 1.1 $
// Datum:        $Date: 2001/02/03 10:30:28Z $
// Qualitaet:    $State: Exp $
//****************************************************************
// Beschreibung:
//****************************************************************
// Historie:
//==========
// $Log: PCF8584_lib.c $
// Revision 1.1  2001/02/03 10:30:28Z  MEBA
// Initial revision
//****************************************************************
// Steuerparameter:
//****************************************************************
#pragma
//****************************************************************
// globale Definitionen
//****************************************************************
#define PCF8584_LIB_C

//****************************************************************
// verwendete Include Dateien
//****************************************************************
#if __C51__ >= 600
  #pragma INCDIR (..\..\inc_c51b;..\..\chip_inc)
#else
  #error: !! Der C-Compiler unterstuetzt die Directive INCDIR nicht. !!
  #error: !! Sie m黶sen die Pfadangaben noch im Projekt eintragen.   !!
#endif

#include <defines.h>

// enthaelt allgemeine Einstellungen zum Projekt
#include <globals.h> 
#include <I2C_DEF.h>  
#include <I2C_LIB.h>        
#include <MCB517AC.h>      
#include <PCF8584.h> 
#include <PCF8584_lib.h> 
#include <ringbuf.h>       

//****************************************************************
// Deklarationen von Funktionen und Variablen
//****************************************************************
extern uchar ucError;

//****************************************************************
// Definitionen von Variablen
//****************************************************************
struct PCF8584_DEC xdata stPCF8584 _at_ CS_USER; 
bit    btI2C_Rec;
uchar  ucValue;

//***************************************************************
// Funktionsname uc_Init_PCF8584() 
// Version: 1.0    Datum 
// Uebergabeparameter: keine
// Beschreibung: 
// Initialisierung des PCF8584
//***************************************************************
uchar uc_Init_PCF8584(void){
 // 1. Anwahl S0' Register und einschreiben der Slave Adresse
   stPCF8584.S1.ucControl = PIN | S0_REG;  
   stPCF8584.S0.ucWrSlvAddress = 0x55;    
 // 2. Anwahl Clock Register S2. fCLK = 12MHz, fSCL = 90kHz
   stPCF8584.S1.ucControl = PIN | S2_REG; 
   stPCF8584.S0.ucIntVector = FCLK12| FSCL90;
 // 3. Anwahl Data Register S0. Freigabe des I2C-Bus, Idle-Mode
 //    SDA = SCL = 1, Schreib-/Lesezugriff auf den I2C-Datenbus
   stPCF8584.S1.ucControl = PIN | ESO | S0_REG | _ACK; 
 
 // 4. Ist ein Interrupt definiert, so wird hier die Initialisierung
 //    vorgenommen.
#if (PCF8584_INT == EXT_INT0)
   IT0 = EDGE;   // fallende Flanke
   EX0 = CLEAR;    // Freigabe des externen Interrupts 0  
   EAL = SET;	 // Interrupt freigeben
#endif
  return(OK);
}

//***************************************************************
// Funktionsname uc_Start_PCF8584() 
// Version: 1.0    Datum 
// Uebergabeparameter: keine
// Beschreibung: 
//  Startbedingung im PCF8584 setzen
//***************************************************************
uchar ucStatus;
uchar uc_Start_PCF8584(uchar ucSlvAddr){
 
 // 1. Anwahl Statusregister zum auslesen
   stPCF8584.S1.ucControl = ESO;  
  
 // 2. Statuswert auslesen und auf Ende des Busy warten
   while ((!stPCF8584.S1.ucStatus & _BB));

 // 3. Schreiben der Slave-Adresse
   stPCF8584.S0.ucWrSlvAddress = ucSlvAddr;

 // 4. Start generieren, ENI freigeben und Acknowledge setzen
   stPCF8584.S1.ucControl = ESO | ENI | STA | _ACK;
 
 // 5. Abfrage auf ACK 
   do{
     ucStatus = stPCF8584.S1.ucStatus;
   }
   while (ucStatus & PIN);
   if (ucStatus & LRB){
  #if (PCF8584_INT == EXT_INT0)
     IE0 = CLEAR;    // Loeschen der ext.Int0 Anforderung 
  #endif
     return(ERR);
   } 
   else {  
 // 6. Interrupt freigeben
  #if (PCF8584_INT == EXT_INT0)
     EX0 = SET;    // Freigabe des externen Interrupts 0  
  #endif

 // 7. Richtungsbit setzen
     if (ucSlvAddr & 0x01) btI2C_Rec = SET;
       else btI2C_Rec = CLEAR;
     return(OK);
   }
}

//***************************************************************
// Funktionsname uc_Stop_PCF8584() 
// Version: 1.0    Datum 
// Uebergabeparameter: keine
// Beschreibung: 
//  Stopbedingung im PCF8584 setzen
//***************************************************************
uchar uc_Stop_PCF8584(void){

 // 1. Anwahl Statusregister zum auslesen
   stPCF8584.S1.ucControl = ESO;  
  
 // 2. Stop setzen
   stPCF8584.S1.ucControl = PIN | ESO | STO | _ACK;  
  
  return(OK);
}
//***************************************************************
// Funktionsname v_Int_PCF8584() 
// Version: 1.0    Datum 
// Uebergabeparameter: keine
// Beschreibung: 
// Interrupt-Routine f黵 den PCF8584
//***************************************************************
void v_Int_PCF8584(void) interrupt PCF8584_INT using 1{

 // 1. Abfrage ob ein Byte gesendet werden soll
   if (btI2C_Rec == CLEAR){
 
    // 1.1 Abfrage ob ein Byte noch zum Senden ansteht
      if (ucHeadSendPCF8584 != ucTailSendPCF8584){

    // 1.2 Byte aus dem Sendebuffer auslesen und in den PCF8584
    //     schreiben
      stPCF8584.S0.ucWrI2CValue = aucSendBufferPCF8584[ucTailSendPCF8584];

    // 1.3 Tail Zeiger erh鰄en
 	  ucTailSendPCF8584++;

    // 1.4 Ueberpruefung ob Sendezeiger die Buffergrenze erreicht hat
    if (ucTailSendPCF8584 == MAXLENGTH_PCF8584) 
        ucTailSendPCF8584 = 0;

    // 1.5 Ueberpruefung ob alle Zeichen ausgesendet wurden
    if (ucHeadSendPCF8584 == ucTailSendPCF8584) 
        uc_Stop_PCF8584();
   }  
 // 2. Byte wurde empfngen
   else {
    // 2.1 Empfangenes Byte in den Empfangsbuffer schreiben
      aucRecBufferPCF8584[ucHeadRecPCF8584] = stPCF8584.S0.ucRdI2CValue; 

    // 2.2 Empfangszeiger erh鰄en
    ucHeadRecPCF8584++;

    // 2.3 Ueberpruefung ob Empfangszeiger die Buffergrenze erreicht hat
    if (ucHeadRecPCF8584 == MAXLENGTH_PCF8584) 
        ucHeadRecPCF8584 = 0;

    // 2.4 Ueberpruefung ob ein Speicherueberlauf erfolgt ist
    if (ucHeadRecPCF8584 == ucTailRecPCF8584) 
       btRecOverflowPCF8584 = SET;
     }
   }  
}

⌨️ 快捷键说明

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