📄 pcf8584_lib.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 + -