📄 lcd.c
字号:
//#########################################################################
// File: LCD.C
//
// Ansteuerung einer LCD-Anzeige
// im 8 Bit Daten Mode
//
//#########################################################################
// Last change: 21.04.2003
//#########################################################################
// holger.klabunde@t-online.de
// http://home.t-online.de/home/holger.klabunde/homepage.htm
//#########################################################################
// Compiler: AVR-GCC 3.2
//#########################################################################
#include <io.h>
#include "mydefs.h"
#include "lcd.h"
//*******************************************
// Schreibt ein Datenbyte in die LCD-Anzeige
//*******************************************
void LCDWriteByte(unsigned char data)
{
LCDCS_OFF();
PORTC=data;
LCDCS_ON();
LCDCS_OFF();
Delay100us(1); //etwas auf die Anzeige warten
}
//**************************************************
//Schreibt einen Text in die LCD-Anzeige
//**************************************************
void LCDWrite(char *__putstr)
{
char __ps;
while((__ps = *__putstr))
{
__putstr++;
if (__ps== 0) break;
LCDWriteByte(__ps);
}
}
//****************************************************
// Springt auf Zeile x und Position y der LCD-Anzeige
// G黮tig f黵 2 Zeilen
//****************************************************
void LCDPos(unsigned char zeile,unsigned char position)
{
unsigned char buff;
LCDRS_OFF(); //Umschalten auf Kontrollregister
// 0x80 wegen Display Adress Set.
// Erste Position ist bei mir 1, nicht 0.
// Offset's
// Zeile 1 -> 0x00+0x80-0x01=0x7F
// Zeile 2 -> 0x40+0x80-0x01=0xBF
switch(zeile)
{
case 1: buff=0x7F+position; break;
case 2: buff=0xBF+position; break;
default : buff=0x80; break; //1,1
}
LCDWriteByte(buff);
LCDRS_ON(); //Umschalten auf Datenregister
Delay100us(1); //etwas auf die Anzeige warten
}
//*****************************************
// L鰏cht die LCD Anzeige
// Cursor steht dann auf Position 1,Zeile 1
// Gilt auch f黵 mehrzeilige Anzeigen
//*****************************************
void LCDCls(void)
{
LCDRS_OFF(); //Controlregister
LCDWriteByte(0x01); //CLS
LCDRS_ON(); //Umschalten auf Datenregister
Delay1ms(5);
}
//*********************************************
//Stellt die Funktionsweise der LCD Anzeige ein
//*********************************************
void LCDInit(void)
{
int i;
LCDRS_OFF(); //Control Register
LCDCS_OFF(); //LCD-Anzeige anw鋒len
//Software Reset laut Hitachi Datenblatt
Delay1ms(255); //M鰃lichen Power On Reset abwarten
for(i=0; i<3; i++)
{
PORTC=0x30; //Auf den Port legen
LCDCS_ON(); //schreiben
LCDCS_OFF(); //LCD-Anzeige abw鋒len
Delay1ms(100); //Ein bi遚hen warten auf die Anzeige
}
//Ende Software Reset
//Der erste Schreibzugriff nach dem Reset ist ein 8 Bit
//Zugriff!! Also nur einmal schreiben, nicht Low-High Nibble.
//Um die 4Bit Operation einzuschalten
// lcdport=0x02; //4 Bit Operation
// outp(lcdport,PORTB); //Auf den Port legen
// LCDCS_ON(); //High Nibble schreiben
// Delay1ms(5);
// LCDWriteByte(0x28); //4 Bit Operation,2 Line,5x7 Font
LCDWriteByte(0x38); //8 Bit Operation,2 Line,5x7 Font
Delay1ms(5);
LCDWriteByte(0x14); //Cursor Move,Right Shift
Delay1ms(5);
// LCDWriteByte(0x0F); //Display on, Cursor on ,Cursor blink
// LCDWriteByte(0x0E); //Display on, Cursor on ,Cursor no blink
LCDWriteByte(0x0C); //Display on, Cursor off ,Cursor no blink
Delay1ms(5);
LCDWriteByte(0x06); //Increment, Display Freeze
Delay1ms(5);
LCDWriteByte(0x02); //Cursor Home
Delay1ms(5);
LCDRS_ON(); //LCD-Datenregister
}
//#######################################################
//Zeigt ein Byte im HexCode (ohne 0x vorne) an
void ShowHex(unsigned char by)
//#######################################################
{
unsigned char buff;
buff=by>>4; //Highnibble zuerst
if(buff<10) buff+='0'; //ASCII Code erzeugen
else buff+=0x37; //Gro遙uchstaben
LCDWriteByte(buff);
buff=by&0x0f; //Danach das Lownibble
if(buff<10) buff+='0'; //ASCII Code erzeugen
else buff+=0x37; //Gro遙uchstaben
LCDWriteByte(buff);
}
//#######################################################
void ShowHexLong(unsigned long l)
//#######################################################
{
ShowHex((unsigned char)(l>>24));
ShowHex((unsigned char)(l>>16));
ShowHex((unsigned char)(l>>8));
ShowHex((unsigned char)(l));
}
//###################################################################################
//Nicht sonderlich genau !!
void Delay1ms(unsigned int time)
//###################################################################################
{
unsigned int i;
for(i=0; i<time; i++) Delay100us(10);
}
//###################################################################################
//Nicht sonderlich genau !!
//time<=255 !!
void Delay100us(unsigned char time)
//###################################################################################
{
unsigned char k,l;
for(k=0; k<time; k++)
{
for(l=0; l<40; l++)
{
//Ein CPU-Clock = 0.125us bei 8MHz
NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP();
NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP();
#ifdef F_11059
NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP();
#endif
#ifdef F_16
NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP();
NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP();
#endif
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -