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:32] David Čada [Program pro řízení] |
2014:spi-glcd-msp [2015/01/09 10:14] (aktuální) David Čada [Závěr] |
||
|---|---|---|---|
| Řádek 35: | Řádek 35: | ||
| 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 50: | Řádek 52: | ||
| </code> | </code> | ||
| - | == Funkce pro odeslání příkazu== | + | == Funkce pro odeslání příkazu do LCD== |
| <code cpp> | <code cpp> | ||
| void LCD_CMD(unsigned char command) | void LCD_CMD(unsigned char command) | ||
| Řádek 69: | Řádek 71: | ||
| </code> | </code> | ||
| - | == Funkce pro odeslání dat== | + | == Funkce pro odeslání dat do LCD== |
| <code cpp> | <code cpp> | ||
| void LCD_DATA(unsigned char data) | void LCD_DATA(unsigned char data) | ||
| Řádek 99: | Řádek 101: | ||
| 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 109: | Řá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 176: | Řá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 213: | Řádek 223: | ||
| </code> | </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 | ||