Hallo
also hab das Programm an meine LCD-Steuerung angepasst bei mir geht es aber nicht! Auf dem Display steht nur " \L L " Also nichts sinnvolles.
Code:
#include <stdio.h>
#include "LCD/lcd-routines.h"
#include "LCD/lcd.c"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#define preValue 57724
int volatile gSeconds = 0;
SIGNAL (SIG_OVERFLOW1)
{
gSeconds++;
TCNT1 = preValue;
}
int main (void)
{
int seconds = 0;
int minutes = 0;
int hours = 0;
char mytime[] = "00:00:00";
lcd_init ();
TCCR1B = (1<<CS00) | (1<<CS01);
TIMSK |= (1<<TOIE1);
TCNT1 = preValue;
sei ();
lcd_data ("Time: ");
lcd_data (mytime);
while (1)
{
if (seconds != gSeconds)
{
seconds = gSeconds;
if (seconds == 60)
{
seconds = 0;
gSeconds = 0;
minutes++;
}
if (minutes == 60)
{
minutes = 0;
hours++;
}
if (hours == 24)
hours = 0;
/* Uhrzeit formatieren */
sprintf (mytime, "%02d:%02d:%02d", hours, minutes, seconds);
/* und auf dem Display ausgeben */
set_cursor (6,1);
lcd_data (mytime);
}
}
}
Hier meine LDC.c
Code:
// Pinbelegung über defines einstellbar
#include <avr/io.h>
#include <util/delay.h>
#include "lcd-routines.h"
// LCD Befehle
#define CLEAR_DISPLAY 0x01
#define CURSOR_HOME 0x02
// Pinbelegung für das LCD
#define LCD_PORT PORTA
#define LCD_DDR DDRA
#define LCD_RS 4
#define LCD_EN 5
// sendet ein Datenbyte an das LCD
void lcd_data(unsigned char temp1)
{
unsigned char temp2 = temp1;
LCD_PORT |= (1<<LCD_RS); // RS auf 1 setzen
temp1 = temp1 >> 4;
temp1 = temp1 & 0x0F;
LCD_PORT &= 0xF0;
LCD_PORT |= temp1; // setzen
lcd_enable();
temp2 = temp2 & 0x0F;
LCD_PORT &= 0xF0;
LCD_PORT |= temp2; // setzen
lcd_enable();
_delay_us(200);
}
// sendet einen Befehl an das LCD
void lcd_command(unsigned char temp1)
{
unsigned char temp2 = temp1;
LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 setzen
temp1 = temp1 >> 4; // oberes Nibble holen
temp1 = temp1 & 0x0F; // maskieren
LCD_PORT &= 0xF0;
LCD_PORT |= temp1; // setzen
lcd_enable();
temp2 = temp2 & 0x0F; // unteres Nibble holen und maskieren
LCD_PORT &= 0xF0;
LCD_PORT |= temp2; // setzen
lcd_enable();
_delay_us(200);
}
// erzeugt den Enable-Puls
void lcd_enable(void)
{
LCD_PORT |= (1<<LCD_EN);
_delay_us(1);
LCD_PORT &= ~(1<<LCD_EN);
}
// Initialisierung:
// Muss ganz am Anfang des Programms aufgerufen werden.
void lcd_init(void)
{
LCD_DDR = LCD_DDR | 0xF | (1<<LCD_RS) | (1<<LCD_EN); // Port auf Ausgang schalten
// muss 3mal hintereinander gesendet werden zur Initialisierung
_delay_ms(200);
LCD_PORT &= 0xF0;
LCD_PORT |= 0x03;
LCD_PORT &= ~(1<<LCD_RS); // RS auf 0
lcd_enable();
_delay_ms(200);
lcd_enable();
_delay_ms(200);
lcd_enable();
// 4 Bit Modus aktivieren
LCD_PORT &= 0xF0;
LCD_PORT |= 0x02;
lcd_enable();
// 4Bit / 2 Zeilen / 5x7
lcd_command(0x28);
// Display ein / Cursor aus / kein Blinken
lcd_command(0x0C);
// inkrement / kein Scrollen
lcd_command(0x06);
lcd_clear();
}
// Sendet den Befehl zur Löschung des Displays
void lcd_clear(void)
{
lcd_command(CLEAR_DISPLAY);
_delay_ms(200);
}
// Sendet den Befehl: Cursor Home
void lcd_home(void)
{
lcd_command(CURSOR_HOME);
_delay_ms(200);
}
// setzt den Cursor in Zeile y (1..4) Spalte x (0..15)
void set_cursor(uint8_t x, uint8_t y)
{
switch (y) {
case 1: lcd_command(0x80+0x00+x); break; // 1. Zeile
case 2: lcd_command(0x80+0x40+x); break; // 2. Zeile
//case 3: lcd_command(0x80+0x10+x); break; // 3. Zeile
//case 4: lcd_command(0x80+0x50+x); break; // 4. Zeile
}
}
Hier meine lcd-routines.h
Code:
void lcd_data(unsigned char temp1);
void lcd_command(unsigned char temp1);
void lcd_enable(void);
void lcd_init(void);
void lcd_home(void);
void lcd_clear(void);
void set_cursor(uint8_t x, uint8_t y);
Vielleicht kann jemand von euch seine Display Ansteuerungsdatein Posten?
Grüße Johannes[/quote]
Lesezeichen