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

📄 lcd_mat_lib.c

📁 LCD操作集成库源文件
💻 C
📖 第 1 页 / 共 2 页
字号:
//***************************************************************
// Modulname:    $Source: C:/c51_buecher/Teil2/software/LCD/LCD_Lib/rcs/Lcd_mat_Lib.c $
// User:         $Author: MEBA $
// Version:      $Name: $  $Revision: 1.1 $
// Datum:        $Date: 2001/02/03 10:50:22Z $
// Qualitaet:    $State: Exp $
//***************************************************************
// Beschreibung:
//***************************************************************
// Historie:
//==========
// $Log: Lcd_mat_Lib.c $
// Revision 1.1  2001/02/03 10:50:22Z  MEBA
// Initial revision
//***************************************************************
// Steuerparameter:
//***************************************************************
#pragma
//***************************************************************
// globale Definitionen
//***************************************************************
#define LCD_MAT_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>
#include <globals.h>
#include <time_out_lib.h>
// enthaelt allgemeine Einstellungen zum Projekt
#include <lcd_def.h>
#include <cg_ram_lib.h>


//***************************************************************
// Enthaelt zusaetzliche Definitionen fuer die Ansteuerung der LCD
// ueber I睠-Bus.
//***************************************************************
#if (LCD_DEV == LCD_I2C)
 #include <i2c_def.h>
 #include <i2c_chip_lib.h>
 #include <i2c_lib.h>
#endif 

//***************************************************************
// Enthaelt zusaetzliche Definitionen fuer die Ansteuerung der LCD
// ueber PIO.
//***************************************************************
#if (LCD_DEV == LCD_PIO || LCD_DEV == LCD_ADR)
   bit btRS;
#endif



#if (LCD_DEV == LCD_PORT || LCD_DEV == LCD_I2C)
//***************************************************************
// Hier muessen die Anpassungen vorgenommen werden, wie das LCD
// an den PCF8574. PCF8575 angeschlossen ist.
//***************************************************************
bdata uchar ucPort;
sbit  sbD0  =ucPort ^ LCD_DEF_D0;
sbit  sbD1  =ucPort ^ LCD_DEF_D1;
sbit  sbD2  =ucPort ^ LCD_DEF_D2;
sbit  sbD3  =ucPort ^ LCD_DEF_D3;

sbit sbEN   = ucPort ^ LCD_DEF_EN;
sbit sbR_W  = ucPort ^ LCD_DEF_R_W;
sbit btRS   = ucPort ^ LCD_DEF_RS;
#endif


bit btLF = 0;
bit btRS_Old;
bit btID;
uchar ucDD_Adr;   // aktuelle Adresse

//***************************************************************
// Funktionsname uc_LCDIni() 
// Version: 1.0    Datum 
// Uebergabeparameter: ucLCD_Control
// Beschreibung: 
// Die Funktion uc_LCDIni initialisiert den HD44780-Controller
//***************************************************************
uchar uc_LCDIni(uchar ucLCD_Control){
 uchar ucError = OK;
 uchar ucData, ucStep;

// 1. Ueberpruefung ob das LCD ueber einen 4 bit-datenbus angesprochen
//    wird. In diesem Fall muessen die Initialisierungsdaten bei der
//    Verwendung der unteren 4 Datenbits ins untere Nibble kopiert werden.  
#if (LCD_DEV == LCD_PORT || LCD_DEV == LCD_I2C) && LCD_DATEN == _4BIT_BUS
  #if (LCD_NIBBLE == LOW_NIBBLE)
     ucData = INIT_DISP /16; // Daten ins untere Nibble schieben
  #else
     ucData = INIT_DISP;     // Daten im oberen Nibble belassen
  #endif

  #if (LCD_DEV == LCD_PORT)
    LCD_EN = LCD_R_W = LCD_RS = CLEAR; // Steuerport zuruecksetzen
  #endif
      sbR_W = LCD_WRITE;
#else
  ucData = INIT_DISP;
#endif

// 2. Initialisierung des LCD nach Datenblatt (siehe hierzu Seite 95, Teil 2). 
  btRS = LCD_INST;
  for (ucStep = 0; ucStep <3; ucStep++){

    #if LCD_DEV == LCD_PORT
  	  #if (LCD_NIBBLE == LOW_NIBBLE) 
        ucPort = ucData;
      #else
        ucPort = ucData;
      #endif
      EN_CLK;
    #elif LCD_DEV == LCD_ADR
      *WRITE_INS = ucData;
    #elif LCD_DEV == LCD_I2C
      ucPort = ucData;
      sbEN = SET;
      ucError = uc_I2C2IO( LCD_I2C_ADR, ucPort);
	  if (ucError) return(ucError);
      sbEN = CLEAR;
      ucError = uc_I2C2IO( LCD_I2C_ADR, ucPort);
	  if (ucError) return(ucError);
	#elif LCD_DEV == LCD_PIO
	// Setzen des Datenbytes an das LCD
	  stPIO.LCD_PIO_PORT.ucWrite = ucData;
      stPIO.ucControl = LCD_PIO_EN | SET_BIT_8255;
      stPIO.ucControl = LCD_PIO_EN | CLR_BIT_8255;
    #endif

   v_Wait(500);
  }

//***************************************************************
// Initialisierung ueber I睠-Bus
//***************************************************************
#if LCD_DEV == LCD_I2C
  #if LCD_DATEN == _8BIT_BUS
    ucError = NODEF_LCD;
  #else
  #if (LCD_NIBBLE == LOW_NIBBLE) 
    ucPort = INIT_4BIT /16;
  #else
    ucPort = INIT_4BIT;
  #endif
    sbEN = SET;
    ucError = uc_I2C2IO( LCD_I2C_ADR, ucPort);
	  if (ucError) return(ucError);
    sbEN = CLEAR;
    ucError = uc_I2C2IO( LCD_I2C_ADR, ucPort);
	  if (ucError) return(ucError);
  #endif
#endif

//***************************************************************
// Initialisierung ueber Portpins
//***************************************************************
#if LCD_DEV == LCD_PORT
  #if LCD_DATEN == _8BIT_BUS
    ucError = NODEF_LCD;
  #else
  #if (LCD_NIBBLE == LOW_NIBBLE) 
    ucPort = INIT_4BIT / 16; // !! Nur gueltig wenn Datenport Px^0-Px^3
  #else
    ucPort = INIT_4BIT;        // !! Nur gueltig wenn Datenport Px^4-Px^7
  #endif
    EN_CLK;
   v_Wait(50); // Ab jetzt ist BF-Abfrage moeglich
  #endif
#endif

//***************************************************************
// Initialisierung ueber Adresse im XRAM
//***************************************************************
#if LCD_DEV == LCD_ADR
   #if LCD_BUS == _8BIT_BUS
     *WRITE_INS = INIT_8BIT;    // 8 Datenbit Busbreite 
   #else
     *WRITE_INS = INIT_4BIT;    // 4 Datenbit Busbreite  
     wait(50);
   #endif
#endif

//***************************************************************
// Initialisierung ueber PIO im XRAM
//***************************************************************
#if LCD_DEV == LCD_ADR
   #if LCD_BUS == _8BIT_BUS
     stPIO.LCD_PIO_PORT.ucWrite = INIT_8BIT; // 8 Datenbit Busbreite 
     stPIO.ucControl = LCD_PIO_EN | SET_BIT_8255;
     stPIO.ucControl = LCD_PIO_EN | CLR_BIT_8255;
   #else
     stPIO.LCD_PIO_PORT.ucWrite = INIT_4BIT; // 4 Datenbit Busbreite 
     stPIO.ucControl = LCD_PIO_EN | SET_BIT_8255;
     stPIO.ucControl = LCD_PIO_EN | CLR_BIT_8255;
   #endif
   wait(50);
#endif

//***************************************************************
// Bei erfolgreicher Initialisierung wird das Display aktiviert
//***************************************************************
if (ucError == OK) {
  btRS = LCD_INST;
 #if LCD_DATEN == _8BIT_BUS
  putchar(FUNCTION_SET | _8BIT | ucLCD_Control); v_Wait(200);
  putchar(FUNCTION_SET | _8BIT | ucLCD_Control);
 #else
  putchar(FUNCTION_SET | _4BIT | ucLCD_Control); v_Wait(200);
  putchar(FUNCTION_SET | _4BIT | ucLCD_Control);
 #endif
  putchar(CONTROL | DISPLAY_OFF);
  putchar(CONTROL | DISPLAY_ON | CURSOR_ON | BLINK);
  uc_Clrscr();
  putchar(ENTRY | INCREMENT);
  btID = INCREMENT >>1;
}
 btRS =LCD_DATA; // Umschalten auf Datenmodus
 return(ucError);
}


//***************************************************************
// Funktionsname uc_ReadData() 
// Version: 1.0    Datum 
// Uebergabeparameter: keine
// Beschreibung: 
// Funktion uc_ReadData() erlaubt Ihnen die Daten vom CG-RAM bzw.
// vom DD-RAM des HD44780 auszulesen. Je nach eingestellter    
// Adresse werden die Daten entweder vom DD-RAM oder CG-RAM    
// ausgelesen.                                                 
//***************************************************************
uchar uc_ReadData(void) {
  bit btRS_Bak;
  uchar erg_uc;

  btRS_Bak = btRS;
  btRS = LCD_DATA;
#if LCD_DEV == LCD_ADR
 erg_uc = *READ_DATA;
#elif LCD_DEV == LCD_PORT
  LCD_D0 = LCD_D1 = LCD_D2 = LCD_D3 = SET; // Datenport zum lesen freigeben
  LCD_R_W = LCD_READ;  // Instruktionen sollen vom HD44780 gelesen werdn
   LCD_RS = LCD_DATA;

⌨️ 快捷键说明

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