Gast
#920443
Ich versuch einfach mal ein simples lcd anzusteuern aber es funktioniert
leider nicht! Ich vermute die Initialisierung ist vielleicht falsch
Mein mikrocontrollerist Pic 16F648A mein Stromlaufplan sieht so
aus(sehen sie bitte das bild)
-> LCD Module 162f BC BC
Meine code :
#include <INLINE.H> // Ist fuer Assembleranweisungen notwendig
#include <MATH16.H>
/****************** Portbelegung
********************************************************/
#define RB4 4
#define RB5 5
#define RA0 0
#define RA3 3
//#define LCD_Enable 2 //RA2
//#define LCD_RS 1 //RA1
//#pragma bit LCD_Enable @ PORTA.2
//#pragma bit LCD_RS @ PORTA.1
#define LCD_RS 0b.00000010 //RS-Pin ist Bit 1,
RA1
#define LCD_En 0b.00000100 //Enable-Pin ist Bit 2, RA2
#pragma config |= 0b.11111110100010 // Konfigurationswort
// Bit 4,1-0: FOSC=HS
(010)
// Bit 2 : WDTE=OFF
(0)
// Bit 3 : PWRTE=ON
(0)
// Bit 5 : MCLRE( RESET-Pin )=1
// Bit 6 : BODEN=off(0)
// Bit 7 : LVP =1 = RB4/PGM pin has PGM
function, low-voltage programming enabled
// Bit 8 : CPD =OFF (1)
// Bit 12-9 : Unimplemented
// Bit 13 : CP=OFF (1)
/****************** Konstanten
**********************************************************/
#define degre 0b11011111 // Das Zeichen ° für Temperatur
// die Display Befehle
#define CLEAR_DISPLAY 0x01 // DB1 wird gesetzt
#define CURSOR_HOME 0x02 // DB2 wird gesetzt
#define SET_FUNKTION 0x20 // DB5 wird gesetzt
#define ACHT_BIT_MODE 0x10 // DB4 wird gesetzt
#define ZWEI_LINE 0x08 // DB3 wird gesetzt
#define DOTs_5x10 0x04 // DB2 wird gesetzt
#define DISPLAY_CURSER_MODE 0x08 // DB3 wird gesetzt
#define DISPLAY_ON 0x04 // DB2 wird gesetzt
#define CURSER_ON 0x02 // DB1 wird gesetzt
#define BLINKING_ON 0x01 // DB0 wird gesetzt
#define ENTRY_MODE_SET 0x04 // DB2 wird gesetzt
#define INKREMENT 0x02 // DB1 wird gesetzt
#define DISPLAY_IS_SHIFTED 0x01 // DB0 wird gesetzt
#define code1 0x3F // 00111111
#define code2 0xFF // 11111111
#define code3 0xFF // 11111111
void delay_us(char micro)
{
#asm
pause nop
nop
decfsz micro,f
goto pause
#endasm
}
void delay_ms( uns16 ms)
{
while(ms) // Schleife verlassen wen ms=0 ist
{
OPTION = 2; // Vorteiler auf 8 einstellen
TMR0 = 131; // 125 * 8 = 1000 (= 1 ms)
while (TMR0); // abwarten einer Milisekunde
ms--; // "ms" mit jeder Milisekunde ernidrigen
}
}
void display_enable(void)
{
PORTA|=LCD_En;
//LCD_Enable=1;
delay_us(1); // kurze Pause
PORTA &=~(LCD_En);
//LCD_Enable=0;
}
void display_befehl(unsigned char command)
{
PORTA &=~LCD_RS; //RS auf 0 setzen
PORTB &= 0xC0; // 11000000
PORTB |= (command & 0x3F); // 3F= 00111111
// D6 an PORTA.3, D7 an PORTA.0
if (command & 0x40) // 1000000
PORTA |= 0x40;
else
PORTA &= ~0x40;
if (command & 0x80) //10000000
PORTA |= 0x80;
else
PORTA &= ~0x80;
display_enable();
delay_ms(1);
}
void display_zeichen(unsigned char zeichen)
{
PORTA|=LCD_RS; // RS auf 1 setzen--> LCD soll das Zeichen anzeigen
PORTB &= 0xC0; // 11000000
PORTB |= ( zeichen & 0x3F); // 00111111
// D6 an PORTA.3, D7 an PORTA.0
if ( zeichen & 0x40) // 1000000
PORTA |= 0x40;
else
PORTA &= ~0x40;
if ( zeichen & 0x80) //10000000
PORTA |= 0x80;
else
PORTA &= ~0x80;
display_enable();
delay_ms(1);
}
// Sende den Befehl zur Löschung des Displays
void display_clear(void)
{
display_befehl(CLEAR_DISPLAY);
delay_ms(5);
}
void display_init(void)
{
delay_ms(15);
//PORTA &=~(1<<LCD_RS);
display_befehl(0x30);
delay_ms(5);
display_befehl(0x30);
delay_us(100);
display_befehl(0x30);
delay_us(100);
display_befehl( SET_FUNKTION | ACHT_BIT_MODE | ZWEI_LINE ); // 8Bit
Modus 2 Zeilen 5x7
display_befehl(DISPLAY_CURSER_MODE ); // Display aus Cursor aus
kein Blinken
display_clear(); // Display Clear
display_befehl(ENTRY_MODE_SET | INKREMENT); // inkrement / Keine
shift
}
// Sendet den Befehl: Cursor Home
void cursor_return_home(void)
{
display_befehl(CURSOR_HOME);
delay_ms(5);
}
// setzt den Cursor in Zeile und Spalte
void set_cursor(unsigned char x, unsigned char y)
{
display_befehl(DISPLAY_CURSER_MODE | DISPLAY_ON | CURSER_ON);
unsigned char position = 0;
switch (x) {
case 1: position = 0x80 + 0x00 + y; break; // 1er Zeile
case 2: position = 0x80 + 0x40 + y; break; // 2er Zeile
}
display_befehl(position);
// Curser-Unterstrich ausblinden
display_befehl(DISPLAY_CURSER_MODE| DISPLAY_ON );
}
// Schreibt einen String auf das LCD
void display_string(const char *string)
{
while(*string) {
display_zeichen(*string);
string++;
}
}
void main(void)
{
char c = 'a';
const char *str = "abcd";
CMCON=0x07; // CMCON = 0b00000111....
Porta=digital I/O
TRISA=0b.10110000;
TRISB=0b.11000000;
display_init();
display_clear();
display_string(c);
display_clear();
display_string(str);
// set PB7 as output
TRISB &= ~0x80;
while(1){
PORTB ^= 0x80;
}
}
