Hallo! Hab meine Temperaturanzeige endlich zum laufen gebracht:-) Jetzt wird aber auf dem Display anstatt des "°" Zeichens nur ein "-" angezeigt.....kann man den Zeichensatz solcher Displays manipulieren????
Jetzt sind wieder die Hellseher gefragt, um was es sich für ein LCD-Modul und SOftware handelt. sorry, ich habe meine Glaskugel gerade ausgeliehen.
Also: es handelt sich um einen Atmel 90S8535 Chip und ein mit CodeVision
geschriebens C-Programm...
Das LCD hat 4 Zeilen a 20 Zeichen....ist so ein Teil von
Conrad...leider haben die grad Ihre Seite unten und ich komm nicht an
das Datenblatt......
Aber es muss doch eine Möglichkeit geben, das Problem wenigstens mal
versuchsweise anzugehen.....ich schreib mit
lcd_putsf("Temp. extern °C:");
in das Display, irgendwie wird das ° als - interpretiert:-( Das
Programm benutzt eine LCD.H (als Anlage anbei!).
Der Anhang geht nicht....hier halt als Text:
/* LCD driver routines
CodeVisionAVR C Compiler
(C) 1998-2000 Pavel Haiduc, HP InfoTech S.R.L.
BEFORE #include -ING THIS FILE YOU
MUST DECLARE THE I/O ADDRESS OF THE
DATA REGISTER OF THE PORT AT WHICH
THE LCD IS CONNECTED!
EXAMPLE FOR PORTB:
#asm
.equ __lcd_port=0x18
#endasm
#include <lcd.h>
*/
#ifndef LCD_INCLUDED
#define LCD_INCLUDED
#pragma used+
void _lcd_ready(void);
void _lcd_write_data(unsigned char data);
// write a byte to the LCD character generator or display RAM
void lcd_write_byte(unsigned char addr, unsigned char data);
// read a byte from the LCD character generator or display RAM
unsigned char lcd_read_byte(unsigned char addr);
// set the LCD display position x=0..39 y=0..3
void lcd_gotoxy(unsigned char x, unsigned char y);
// clear the LCD
void lcd_clear(void);
void lcd_putchar(char c);
// write the string str located in SRAM to the LCD
void lcd_puts(char *str);
// write the string str located in FLASH to the LCD
void lcd_putsf(char flash *str);
// initialize the LCD controller
void lcd_init(unsigned char lcd_columns);
#pragma used-
#pragma library lcd.lib
#endif
-------------------------------------------------------------------
Inhalt der LCD.LIB:
/* LCD driver routines
CodeVisionAVR C Compiler
(C) 1998-2003 HP InfoTech S.R.L.
*/
#asm
.equ __lcd_direction=__lcd_port-1
.equ __lcd_pin=__lcd_port-2
.equ __lcd_rs=0
.equ __lcd_rd=1
.equ __lcd_enable=2
.equ __lcd_busy_flag=7
#endasm
#pragma used+
static unsigned char _base_y[4]={0x80,0xc0};
unsigned char _lcd_x,_lcd_y,_lcd_maxx;
#pragma used-
void _lcd_ready(void)
{
#asm
in r26,__lcd_direction
andi r26,0xf ;set as input
out __lcd_direction,r26
sbi __lcd_port,__lcd_rd ;RD=1
cbi __lcd_port,__lcd_rs ;RS=0
__lcd_busy:
rcall __lcd_delay
sbi __lcd_port,__lcd_enable ;EN=1
rcall __lcd_delay
sbic __lcd_pin,__lcd_busy_flag
rjmp __lcd_busy
cbi __lcd_port,__lcd_enable ;EN=0
#endasm
}
#asm
__lcd_write_nibble:
andi r26,0xf0
or r26,r27
out __lcd_port,r26 ;write
sbi __lcd_port,__lcd_enable ;EN=1
rcall __lcd_delay
cbi __lcd_port,__lcd_enable ;EN=0
__lcd_delay:
ldi r31,15
__lcd_delay0:
dec r31
brne __lcd_delay0
ret
#endasm
void _lcd_write_data(unsigned char data)
{
#asm
cbi __lcd_port,__lcd_rd ;RD=0
in r26,__lcd_direction
ori r26,0xf7 ;set as output
out __lcd_direction,r26
in r27,__lcd_port
andi r27,0xf
ld r26,y
rcall __lcd_write_nibble ;RD=0, write MSN
ld r26,y
swap r26
rcall __lcd_write_nibble ;write LSN
sbi __lcd_port,__lcd_rd ;RD=1
#endasm
}
/* write a byte to the LCD character generator or display RAM */
#if funcused lcd_write_byte
void lcd_write_byte(unsigned char addr, unsigned char data)
{
_lcd_ready();
_lcd_write_data(addr);
_lcd_ready();
#asm
sbi __lcd_port,__lcd_rs ;RS=1
#endasm
_lcd_write_data(data);
}
#endif
#if funcused lcd_read_byte
#asm
__lcd_read_nibble:
sbi __lcd_port,__lcd_enable ;EN=1
rcall __lcd_delay
in r30,__lcd_pin ;read
cbi __lcd_port,__lcd_enable ;EN=0
rcall __lcd_delay
andi r30,0xf0
ret
#endasm
/* read a byte from the LCD character generator or display RAM */
unsigned char lcd_read_byte(unsigned char addr)
{
_lcd_ready();
_lcd_write_data(addr);
_lcd_ready();
#asm
in r26,__lcd_direction
andi r26,0xf ;set as input
out __lcd_direction,r26
sbi __lcd_port,__lcd_rs ;RS=1
rcall __lcd_delay
rcall __lcd_read_nibble ;read MSN
mov r26,r30
rcall __lcd_read_nibble ;read LSN
cbi __lcd_port,__lcd_rd ;RD=0
swap r30
or r30,r26
#endasm
}
#endif
/* set the LCD display position x=0..39 y=0..3 */
#if funcused lcd_gotoxy || funcused lcd_putchar || funcused lcd_puts ||
funcused lcd_putsf
void lcd_gotoxy(unsigned char x, unsigned char y)
{
_lcd_ready(); // RS=0
_lcd_write_data(_base_y[y]+x);
_lcd_x=x;
_lcd_y=y;
}
#endif
// clear the LCD
#if funcused lcd_clear || funcused lcd_init
void lcd_clear(void)
{
_lcd_ready(); // RS=0
_lcd_write_data(0xc); // cursor off
_lcd_ready();
_lcd_write_data(1); // clear
_lcd_x=_lcd_y=0;
}
#endif
#if funcused lcd_putchar || funcused lcd_puts || funcused lcd_putsf
#pragma keep+
void lcd_putchar(char c)
{
#asm
push r30
push r31
ld r26,y
set
cpi r26,10
breq __lcd_putchar1
clt
#endasm
++_lcd_x;
if (_lcd_x>_lcd_maxx)
{
#asm("__lcd_putchar1:")
++_lcd_y;
lcd_gotoxy(0,_lcd_y);
#asm("brts __lcd_putchar0")
};
#asm
rcall __lcd_ready
sbi __lcd_port,__lcd_rs ;RS=1
ld r26,y
st -y,r26
rcall __lcd_write_data
__lcd_putchar0:
pop r31
pop r30
#endasm
}
#pragma keep-
#endif
// write the string str located in SRAM to the LCD
#if funcused lcd_puts
void lcd_puts(char *str)
{
#ifdef MODEL_TINY
#asm
clr r31
#endasm
#endif
#ifdef MODEL_SMALL
#asm
ldd r31,y+1
#endasm
#endif
#asm
ld r30,y
__lcd_puts0:
ld r26,z+
tst r26
breq __lcd_puts1
st -y,r26
rcall _lcd_putchar
rjmp __lcd_puts0
__lcd_puts1:
#endasm
}
#endif
// write the string str located in FLASH to the LCD
#if funcused lcd_putsf
void lcd_putsf(char flash *str)
{
#asm
ld r30,y
ldd r31,y+1
__lcd_putsf0:
#endasm
#ifdef CHIP_ATMEGA128
#asm("elpm")
#else
#asm("lpm")
#endif
#asm
tst r0
breq __lcd_putsf1
adiw r30,1
st -y,r0
rcall _lcd_putchar
rjmp __lcd_putsf0
__lcd_putsf1:
#endasm
}
#endif
#if funcused lcd_init
void _long_delay(void)
{
#asm
clr r26
clr r27
__long_delay0:
sbiw r26,1 ;2 cycles
brne __long_delay0 ;2 cycles
#endasm
}
// initialize the LCD controller
void lcd_init(unsigned char lcd_columns)
{
#asm
cbi __lcd_port,__lcd_enable ;EN=0
cbi __lcd_port,__lcd_rs ;RS=0
#endasm
_lcd_maxx=lcd_columns;
_base_y[2]=lcd_columns+0x80;
_base_y[3]=lcd_columns+0xc0;
_long_delay();
_lcd_write_data(0x30);
_long_delay();
_lcd_write_data(0x30);
_long_delay();
_lcd_write_data(0x30);
_long_delay();
_lcd_write_data(0x20);
_lcd_ready();
_lcd_write_data(0x28);
_lcd_ready();
_lcd_write_data(6);
lcd_clear();
}
#endif
björn, du bist aber wirklich ein fall für die psychiatrie...
Was soll diese Antwort auf meine Frage??? Das klingt stark nach einer Beleidigung...normalerweise sollte man gegen solche dummen Bemerkungen rechtlich vorgehen: AUFRUF AN DEN ADMIN: Bitte die Antwort von Emil und diese hier von mir LÖSCHEN, da sie beleidigend ist und hier im Forum wirklich nichts zu suchen hat!
langen quelltext postet man besser als anhang. und der geht auch..
@björn: du bist ja schon für deine ausdrucksweise und fragen bekannt: http://www.mikrocontroller.net/forum/read-1-35370.html#35605 abgesehen davon, dass du worte wie "bitte", "danke" usw. kaum verwendest, gibt es bei dir auch nur einen geringen wunsch, etwas nachzudenken und selbst zu einem analytischen ergebnis zu kommen; also "kleiner" hinweis auch diesmal (und "danke" brauchst du weder mir, noch herrn peter dannegger sagen, wir verdienen es ja nicht, am besten uns von forum weglöschen, damit es für deine postings platz genug gibt): einmal die ISO-8859-1 (Latin1)-Tabelle mit dem Zeichensatz von HD44780 vergleichen, dann wirst du vielleicht erkennen, wie sinnlos dein posten von lcd.h ist... ich könnte auch weiter schreiben, aber was soll es...irgedwann bekommt jeder das seine...(und auch du deine temp. anzeige zum laufen, hoffentlich..)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.