Textdisplay mit ST7036 Controller am XMEGA-Board

Gerri

Neues Mitglied
18. Apr. 2011
22
0
1
Sprachen
Hallo zusammen,
hier einmal die Initialisierung eines Textdisplays mit dem ST7036 Controller an einem XMega ausgelegt auf 3,3V mit SPI-Übertragung.

Code:
#define ST7036_SI PIN7_bm
#define ST7036_CLK PIN5_bm
#define ST7036_CSB PIN3_bm
#define ST7036_RS PIN1_bm
#define ST7036_RESET PIN0_bm

//------------------------------------------------------------------------------
// ein Byte in das ???-Register des ST7036 senden
//------------------------------------------------------------------------------

void ST7036_write_byte( char data )
{
signed char	u8_zahl = 8;
char c_data;
	// Chip-Select auf log.0
	PORTD.OUTCLR = ST7036_CSB;
		c_data = data;

	do
	{
		_delay_loop_2(60);
		if ( c_data & 0x80 )		
			PORTD.OUTSET = ST7036_SI;		// und Datenleitung entsprechend setzen
		else
			PORTD.OUTCLR = ST7036_SI;

		_delay_loop_2(50);			// einen Clockpuls erzeugen
		// _delay_ms(100);
		PORTD.OUTCLR = ST7036_CLK;
		
		_delay_loop_2(60);
		// _delay_ms(100);
		PORTD.OUTSET = ST7036_CLK;
		
		c_data = c_data << 1;
		u8_zahl --;

	} while (u8_zahl > 0);

	// Chip-Select wieder auf log.1
	_delay_ms( 20 );
	PORTD.OUTSET = ST7036_CSB;
	_delay_ms(10);
}

//------------------------------------------------------------------------------
/* ein Byte in das Control-Register des KS0073 senden */
//------------------------------------------------------------------------------

void ST7036_write_command_byte( char data )
{
	PORTD.OUTCLR = ST7036_RS;
	_delay_loop_2( 1 );
	ST7036_write_byte( data );
}


//------------------------------------------------------------------------------
/* ein Byte in das Daten-Register des KS0073 senden */
//------------------------------------------------------------------------------

void ST7036_write_data_byte( char data )
{
	PORTD.OUTSET = ST7036_RS;
	_delay_loop_2( 7 );
	ST7036_write_byte( data );
}


//------------------------------------------------------------------------------
/* Reset durchführen */
//------------------------------------------------------------------------------

void ST7036_reset(void)
{
// #ifdef ST7036_RESET
	PORTD.OUTCLR = ST7036_RESET;	// Hardware-Reset log.0 an den ST7036 anlegen
	_delay_ms( 100 );
	PORTD.OUTSET = ST7036_RESET;
// #endif
}

//------------------------------------------------------------------------------
/* Initialisierung */
//------------------------------------------------------------------------------

void ST7036_init(void)
{

PORTD.OUTSET = ST7036_CLK;
PORTD.OUTSET = ST7036_CSB;

ST7036_reset();

	_delay_ms(50);		// mehr als 40ms warten

	ST7036_write_command_byte( 0x31 );	// Function set; 8 bit Datenlänge, 2 Zeilen

	_delay_us(50);		// mehr als 26,3µs warten

//evtl. rausnehmen
	 ST7036_write_command_byte( 0x31 );	// Function set; 8 bit Datenlänge, 2 Zeilen, Instruction table 1
	 _delay_us(50);		// mehr als 26,3µs warten

	ST7036_write_command_byte( 0x14 );	// Bias Set; BS 1/5; 3 zeiliges Display /1d
	_delay_us(50);		// mehr als 26,3µs warten

// evtl. rausnehmen
	// ST7036_write_command_byte( 0x7c );	// Kontrast C3, C2, C1 setzen /7c
	 // _delay_us(50);		// mehr als 26,3µs warten

	ST7036_write_command_byte( 0x55 );	// Booster aus; Kontrast C5, C4 setzen /50
	_delay_us(50);		// mehr als 26,3µs warten

	ST7036_write_command_byte( 0x6D );	// Spannungsfolger und Verstärkung setzen /6c
	_delay_ms( 50 );	// mehr als 200ms warten !!!

	ST7036_write_command_byte( 0x0C );	// Display EIN, Cursor AUS, Cursor BLINKEN AUS /0f
	_delay_us(50);		// mehr als 26,3µs warten

	//ST7036_write_command_byte( 0x01 );	// Display löschen, Cursor Home
	//_delay_us(400);		//

	ST7036_write_command_byte( 0x06 );	// Cursor Auto-Increment
	_delay_us(500);		// mehr als 26,3µs warten

}


//------------------------------------------------------------------------------
// positioniert den Cursor auf x/y.
// 0/0 ist links oben, 2/15 ist rechts unten
//------------------------------------------------------------------------------

void ST7036_goto_xy(unsigned char xwert, unsigned char ywert)
{

//_delay_loop_2(50000);
ST7036_write_command_byte(0x80 + ywert*0x20 + xwert);

//_delay_loop_2(50000);
PORTD.OUTSET = ST7036_RS;
}

//------------------------------------------------------------------------------
// Begrüßungstest auf dem Textdisplay
//------------------------------------------------------------------------------

void Hallo(void){
	ST7036_goto_xy(0,0);
	ST7036_write_data_byte(0b01001000);
	ST7036_goto_xy(1,0);
	ST7036_write_data_byte(0b01000001);
	ST7036_goto_xy(2,0);
	ST7036_write_data_byte(0b01001100);
	ST7036_goto_xy(3,0);
	ST7036_write_data_byte(0b01001100);
	ST7036_goto_xy(4,0);
	ST7036_write_data_byte(0b01001111);
}

Dieser Code ist eine auf den XMega angepaßte Version des Codes, der von Electronic Assembly rausgegeben wurde. Viel Spaß damit :)

Gruß Gerri
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)