Forum: Mikrocontroller und Digitale Elektronik St7565 128x32 Display nur 1. Zeile beschreibbar


von Tho S. (thoso805)


Lesenswert?

Hi,

ich habe Folgendes Display:
http://www.mouser.com/ds/2/291/NHD-C12832A1Z-FSW-FBW-3V3-53671.pdf
welches sich auf dem Evalutionsboard Xmega A3BU befindet.
Das Display ist über UARTD0 (SPI-Modus) verbunden.
Ich habe das Display initialisiert und die erste Zeile lässt sich 
beschreiben.
Leider passiert kein Auto-Inkrement um eine neue Zeile am Zeilende zu 
beschreiben.
Außerdem funtioniert der Befehl set_page_address nicht. Sobald ich den 
Cursor in eine Zeile setze die nicht die erste ist, wird nichts mehr auf 
dem Display angezeigt.
Hat jemand eine Idee woran es liegen könnte?

1
#include <avr/io.h>
2
#include <inttypes.h>
3
#include "lib_delay.h"
4
#include "lib_lcd.h"
5
#include "init_display_DEM128064K.h"
6
7
static const uint8_t init_cmd_array[]={
8
  0xA0 + 0,    // ADC select,  normal = 0, reverse = 1
9
  0xA6 + 0,    // normal mode = 0, reverse mode = 1
10
  0xC0 + 8,    // select COM output scan direction, 
11
  0xA2 + 0,    // LCD bias set, 0 = 1/9 bias, 1 = 1/7 bias
12
  0x2F,      // power control voltage follow on
13
  0x20 + 1,    // regulator resistor  0(light) ... 7(dark)
14
  0x1F,      // set contrast
15
  0xB0 + 0,    // set page address (0 to 15)
16
  0x40 + 0,    // set display start line
17
  0x10 + 0,    // set column address MSB from 0 to 15
18
  0x00 + 0,    // set column address LSB from 0 bis 15
19
  0xAE + 1,    // display on = 1, off = 0  
20
  0x81,      // electronic volume
21
  0x1B
22
};
23
24
void init_display_uartspi(void)
25
{
26
  uint8_t byte=sizeof(init_cmd_array);
27
  
28
  PORTE.DIR|= LCD_BACKLIGHT;
29
  PORTE.OUT|= LCD_BACKLIGHT;
30
  PORTF.DIR|= LCD_CS;
31
  PORTF.OUT|= LCD_CS;  
32
  PORTA.DIR|= LCD_RES;
33
  
34
  PORTD.DIR|= (LCD_CLK+LCD_A0+LCD_MOSI);        // set SCK, A0, MOSI as output
35
  PORTD.PIN1CTRL|= (PORT_OPC_TOTEM_gc+PORT_INVEN_bm);  // set SCK pin mode
36
  PORTD.OUT|= LCD_CLK;                // set SCK pin high
37
  
38
    USARTD0.CTRLC = (USART_CMODE_gm+0x02);      // Async, no parity, 8 bit data, 1 stop bit
39
    USARTD0.BAUDCTRLB = 0;              // BSCALE = 0
40
    USARTD0.BAUDCTRLA = 15;              // Baudrate 9600 @ 2MHz
41
    USARTD0.CTRLB = USART_TXEN_bm;          // TX Enable CLK
42
    
43
  delay_ms(50);                    // wait for clock stabilize
44
                    
45
  PORTA.OUT&=~LCD_RES;  // reset low
46
  delay_ms(500);        
47
  PORTA.OUT|=LCD_RES;    // reset high
48
  
49
    while(byte)
50
    {
51
      send_lcd_cmd(init_cmd_array[sizeof(init_cmd_array)-byte]);
52
      byte--;
53
    }
54
    fill_display(LCD_WIDTH+1,LCD_HEIGHT,0x00);
55
  
56
}
57
58
59
#include <avr/io.h>
60
#include <inttypes.h>
61
#include "init_display_DEM128064K.h"
62
#include "lib_delay.h"
63
#include "lib_lcd.h"
64
#include "const_lcd_data.h"
65
#define F_CPU 320000000UL
66
67
void clock_init(void)
68
{
69
  OSC.CTRL |= OSC_RC32MEN_bm;
70
  while(!(OSC.STATUS & OSC_RC32MRDY_bm));
71
  CCP = CCP_IOREG_gc;
72
  CLK.CTRL = CLK_SCLKSEL_RC32M_gc;  
73
}
74
75
int main(void)
76
{  
77
  
78
  int i;
79
   
80
  //clock_init();
81
    init_display_uartspi();
82
    
83
    while (1) 
84
    {
85
    send_lcd_mem(0xFF);
86
    }
87
  
88
}

Gruß
Tho

von pegel (Gast)


Lesenswert?

Ich hatte ein Display mit ähnlichem Controller.
Im Datenblatt gab es ein ganzes Kapitel über die Darstellung der 
fortlaufend übertragenen Daten mit Zeilen/Spaltenzähler und dessen 
Übertrag H/V.
Das fehlt bei deinem Controller ganz.

Statt dessen ist auf Seite 53 in
http://newhavendisplay.com/app_notes/ST7565R.pdf
der Ablauf für Data Display angegeben.

Sieht aus als bist du selbst der Zeilenzähler und musst dich um
(2) Display Start Line Set ...* 9
(3) Page Address Set ...* 10
(4) Column Address Set ...* 11
selbst kümmern bevor die Daten an der richtigen Position auf dem Display 
angezeigt werden.

von pegel (Gast)


Lesenswert?

Das war beim SSD1306
https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf
auf Seite 35.

von Beo Bachta (Gast)


Lesenswert?

Tho S. schrieb:
> Hat jemand eine Idee woran es liegen könnte?

Daran wird's nicht liegen, aber die CPU Geschwindigkeit
finde ich schon erstaunlich:

Tho S. schrieb:
> #define F_CPU 320000000UL

Hat da jemand die Clock hoch geskillt?

von Tho S. (thoso805)


Lesenswert?

Beo Bachta schrieb:
> Tho S. schrieb:
>> #define F_CPU 320000000UL
>
> Hat da jemand die Clock hoch geskillt?

oh. das hätte ich auskommentieren sollen. Ich habe eine Funktion die 
clock_init heißt und da wird der interne 32MhZ Oscillator aktiviert.

pegel schrieb:
> Sieht aus als bist du selbst der Zeilenzähler und musst dich um
> (2) Display Start Line Set ...* 9
> (3) Page Address Set ...* 10
> (4) Column Address Set ...* 11
> selbst kümmern bevor die Daten an der richtigen Position auf dem Display
> angezeigt werden.

das Problem ist ja, dass der page Adress Set Befehl nicht 
funktioniert...

von Beo Bachta (Gast)


Lesenswert?

Tho S. schrieb:
> Ich habe eine Funktion die
> clock_init heißt und da wird der interne 32MhZ Oscillator aktiviert.

Und wieviel Nullen hat 32MHz in Hz ausgedrückt?

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.