... weil ich noch nicht so firm bin, wie ich per 4 Bit Modus die Daten "rüberschieben" muss ...
Na dann schieb ich mal (im 26Buchstaben+10Ziffern-Modus) den Code rüber:
Erstmal die includes-Belegungen-init-und-Anwendung
Code:
// .... Includieren
// - - - - - - - - - - - - - - - -
// ....
// ########>>>>>>>> LCD <<<<<<<<########
#include <lcd_162_xta.c> // LCD-Lib ähnlich Tr-Tester, akt. PORTB, PB0..5
// ....
// - - - - - - - - - - - - - - -
// ####>>>> Initialisierung/Anschlüsse von PORT B für LCD DEM 16x2
// PORT B LCD Wannenstecker
// data bit 4 PB0 0 A WS Pin1 |
// data bit 5 PB1 1 A Pin2 | -- Der 10-polige Wannenstecker
// data bit 6 PB2 2 A Pin3 | ist an die Belegung
// data bit 7 SCK, PB3 3 A Pin4 | des Transitortester angepasst
// RS line PB4 RS Pin5 | es kommen noch
// ENABLE line MOSI, PB5 EN1 Pin6 | Pin 9 GND und
// R/W (offen) MISO, PB6 R/W Pin7 | Pin 10 Vcc dazu
// NC (TasteC) SCK, PB7 NC Pin8 |___________________________
// GND Pin9
// Vcc Pn10
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// ....
// - - - - - - - - - - - - - - - -
// ....
// ============================================================================= =
// === HAUPTProgramm ========================================================== =
// ....
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int main(void) //
{
// ....
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Ports+Pins als Ein- (0) od. Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
// A = Ausgang, E = Eingang ohne , EU = Eingang MIT PullUp
// - - - - - - - - - - - - - - - -
// ....
DDRB = 0b11111011; // siehe aktuell oben
PORTB = 0b01000000; //
// ....
lcd_init(); // lib
/// ....
sei(); // Globalen Interrupt freigeben
// ....
// - - - - - - - - - - - - - - -
// LCD-Testroutinen
lcd_01 (); // LCD-Startinfo "R5M10 Archie xnn/© ..... inf
.....
// ============================================================
// ============================================================================= =
// == LCDausgabe, Folge 1
// ============================================================================= =
void lcd_01 (void) // LCDausgabe "1"
{ //
//LCD_SZ4 (); // Eigen Sonderzeichen, Satz 4 mit © kal
lcd_clear(); // Vor LCD-Ausgabe Display leeren lcd
lcd_string("R5M10 Archie 46");
Line2(); // An den Anfang der 2. Zeile springen
//lcd_data( 5 ); lcd_data( 6 ); // © - in zwei Hälften
lcd_string(" ---2014 08Mai");
waitms ( 500);
Line2(); // An den Anfang der 2. Zeile springen
lcd_string(" "); // Zeile löschen
waitms ( 500);
Line1(); // An den Anfang der 1. Zeile springen
lcd_string("R5jM 46 ......._");
Line2(); // Anfang 2. Zeile
lcd_string(" = online ");
} // Ende von void lcd_01
// ============================================================================= =
Und die beiden Bibliotheksteile:
Die lcd_162_xt_PB.h
Code:
// LCD-Ansteuerung im 4-Bit-Modus
// Erweiterte Fassung mit Routine für selbst definierte Zeichen
// Stand = Erweiterung von lcd-routines.h und lcd-routines.c
// vom 11. Apr. 2013 © 2013 by oberallgeier
// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
// Die folgenden Originalateien wurden beachtet oder zitiert
// http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
// http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
// + http://www.mikrocontroller.net/articles/HD44780#Benutzerdefinierte_Sonderzeichen
// + http://www.mikrocontroller.net/articles/Pseudo-Graphische_LCD-Ansteuerung
// vgl. auch http://www.mikrocontroller.net/topic/265717#2766442
//
// Die Pinbelegung ist über defines in lcd-routines.h einstellbar
//
// Ansteuerung ab KoCo_x15 geändert auf RS=PB4, EN=PB5
void lcd_data(unsigned char temp1);
void lcd_command(unsigned char temp1);
void lcd_send(unsigned char data);
void lcd_string(char *data);
void lcd_enable(void);
void lcd_init(void);
void lcd_clear(void);
void lcd_eep_string(const unsigned char *data);
void lcd_generatechar( uint8_t code, const uint8_t *data );
//LCD-Befehle
// - - - - - - - - - - - - - - -
#define CMD_SetEntryMode 0x04
#define CMD_SetDisplayAndCursor 0x08
#define CMD_SetIFOptions 0x20
#define CMD_SetCGRAMAddress 0x40 // für Custom-Zeichen
#define CMD_SetDDRAMAddress 0x80 // zum Cursor setzen
// Set CG RAM Address --------- 0b01xxxxxx (Character Generator RAM)
#define LCD_SET_CGADR 0x40
#define LCD_GC_CHAR0 0
#define LCD_GC_CHAR1 1
#define LCD_GC_CHAR2 2
#define LCD_GC_CHAR3 3
#define LCD_GC_CHAR4 4
#define LCD_GC_CHAR5 5
#define LCD_GC_CHAR6 6
#define LCD_GC_CHAR7 7
//#define LCD_GC_CHAR8 8
//#define LCD_GC_CHAR9 9
//#define LCD_GC_CHARA 10
//Makros für LCD
// - - - - - - - - - - - - - - -
#define Line1() SetCursor(1,0) //An den Anfang der 1. Zeile springen
#define Line2() SetCursor(2,0) //An den Anfang der 2. Zeile springen
#define SetCursor(y, x) lcd_command((uint8_t)(CMD_SetDDRAMAddress + (0x40*(y-1)) + x)) //An eine bestimmte Position springen
#define LCDLoadCustomChar() lcd_command(CMD_SetCGRAMAddress) //Custom-Zeichen laden
//Eigene Zeichen
// - - - - - - - - - - - - - - -
#define LCD_CHAR_OMEGA 244 //Omega-Zeichen
#define LCD_CHAR_U 228 //µ-Zeichen
#define LCD_CHAR_DIODE 0 //Dioden-Icon; wird als Custom-Character erstellt
// LCD Befehle
// - - - - - - - - - - - - - - -
#define CLEAR_DISPLAY 0x01
// Pinbelegung für das LCD, an verwendete Pins anpassen
#define LCD_PORT PORTB
#define LCD_DDR DDRB
#define LCD_RS PB4
#define LCD_EN1 PB5
... und die lcd_162_xt_PB.c
Code:
// LCD-Ansteuerung im 4-Bit-Modus
// Erweiterte Fassung mit Routine für selbst definierte Zeichen
// Stand = Erweiterung von lcd-routines.h und lcd-routines.c
// vom 11. Apr. 2013 © 2013 by oberallgeier
// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
// Die folgenden Originalateien wurden beachtet oder zitiert
// http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
// http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
// + http://www.mikrocontroller.net/articles/HD44780#Benutzerdefinierte_Sonderzeichen
// + http://www.mikrocontroller.net/articles/Pseudo-Graphische_LCD-Ansteuerung
// vgl. auch http://www.mikrocontroller.net/topic/265717#2766442
//
// Die Pinbelegung ist über defines in lcd-routines.h einstellbar
#include <avr/io.h>
#include "lcd_162_xt_PB.h"
#include <util/delay.h>
#include <avr/eeprom.h>
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// sendet ein Datenbyte an das LCD
void lcd_data(unsigned char temp1)
{
LCD_PORT |= (1<<LCD_RS); // RS auf 1 setzen
lcd_send(temp1);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// sendet einen Befehl an das LCD
void lcd_command(unsigned char temp1)
{
LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 setzen
lcd_send(temp1);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//Eigentliche LCD-Zugriffs-Funktion; 4-Bit-Modus
void lcd_send(unsigned char data) {
// oberes Nibble setzen
LCD_PORT = (LCD_PORT & 0xF0) | ((data >> 4) & 0x0F);
_delay_us(5);
lcd_enable();
// unteres Nibble setzen
LCD_PORT = (LCD_PORT & 0xF0) | (data & 0x0F);
_delay_us(5);
lcd_enable();
_delay_us(60);
LCD_PORT &= 0xF0;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// erzeugt den Enable-Puls
void lcd_enable(void)
{
LCD_PORT |= (1<<LCD_EN1);
_delay_us(10); // kurze Pause
// Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers verlängern
// http://www.mikrocontroller.net/topic/80900
LCD_PORT &= ~(1<<LCD_EN1);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Initialisierung:
// Muss ganz am Anfang des Programms aufgerufen werden.
void lcd_init(void)
{
LCD_DDR = LCD_DDR | 0x0F | (1<<LCD_RS) | (1<<LCD_EN1); // Port auf Ausgang schalten
// muss 3mal hintereinander gesendet werden zur Initialisierung
_delay_ms(30);
LCD_PORT = (LCD_PORT & 0xF0 & ~(1<<LCD_RS)) | 0x03;
lcd_enable();
_delay_ms(5);
lcd_enable();
_delay_ms(1);
lcd_enable();
_delay_ms(1);
LCD_PORT = (LCD_PORT & 0xF0 & ~(1<<LCD_RS)) | 0x02;
_delay_ms(1);
lcd_enable();
_delay_ms(1);
// 4Bit / 2 Zeilen / 5x7
lcd_command(CMD_SetIFOptions | 0x08);
// Display ein / Cursor aus / kein Blinken
lcd_command(CMD_SetDisplayAndCursor | 0x04);
// inkrement / kein Scrollen
lcd_command(CMD_SetEntryMode | 0x02);
lcd_clear();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Sendet den Befehl zur Löschung des Displays
void lcd_clear(void)
{
lcd_command(CLEAR_DISPLAY);
_delay_ms(5);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Schreibt einen String auf das LCD
void lcd_string(char *data)
{
while(*data) {
lcd_data(*data);
data++;
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//String aus EEPROM laden und an LCD senden
void lcd_eep_string(const unsigned char *data)
{ //
unsigned char c;
while(1) //
{ //
c = eeprom_read_byte(data); //
if(c==0) return; //
lcd_data(c); //
data++; //
}
} // Ende void lcd_eep_string(const
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Schreibt ein Zeichen in den Character Generator RAM
// Daten liegen direkt im RAM
void lcd_generatechar(uint8_t code, const uint8_t *data)
{ //
lcd_command(LCD_SET_CGADR|(code<<3)); // Startposition des Zeichens einstellen
for (uint8_t i=0; i<8; i++) // Bitmuster übertragen
{ //
lcd_data(data[i]); //
} //
} // Ende void lcd_generatechar(uint8_t code,
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
... also ALLES für den Port B entsprechend der beschriebenen Pinbelegung. Läuft so bei mir auf praktisch allen megas.
Viel Erfolg
Lesezeichen