Hallo zusammen,
hier einmal die Initialisierung eines Textdisplays mit dem ST7036 Controller an einem XMega ausgelegt auf 3,3V mit SPI-Übertragung.
Dieser Code ist eine auf den XMega angepaßte Version des Codes, der von Electronic Assembly rausgegeben wurde. Viel Spaß damit
Gruß Gerri
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