📄 lcd_mat_lib.c
字号:
//***************************************************************
// 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 + -