Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
2014:spi-glcd-msp [2015/01/09 09:12] David Čada [Návrh zapojení převodníku] |
2014:spi-glcd-msp [2015/01/09 10:14] (aktuální) David Čada [Závěr] |
||
---|---|---|---|
Řádek 31: | Řádek 31: | ||
== Odeslání 16b proměnné == | == Odeslání 16b proměnné == | ||
+ | |||
+ | <code cpp> | ||
void send_SPI(unsigned int c) | void send_SPI(unsigned int c) | ||
{ | { | ||
+ | //funkce odešle po SPI lince 16bitovou proměnnou | ||
+ | |||
unsigned int a; | unsigned int a; | ||
- | a=c>>8; | + | a=c>>8; //do a je uložena horní část 16bitové proměnné |
- | while(!(UCA0IFG&UCTXIFG)); | + | while(!(UCA0IFG&UCTXIFG)); //čekej dokud je buffer prázdný |
- | UCA0TXBUF=(unsigned char)a; | + | UCA0TXBUF=(unsigned char)a; //pošli horní část proměnné |
- | while(!(UCA0IFG&UCTXIFG)); | + | while(!(UCA0IFG&UCTXIFG)); //čekej dokud je buffer prázdný |
- | UCA0TXBUF=(unsigned char)c; | + | UCA0TXBUF=(unsigned char)c; //pošli spodní část proměnné |
- | while(!(UCA0IFG&UCTXIFG)); | + | while(!(UCA0IFG&UCTXIFG)); //čekej dokud je buffer prázdný |
P1OUT |= BIT6; | P1OUT |= BIT6; | ||
Řádek 46: | Řádek 50: | ||
return; | return; | ||
} | } | ||
+ | </code> | ||
- | == Funkce pro odeslání příkazu== | + | == Funkce pro odeslání příkazu do LCD== |
+ | <code cpp> | ||
void LCD_CMD(unsigned char command) | void LCD_CMD(unsigned char command) | ||
{ | { | ||
Řádek 63: | Řádek 69: | ||
return; | return; | ||
} | } | ||
- | == Funkce pro odeslání dat== | + | </code> |
+ | |||
+ | == Funkce pro odeslání dat do LCD== | ||
+ | <code cpp> | ||
void LCD_DATA(unsigned char data) | void LCD_DATA(unsigned char data) | ||
{ | { | ||
Řádek 77: | Řádek 86: | ||
return; | return; | ||
} | } | ||
+ | </code> | ||
== Umístění kurzoru na pozici == | == Umístění kurzoru na pozici == | ||
+ | <code cpp> | ||
void cursor(unsigned int pozice) | void cursor(unsigned int pozice) | ||
{ | { | ||
Řádek 85: | Řádek 96: | ||
LCD_DATA((unsigned char)pozice); // higher | LCD_DATA((unsigned char)pozice); // higher | ||
} | } | ||
+ | </code> | ||
== Vynulování RAM displeje == | == Vynulování RAM displeje == | ||
+ | <code cpp> | ||
void graphics_clear(void) | void graphics_clear(void) | ||
{ | { | ||
- | //funkce vyčistí grafickou část | + | |
+ | //funkce vyčistí grafickou a textovou část | ||
+ | //všechny pozice RAM jsou vyplněny nulami | ||
+ | //bez vynulování zobrazuje LCD nahodilé symboly a grafiku | ||
unsigned int m=0; //proměnné pro cykly | unsigned int m=0; //proměnné pro cykly | ||
unsigned int n=0; //proměnné pro cykly | unsigned int n=0; //proměnné pro cykly | ||
Řádek 98: | Řádek 115: | ||
for(n=0;n<40;n++) | for(n=0;n<40;n++) | ||
{ | { | ||
- | cursor(9600+m*360+n); | + | cursor(9600+m*360+n); //výběr jednotlivých sektorů paměti LCD |
- | LCD_CMD(0x42); | + | LCD_CMD(0x42); //nastav zápis |
+ | //sektor LCD vyplněn nulami | ||
LCD_DATA(0x00); | LCD_DATA(0x00); | ||
LCD_DATA(0x00); | LCD_DATA(0x00); | ||
Řádek 114: | Řádek 132: | ||
} | } | ||
} | } | ||
+ | </code> | ||
== Zápis pixelu na pozici == | == Zápis pixelu na pozici == | ||
+ | <code cpp> | ||
void write_pixel(unsigned int x,unsigned int y) | void write_pixel(unsigned int x,unsigned int y) | ||
{ | { | ||
Řádek 153: | Řádek 172: | ||
LCD_DATA(0b10000000>>subbit); | LCD_DATA(0b10000000>>subbit); | ||
} | } | ||
- | + | </code> | |
- | --Inicializační sekvence-- | + | ==Inicializační sekvence== |
+ | <code cpp> | ||
SPIDAT|= A0|WR|RD; | SPIDAT|= A0|WR|RD; | ||
send_SPI(SPIDAT); | send_SPI(SPIDAT); | ||
Řádek 164: | Řádek 183: | ||
_delay_cycles(1000); | _delay_cycles(1000); | ||
+ | // inicializační sekvence pro LCD 320x240 | ||
+ | // pro jiný rozměr je nutno přepočítat | ||
+ | |||
LCD_CMD(0x40); //system set | LCD_CMD(0x40); //system set | ||
LCD_DATA(0x30); | LCD_DATA(0x30); | ||
Řádek 199: | Řádek 221: | ||
LCD_DATA(0x86); | LCD_DATA(0x86); | ||
LCD_CMD(0x59); //display ON | LCD_CMD(0x59); //display ON | ||
+ | </code> | ||
+ | ==Test grafické části řízení - jezdící had== | ||
+ | <code cpp> | ||
+ | unsigned int px=0; | ||
+ | unsigned int py=0; | ||
+ | //proměnné se inkrementují tak dlouho dokud "nenarazí na kraj LCD" | ||
+ | //což je zjištěno pomocí podmínek if(py==239), následně se vynuluje příznak | ||
+ | //a proměnná se dekrementuje, poloha aktuálního bodu je zapsána pomocí write_pixel(px,py); | ||
+ | |||
+ | while(1) | ||
+ | { | ||
+ | if(xpriznak==0) | ||
+ | px++; | ||
+ | if(ypriznak==0) | ||
+ | py++; | ||
+ | |||
+ | if(xpriznak!=0) | ||
+ | px--; | ||
+ | if(ypriznak!=0) | ||
+ | py--; | ||
+ | |||
+ | if(px==319) | ||
+ | xpriznak=1; | ||
+ | if(py==239) | ||
+ | ypriznak=1; | ||
+ | |||
+ | if(px==0) | ||
+ | xpriznak=0; | ||
+ | if(py==0) | ||
+ | ypriznak=0; | ||
+ | |||
+ | write_pixel(px,py); //zápis polohy bodu | ||
+ | |||
+ | for(i=0;i<4000;i++) //jednoduchý delay | ||
+ | {} | ||
+ | |||
+ | } | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </code> | ||
+ | ==== Závěr ==== | ||
+ | Funkční řízení LCD po lince SPI je možno vidět na tomto odkazu https://www.youtube.com/watch?v=FCzxzdG-qaQ . Na uvedeném testu je možno vidět postupné několikanásobné vypsání textu Hello world, následně změněna adresa zápisu a vypsáno písmeno C pro zjištění správně textové mřížky LCD. Grafická část zobrazuje jezdícího hada. Během testování se ukázalo, že k řízení by bylo vhodné zvýšit takt procesoru ( použitá vývojová SPI deska využívá takt pouze 4MHz ) případně využít procesor s rychlejším SPI modulem. Použitý LCD výrobce Raystar nedosahuje příliš vysokého kontrastu. V katalogovém listu je uvedena barva černobílá avšak černá tohoto displeje připomíná spíše modrou. Celkový kód je možno vidět zde http://pastebin.com/UqdhU00N |