Всем привет!) Продолжаем серию уроков по программированию атмеловских А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) {
}
}

Управление танком с помощью кнопок реализуем во второй части, а сейчас всем пока.)