Hallo,
ich versuch schon seit einiger zeit ein Programm zu shcreiben mit dem ich das LCD auf dem PICDEM ansteuern kann.
Hier im Forum gibt es ja jede menge Beispiele und Hilfen...mit einem dieser Beispiele (ich weiß leider nimmer von wem der code war) hab ich angefangen.
Leider meldet mir der CCS Compiler immer einen Fehler: A #DEVICE required before this line
die Fehlermeldung bezieht sich auf folgende Zeile (LCD.c):
struct port_d_layout const LCD_READ={15,0}; // Lesen
Hier mal mein Programm:
main.c
//
=================================== I N C L U D E S =====================================
#include "hardware.h"
#include "LCD.c"
//================================ D E F I N I T I O N E N ================================
#define LCD_BLANK(){lcd_send_byte(0,1);delay_ms(2);}
unsigned char wert; //Zälvariable
//================================ H A U P T P R O G R A M M =============================
void main()
{
int data;
set_tris_a(0x00); //Setzt Port A als Input (Bit=1 -> Input)
set_tris_b(0xFF); //Setzt Port B als Output (Bit=0 -> Output)
set_tris_c(0x00); //Setzt Port C als Input (Bit=1 -> Input)
set_tris_d(0x00); //Setzt Port D als Input (Bit=1 -> Input)
lcd_init();
LCD_BLANK();
lcd_gotoxy(1,1);
lcd_putc("\cBaufeld\2");
lcd_putc("V 1.0");
delay_ms(500); //Pause 500ms
wert=0; //Setzt Zählvariable auf 0
//================================ H A U P T S C H L E I F E =============================
while(TRUE)
{
if(0 == input(PIN_A4))
{
output_high(PIN_B2);
}
if(1 == input(PIN_A4))
{
output_low(PIN_B2);
}
output_high(PIN_B1);
delay_ms(10);
output_LOW(PIN_B1);
delay_ms(10);
output_toggle(PIN_B0);
i2c_start();
i2c_write(0x9A); //Adresse des Temperatusensor
i2c_write(0x00); //Read Temp
i2c_start();
i2c_write(0x9B);
data = i2c_read();
i2c_stop();
LCD_BLANK(); //hier wird das LCD gelöscht
printf(lcd_putc,"\fTemp:%03u",data); //hier wird den Wert auf dem Display geschrieben
delay_ms(1000);
} //end while(TRUE)
} //end main
LCD.c (hier ausm Forum "geklaut")
struct port_d_layout const LCD_READ={15,0}; // Lesen
struct port_d_layout const LCD_WRITE={0,0}; // Schreiben
#define lcd_type 2 // Typ der Anzeige (0=5x7, 1=5x10, 2=2 lines)
// verschiedene Eigenschaften der LCD-Anzeige
// 0x0C = Display an
// 0x01 = Display löschen
// 0x06 = Adresspointer inkrementieren und Displayinhalt nicht verschieben
byte CONST LCD_INIT_STRING[4]={0x20|(lcd_type<<2),0x0C,0x01,6};
// LCD-Display wird ausgelesen
byte lcd_read_byte()
{
byte low,high;
set_tris_d(LCD_READ);
output_high(LCD_RW);
delay_cycles(1);
high=portd.lcddata;
output_low(LCD_ENABLE);
delay_cycles(1);
output_high(LCD_ENABLE);
delay_us(2);
low=portd.lcddata;
output_low(LCD_ENABLE);
set_tris_d(LCD_WRITE);
return((high<<4)|low);
}
// versendet ein Nibble an das Display
void lcd_send_nibble(byte n)
{
portd.lcddata=n;
delay_cycles(1);
output_high(LCD_ENABLE);
delay_us(2);
output_low(LCD_ENABLE);
}
// Hier wird das komplette Byte übertragen. Zuerst aber wird das Busy Flag überprüft und danach wird
// das Byte getrennt und zwei Nibbles übertragen werden
void lcd_send_byte(byte address,byte n)
{
output_low(LCD_RS);
while (bit_test(lcd_read_byte(),3)); // Hier wird D7 vom LCD-Display abgefragt
output_bit(LCD_RS,address);
delay_cycles(1);
output_low(LCD_RW);
delay_cycles(1);
output_low(LCD_ENABLE);
lcd_send_nibble(n>>4);
lcd_send_nibble(n&0xF);
}
// Initialisierung des LCD-Displays
void lcd_init()
{
byte i;
set_tris_a(LCD_WRITE);
set_tris_d(LCD_WRITE);
output_low(LCD_ENABLE);
delay_ms(15);
for(i=1;i<=3;++i)
{
lcd_send_nibble(3);
delay_ms(5);
}
lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING[i]);
}
// Hier wird der Anzeige auf bestimmten Koordinaten gesetzt
void lcd_gotoxy(byte x, byte y)
{
byte address;
if(y==1) address=0;
if(y==2) address=0x40;
if(y==3) address=0x10;
if(y==4) address=0x50;
address+=x-1;
lcd_send_byte(0,0x80|address);
}
// Hier wird der Text auf das Display geschrieben
void lcd_putc(char f)
{
switch (f)
{
case '\c' : lcd_send_byte(0,1);
delay_ms(2);
break;
case '\1' : lcd_gotoxy(1,1); break;
case '\2' : lcd_gotoxy(1,2); break;
case '\3' : lcd_gotoxy(1,3); break;
case '\4' : lcd_gotoxy(1,4); break;
default : lcd_send_byte(1,f); break;
}
}
hardware.h
//=================================== I N C L U D E S =====================================
#include "18F4431.h" //PIC18F4431 Ports
//============================= C O N F I G U R A T I O N =================================
#fuses HS,NOWDT,NOPROTECT,NOLVP // Konfigurationbits
#use delay(clock=4M, oscillator) // Clock Speed
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, BRGH1OK) // RS232 Konfiguration
#use i2c(master,sda=PIN_C4,scl=PIN_C3) // I2C Schnittstelle
//Struktur für den Port A
#use standard_io(a)
#define S4 PIN_A4
//Struktur für den Port B
#use standard_io(b)
#define LED_1 PIN_B3
#define LED_2 PIN_B2
#define LED_3 PIN_B1
#define LED_4 PIN_B0
//Struktur für den Port C
// scl=PIN_C3 <- siehe oben (use i2c)
// sda=PIN_C4 <- siehe oben (use i2c)
//Struktur für den Port D
#use fast_IO(d)
struct port_d_layout
{
int lcddata:4; //LCD Daten RD0..RD3
int unused:4;
}portd;
#define LCD_ENABLE PIN_D6
#define LCD_RW PIN_D5
#define LCD_RS PIN_D4
#byte portd = 0xF83
Für eure hilfe wäre ich euch sehr dankbar!
Gruß Eric