Forum: Mikrocontroller und Digitale Elektronik Temperaturanzeige -displaycode falsch???


von Björn Wekerle (Gast)


Lesenswert?

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????

von MichaelS (Gast)


Lesenswert?

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.

von Björn Wekerle (Gast)


Angehängte Dateien:

Lesenswert?

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!).

von Björn Wekerle (Gast)


Lesenswert?

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

von emil (Gast)


Lesenswert?

björn, du bist aber wirklich ein fall für die psychiatrie...

von Björn Wekerle (Gast)


Lesenswert?

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!

von Bastian (Gast)


Lesenswert?

langen quelltext postet man besser als anhang. und der geht auch..

von emil (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.