Всем привет!) Продолжаем серию уроков по программированию атмеловских АRМов. Сегодня речь пойдет о программирование и использовании графического экрана на борту отладочной платы sam3n-ek. На нашем evolution kitе стоит TFT экран TM020GDZ18 176×220 пикселей с интегрированным драйвером ILI9225B.
Как всегда создаем новый проект с поддержкой ASF, ASF это фреймворк атмел для работы с микроконтроллерами, большое количество библиотек (p.s. совсем не джедайский путь).
Работа с экраном осуществляться по SPI протоколу, информации по спиай протоколу много в интернете, поэтому описывать в этом уроке теоретические сведения не буду, опишу только в уроке посвященный SPI.
Принципиальная электрическая схема подключения LCD к SAM3N4C.
И так, для работы с графическим экраном нам понадобятся следующие библиотеки, открываем ASF Wizard (Alt + W) и добавляем их:
Создадим небольшую демо программу, которая будет рисовать обычные графические примитивы круги и линию.
Подключаем необходимые заголовочные файлы
#include "asf.h" #include "stdio_serial.h" #include "conf_board.h" #include "conf_clock.h"
Создаем структуру для работы с графическим экраном.
struct ili9225_opt_t g_ili9225_display_opt;
Создаем обработчик для SPI протокола.
void SPI_Handler(void) { ili9225_spi_handler(); }
Создаем главную функцию и делаем всю инициализацию для работы с графическим экраном.
int main(void) { sysclk_init(); board_init(); Инициализируем экран, передаем в структуру параметры экрана. g_ili9225_display_opt.ul_width = ILI9225_LCD_WIDTH; g_ili9225_display_opt.ul_height = ILI9225_LCD_HEIGHT; g_ili9225_display_opt.foreground_color = COLOR_BLACK; g_ili9225_display_opt.background_color = COLOR_WHITE; Выключаем backlight. aat31xx_disable_backlight(); Инициализируем экран. ili9225_init(&g_ili9225_display_opt); Далее устанавливаем уровень backlight-а. aat31xx_set_backlight(AAT31XX_AVG_BACKLIGHT_LEVEL); Включаем дисплей. ili9225_display_on(); Заполняем экран белым цветом. ili9225_set_foreground_color(COLOR_WHITE); ili9225_draw_filled_rectangle(0, 0, ILI9225_LCD_WIDTH, ILI9225_LCD_HEIGHT); Пишем текст на экране. ili9225_set_foreground_color(COLOR_BLACK); ili9225_draw_string(10, 20, (uint8_t *)"mcu.by"); Рисуем круги красный, зеленый и синий. ili9225_set_foreground_color(COLOR_RED); ili9225_draw_circle(60, 80, 30); ili9225_set_foreground_color(COLOR_GREEN); ili9225_draw_circle(60, 120, 30); ili9225_set_foreground_color(COLOR_BLUE); ili9225_draw_circle(60, 160, 30); Рисуем линию. ili9225_draw_line(0, 0, 176, 220); И завершаем программу бесконечным циклом. while (1) { } }
Собираем проект F7 и прошиваем его Ctrl+Shift+P.
Теперь настало время сделать нашу программу кудрявой, скажем создадим танк и с помощью кнопок будим им управлять, нажал влево поехал танк налево, нажал вправо поехал танк направо и т.д. Приступим, необходим первоначально создать танк его графическую модель.
#include "asf.h" #include "stdio_serial.h" #include "conf_board.h" #include "conf_clock.h" struct ili9225_opt_t g_ili9225_display_opt; void SPI_Handler(void) { ili9225_spi_handler(); } void tank(int x, int y){ ili9225_set_foreground_color(0x00FF00u); ili9225_draw_filled_rectangle(x+7,y+26, x+37, y+66); ili9225_set_foreground_color(0x333F00u); ili9225_draw_filled_rectangle(x+19,y+1, x+24, y+36); ili9225_draw_filled_circle(x+22, y+46, 10); ili9225_draw_filled_rectangle(x+18,y, x+25, y+3); ili9225_draw_filled_rectangle(x,y+26, x+7, y+66); ili9225_draw_filled_rectangle(x+37,y+26, x+44, y+66); } int main(void) { sysclk_init(); board_init(); g_ili9225_display_opt.ul_width = ILI9225_LCD_WIDTH; g_ili9225_display_opt.ul_height = ILI9225_LCD_HEIGHT; g_ili9225_display_opt.foreground_color = COLOR_BLACK; g_ili9225_display_opt.background_color = COLOR_WHITE; aat31xx_disable_backlight(); ili9225_init(&g_ili9225_display_opt); aat31xx_set_backlight(AAT31XX_AVG_BACKLIGHT_LEVEL); ili9225_display_on(); ili9225_set_foreground_color(COLOR_WHITE); ili9225_draw_filled_rectangle(0, 0, ILI9225_LCD_WIDTH, ILI9225_LCD_HEIGHT); tank(80,100); while (1) { } }
Управление танком с помощью кнопок реализуем во второй части, а сейчас всем пока.)