STM32Butterfly2: obsługa LCD z telefonu Nokia 6100/6610
Natomiast listing programu głównego przedstawia się następująco.
int main(void) { //JOY pin configuration input pullup VCC RCC->APB2ENR |= JOY_PORT_APB2; io_config_ext(JOY_PORT, JOY_BITS, GPIO_MODE_INPUT, GPIO_CNF_IN_PULLUP ); io_set_clr_mask( JOY_PORT, JOY_BITS, JOY_BITS ); //Initialize system timer time_init(); //Initialize the color display nlcd_init(); //Clear screen nlcd_clear_screen(); //Draw initial lines draw_hline(1,HLINE_COLOR); draw_vline(1,VLINE_COLOR); for(int x=1,y=1,px=1,py=1;;) { //Read joy state int jstate1 = joy_keys(); wait_ms(KBD_DEBOUNCE_TIME); int jstate2 = joy_keys(); if(jstate1 && jstate1==jstate2) { //If key pressed get position switch(jstate1) { case JOY_U: if(y1) y--; break; case JOY_L: if(x>1) x--; break; case JOY_R: if(x
W pierwszym kroku przeprowadzana jest konfiguracja linii joysticka. Operacja ta odbywa się poprzez włączenie zegara dla portu GPIO, do którego podłączone są linii joysticka (ustawienie bitu w rejestrze RCC->APB2ENR), oraz konfiguracji linii jako wejścia PULLUP. Za konfigurację linii jako wejścia odpowiada funkcja io_config_ext, jako pierwszy parametr przyjmuje ona nazwę portu, drugi parametr określa konfigurowane linie, trzeci parametr czy linie są wejściowe czy wyjściowe, ostatni parametr określa tryb działania. Niezbędnym w konfiguracji linii joysticka jest podciągnięcie ich do potencjału dodatniego, które realizowane jest przez funkcję io_set_clr_mask. Funkcja ta wymaga podania trzech parametrów, pierwszy z nich określa nazwę portu, drugi określa stan ustawianych linii (bitowa wartość ‘0’ na danej pozycji zeruje linię, bitowa wartość ‘0’ na danej pozycji ustawia w stan wysoki linię), ostatni parametr jest maską blokującą zmianę stanó1) tylko do wskazanych linii.
W kolejnym kroku realizowana jest konfiguracja licznika SysTick, za działanie to odpowiada funkcja time_init(). Działanie jej sprowadza się do określenia priorytetu przerwania pochodzącego od licznika SysTick, określeniu częstotliwości występowania przerwania oraz włączenia licznika.
Następnie, poprzez wywołanie funkcji , przeprowadzana jest inicjalizacja wyświetlacza modułu KAmodTFT2. Listing funkcji został przedstawiony poniżej.
void nlcd_init(void) { int i; // Hardware reset RCC->APB2ENR |= SPI_APB2ENR_PORT | CTRL_APB2ENR_PORT; io_config(CTRL_PORT,SCE_BIT,GPIO_MODE_50MHZ,GPIO_CNF_GPIO_PP); io_config(CTRL_PORT,RES_BIT,GPIO_MODE_50MHZ,GPIO_CNF_GPIO_PP); io_config(SPI_PORT,MOSI_BIT,GPIO_MODE_50MHZ,GPIO_CNF_GPIO_PP); io_config(SPI_PORT,SCK_BIT,GPIO_MODE_50MHZ,GPIO_CNF_GPIO_PP); sce(1); sck(1); mosi(1); res(0); for(i = 0; i < 80000; i++) nop(); res(1); for(i = 0; i < 80000; i++) nop(); // Sleep out transfer_spi_command(SLEEPOUT); // Inversion on (command 0x20) transfer_spi_command(INVOFF); // Color Interface Pixel Format (command 0x3A) transfer_spi_command(COLMOD); transfer_spi_data(0x03); // 0x03 = 12 bits-per-pixel // Memory access controler (command 0x36) transfer_spi_command(MADCTL); transfer_spi_data(0x50); for(i = 0; i < 2000; i++) nop(); // Display On (command 0x29) transfer_spi_command(DISPON); }
W pierwszym kroku działania funkcji włączany jest zegar dla portów obsługującego linie transmisji oraz przeprowadzenie konfiguracji używanych linii przy pomocy funkcji io_config. Po przeprowadzeniu konfiguracji następuje ustawienie odpowiednich stanów na liniach SCE, SCK i MOSI. Wykonywany jest także reset wyświetlacza poprzez początkowe ustawienie linii RES w stan niski, a następnie przełączenie, po wykonaniu opóźnienia, w stan wysoki. Opóźnienie zostało zrealizowane poprzez wykonanie pętli for określoną liczbę razy w ramach, której wywoływana jest operacja nop().
Następnym działaniem jest wysłanie do wyświetlacza komend, które w pierwszej kolejności wybudzają go, wyłączają inwersje, ustawienie 12-bitowego formatu określającego kolor danego piksela (4 bity na każdy z kolorów) oraz określenie żądanego dostępu do pamięci wyświetlacza (parametr ten określa odbicie obrazu w poziomie i w pionie oraz sposób inkrementowania kolejnych komórek). Po wysłaniu powyższych poleceń następuje zatrzymanie programu na pewien czas, po którym wysyłana jest komenda włączająca wyświetlanie obrazu na wyświetlaczu.