Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование встроенных приложений Keil uvision

.pdf
Скачиваний:
127
Добавлен:
06.01.2021
Размер:
4.29 Mб
Скачать

СПБГУАП группа 4736 / Индустрия 4.0

/*------------------------------------------------------------

 

*/

#include "MDR32Fx.h"

 

// подключение библиотеки МК

#define F_CPU 8000000

 

// указание тактовой частоты МК

#include "milkites_delay.h"

// подключение библиотеки задержек

#include "milkites_display.h"

// подключение библиотеки дисплея

#define LCD_led_en

MDR_PORTE->RXTX |= (1<<2) // вкл. подсветки

#define LCD_led_dis

MDR_PORTE->RXTX &= ~(1<<2) // выкл. подсветки

/*------------------------------------------------------------

 

*/

int main()

{

/* вкл. тактирования всей периферии. В данном случае, это уместно, т.к. задействованы все порты МК, модуль SPI */

MDR_RST_CLK->PER_CLOCK = 0xffffffff;

// подсветка дисплея управляется выводом PE2

MDR_PORTE->OE

= 0xff37; //

биты 7,6,3 PORTE - входы, др. - выходы

MDR_PORTE->FUNC

=

0x0000;

//

функция - порт, основная функция

MDR_PORTE->PWR

=

0xff37;

//

максимально быстрый фронт

MDR_PORTE->ANALOG = 0xffff; // режим работы порта - цифровой ввод/вывод

delay_init();

// инициализация системы задержек

LCD_init();

// инициализация дисплея

LCD_clear();

// очистка дисплея

 

LCD_led_en;

// вкл. подсветки дисплея

while (1)

 

 

{

 

 

LCD_page_set(3);

// уст. курсора на

4 строку

LCD_column_set(60);

// уст. курсора на

60 пиксель

// заполнение пикселей байтами

for(uint8_t i = 0; i < 8; i++) LCD_wr_byte(0xff); delay_ms(100);

}// while

}// main

/*------------------------------------------------------------

*/

Листинг 5. Рабочий код вывода квадрата на экране дисплея

89

СПБГУАП группа 4736 / Индустрия 4.0

Теперь попробуем изобразить прямоугольник (рис. 37).

Рис. 37. Изображение прямоугольника на дисплее

/*------------------------------------------------------------

 

*/

#include "MDR32Fx.h"

 

// подключение библиотеки МК

#define F_CPU 8000000

 

// указание тактовой частоты МК

#include "milkites_delay.h"

// подключение библиотеки задержек

#include "milkites_display.h"

// подключение библиотеки дисплея

#define LCD_led_en

MDR_PORTE->RXTX |= (1<<2) // вкл. подсветки

#define LCD_led_dis

MDR_PORTE->RXTX &= ~(1<<2) // выкл. подсветки

/*------------------------------------------------------------

 

*/

int main()

{

/* вкл. тактирования всей периферии. В данном случае, это уместно, т.к. задействованы все порты МК, модуль SPI */

MDR_RST_CLK->PER_CLOCK = 0xffffffff;

MDR_PORTE->OE

=

0xff37; // биты 7,6,3 PORTE - входы, др. - выходы

MDR_PORTE->FUNC

=

0x0000; // функция - порт, основная функция

MDR_PORTE->PWR

=

0xff37; // максимально быстрый фронт

MDR_PORTE->ANALOG =

0xffff; // режим работы порта - цифровой ввод/вывод

delay_init();

 

// инициализация системы задержек

LCD_init();

 

// инициализация дисплея

LCD_clear();

 

// очистка дисплея

LCD_led_en;

 

// вкл. подсветки дисплея

// продолжение на следующей странице

90

СПБГУАП группа 4736 / Индустрия 4.0

while (1)

 

{

 

//--- левая сторона

 

LCD_page_set(3);

// установка страницы 4 (коорд. Y)

LCD_column_set(30);

// и колонки памяти в этой странице (коорд. Х)

LCD_wr_byte(0xff);

// запись байта данных

LCD_wr_byte(0xff);

// запись байта данных

LCD_page_set(4);

// установка страницы 5 (коорд. Y)

LCD_column_set(30);

// и колонки памяти в этой странице (коорд. Х)

LCD_wr_byte(0xff);

// запись байта данных

LCD_wr_byte(0xff);

// запись байта данных

//--- нижняя сторона

 

//продолжение записи данных в виде двух пикселей – 0b1100000 for(uint8_t i=0; i < 60; i++) LCD_wr_byte(3 << 6);

//--- верхняя сторона

LCD_page_set(3); // установка страницы 4 (коорд. Y) LCD_column_set(32); // и колонки памяти в этой странице (коорд. Х)

//запись данных в виде двух пикселей – 0b1100000

for(uint8_t i=0; i < 60; i++) LCD_wr_byte(0x03);

//--- правая сторона

LCD_page_set(3); LCD_column_set(91); LCD_wr_byte(0xff); LCD_wr_byte(0xff); LCD_page_set(4); LCD_column_set(91); LCD_wr_byte(0xff); LCD_wr_byte(0xff);

delay_ms(100);

}// while

}// main

/*------------------------------------------------------------

*/

Листинг 6. Рабочий код вывода прямоугольника на экране дисплея

91

СПБГУАП группа 4736 / Индустрия 4.0

Теперь разработаем программу, которая закрасит три верхние страницы дисплея чередующимися линиями пикселей (рис. 38, листинг 7).

Следует обратить внимание на то, что после отправки команд установки курсора на страницу памяти и команды установки колонки памяти на этой странице, можно слать поток байт в дисплей, не повторяя каждый раз эти команды. Происходит автоматиче-

ский инкремент адреса пикселя сверху вниз слева направо в пределах страницы памяти.

Для перехода на другую страницу памяти (координата Y) необходимо отправить команду LCD_page_set(x), где x – число от 0 до 7.

Рис. 38. Изображение чередующихся полос на экране

92

СПБГУАП группа 4736 / Индустрия 4.0

/*------------------------------------------------------------

 

*/

#include "MDR32Fx.h"

 

// подключение библиотеки МК

#define F_CPU 8000000

 

// указание тактовой частоты МК

#include "milkites_delay.h"

// подключение библиотеки задержек

#include "milkites_display.h"

// подключение библиотеки дисплея

#define LCD_led_en

MDR_PORTE->RXTX |= (1<<2) // вкл. подсветки

#define LCD_led_dis

MDR_PORTE->RXTX &= ~(1<<2) // выкл. подсветки

/*------------------------------------------------------------

 

*/

int main()

{

/* вкл. тактирования всей периферии. В данном случае, это уместно, т.к. задействованы все порты МК, модуль SPI */

MDR_RST_CLK->PER_CLOCK = 0xffffffff;

MDR_PORTE->OE

= 0xff37; //

биты 7,6,3 PORTE - входы, др. - выходы

MDR_PORTE->FUNC

=

0x0000;

//

функция - порт, основная функция

MDR_PORTE->PWR

=

0xff37;

//

максимально быстрый фронт

MDR_PORTE->ANALOG = 0xffff; // режим работы порта - цифровой ввод/вывод

delay_init();

// инициализация системы задержек

LCD_init();

// инициализация дисплея

LCD_clear();

// очистка дисплея

LCD_led_en;

// вкл. подсветки дисплея

while (1)

{

for(uint8_t y = 0; y < 3; y++) // закрашиваем линиями 3 страницы памяти

(Y)

{

LCD_page_set(y); // уст. курсора на страницу

LCD_column_set(0); // уст. курсора на начало стр. – нулевой пиксель /* заполнение страницы памяти числом 0b10101010, после записи байта происходит автоинкремент колонки пикселей */

for (uint8_t x = 0; x < 127; x++) LCD_wr_byte(0xaa);

}

delay_ms(100);

}// while

}// main

/*------------------------------------------------------------

*/

Листинг 7. Рабочий код вывода чередующихся линий на дисплей

93

СПБГУАП группа 4736 / Индустрия 4.0

4.4.4.Вывод текста на дисплей

Всоставе библиотеки milkites_display.h имеется набор функций, позволяющий выводить все знаки Кириллицы и Латиницы, а также числа и знаки. Однако последние версии интегрированной среды Keil MDK-ARM имеют проблемы с отображением символов кириллицы. Следствием этого является проблема вывода символов кириллицы на дисплеи. Для исправления этой проблемы необходимо «излечить» Keil с помощью процедуры описанной ниже.

1.Запустить файл FontSubstitutes.reg из папки Keil_rus. После применения рег-файла обязательно надо перезагрузить компьютер!

2.Заменить файл “UvEdit.dll”, находящийся в каталоге, куда установлена среда KEIL MDK-ARM.

3.В среде KEIL MDK-ARM необходимо включить кодировку

Russian Windows -1251. Меню Edit => Configuration (рис. 39).

Рис. 39. Окно настроек проекта

94

СПБГУАП группа 4736 / Индустрия 4.0

После этих операций можно печатать символы кириллицы на дисплее (рис. 40, листинг 8).

Рис. 40. Пример вывода символов на дисплей

95

СПБГУАП группа 4736 / Индустрия 4.0

/*------------------------------------------------------------

 

*/

#include "MDR32Fx.h"

 

// подключение библиотеки МК

#define F_CPU 8000000

 

// указание тактовой частоты МК

#include "milkites_delay.h"

// подключение библиотеки задержек

#include "milkites_display.h"

// подключение библиотеки дисплея

#define LCD_led_en

MDR_PORTE->RXTX |= (1<<2) // вкл. подсветки

#define LCD_led_dis

MDR_PORTE->RXTX &= ~(1<<2) // выкл. подсветки

/*------------------------------------------------------------

 

*/

int main()

{

/* вкл. тактирования всей периферии. В данном случае, это уместно, т.к. задействованы все порты МК, модуль SPI */

MDR_RST_CLK->PER_CLOCK = 0xffffffff;

MDR_PORTE->OE

= 0xff37; //

биты 7,6,3 PORTE - входы, др. - выходы

MDR_PORTE->FUNC

=

0x0000;

//

функция - порт, основная функция

MDR_PORTE->PWR

=

0xff37;

//

максимально быстрый фронт

MDR_PORTE->ANALOG = 0xffff; // режим работы порта - цифровой ввод/вывод

delay_init();

// инициализация системы задержек

LCD_init();

// инициализация дисплея

LCD_clear();

// очистка дисплея

LCD_led_en;

// вкл. подсветки дисплея

while (1)

 

 

{

 

 

LCD_set_cursor(0);

 

// уст. курсора на 1 строку

LCD_print_text(" This is МиКиТЭС ");

// вывод текста

LCD_set_cursor(1);

 

// уст. курсора на 2 строку

LCD_print_text("||==*+-/>>>O<<<\%&==||"); // вывод знаков

LCD_set_cursor(2);

 

// уст. курсора на 3 строку

LCD_print_text("

Отладочная ");

// вывод текста

LCD_set_cursor(4);

 

// уст. курсора на 4 строку

LCD_print_text("

плата МК Миландр ");

// вывод текста

LCD_set_cursor(6);

 

// уст. курсора на 5 строку

LCD_print_text("

китэс Дубна ");

// вывод текста

LCD_set_cursor(7);

 

// уст. курсора на 6 строку

LCD_print_num(123456);

// вывод цифр

} // while

 

} // main

 

/*------------------------------------------------------------

*/

Листинг 8. Рабочий код вывода букв, чисел и знаков на дисплей

96

СПБГУАП группа 4736 / Индустрия 4.0

4.4.5.Заключение

Влабораторной работе рассмотрены принципы использования графического дисплея МТ12864В фирмы МЭЛТ в составе отладочной платы МилКиТЭС.

Кроме мощной интерактивной функции, дисплей также является отладочным средством. В ходе выполнения задач, курсовой работы или просто работы с платой часто приходится анализировать состояния регистров и переменных. С помощью дисплея это можно легко сделать, сохранив значение регистра в переменную и выведя на дисплей эту переменную, например:

/*------------------------------------------------------------

 

*/

uint32_t porb_data = MDR_PORB->RXTX; // сохранение значения регистра

LCD_set_cursor(0);

// уст. курсора в

начало 1 строки

LCD_print_num(porb_data);

// вывод значения

переменной

/*------------------------------------------------------------

 

*/

После «лечения» проблемы с кириллицей в среде KEIL MDKARM возможны проблемы с отображением кириллицы при переносе кода в другие редакторы текста. Лучше писать комментарии латиницей.

Существует правило – перед выводом любой информации на дисплей необходимо установить курсор на необходимую страницу памяти, используя функцию LCD_set_cursor(x) или сочетание функ-

ций LCD_page_set(y), LCD_column_set(z).

Для защиты лабораторной работы необходимо выполнить все задачи из раздела 6.

97

СПБГУАП группа 4736 / Индустрия 4.0

4.4.6.Задачи для самостоятельной работы

1.Солнышко. Необходимо вывести на дисплей изображение

солнца.

2.Бегущий человечек. Необходимо вывести на дисплей ряд картинок, изображающих бегущего человечка.

3.Сумматор. Вывести на дисплей результат сложения цифр двух по очереди нажатых кнопок. Значения суммируемых величин соответствуют последней цифре кнопки (прим. PE3 – 3). После вывода суммы на экран происходит сброс значения суммы и переход в состояние ожидания новых нажатий.

4.Черный квадрат. Вывести на дисплей изображение закрашенного квадрата размером не менее 32 x 32 пикселя.

5.Движущийся пиксель. При включении питания в центре дисплея появляется включённый пиксель. Пользователь может управлять движением пикселя по экрану с помощью кнопок.

6.Добрый человечек. Необходимо вывести на дисплей ряд картинок, изображающих улыбающегося человечка.

7.Движущийся квадрат. При включении питания в центре дисплея появляется квадрат 8 x 8 пикселей. Пользователь может управлять движением квадрата по экрану с помощью кнопок.

8.Бегущие пиксели. При включении питания дисплей очищен. Далее начинается процесс закрашивания строк пикселями с интервалом несколько сотен мс. После закрашивания первой страницы происходит переход на вторую и т.д., пока весь дисплей не закрасится. После этого дисплей очищается и процесс повторяется снова.

9.Снегопад. Изобразить процесс заполнения дисплея снежинками. При заполнении всего дисплея снегом, происходит его очистка и процесс повторяется.

10.Бегущая строка. Вывести на дисплей бегущую строку текста в пределах одной строки дисплея. Это может быть четверостишье или любое другое сообщение.

11.Произвольная задача.

12.Произвольная задача.

98