МиНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра систем автоматического управления
Лабораторная работа №7
по дисциплине
«Микропроцессорный устройства систем управления»
Вариант 9
Студенты гр. 8491 |
|
Авраменок Д.А. Пшебельская Р.С. |
Преподаватель |
|
Голик С.Е. |
Санкт-Петербург
2020
Цель работы: Программирование процедур обработки прерываний от внешнего источника.
Задание: Во всех вариантах заданий осуществляется внешнее прерывание по входу INT2 (ножка PD2 порта PORTD), которое инициируется нажатием подключенной к нему кнопки. В основной программе производится в бесконечном цикле периодический вывод на первую строку ЖКИ заданной символьной информации с интервалом индикации 3 с. При нажатии кнопки возникает прерывание, функция обработки которого инвертирует состояние RGB-светодиода (зажигает, если он был погашен или гасит, если он был зажжен). Цвет светодиода и способ его задания для каждого варианта данной лабораторной работы определен в задании к лабораторной работе No 4. По окончании работы ПОП основная программа продолжает свою работу. Задание представлено в табл.1.
Табл.1.
Номер варианта |
Основная программа |
Прерывания |
9 |
Вывод названия цветов спектра |
По фронту |
С
хема
макета, относящегося к заданию:
Рис.1. Схема макета.
Блок-схема алгоритма программы:
void LCD_cmd(unsigned char cmd):
Назначение: запись кодов в регистр команд ЖКИ.
Входные параметры: cmd - код команды.
//все разряды PORTC на выход
//выбор регистра команд RS=0
//разряды PORTD на выход
//записать команду в порт PORTC
//сформировать на выводе E строб 1-0
//передачи команды
void LCD_data(unsigned char data)
//все разряды PORTC на выход
//разряды PORTD на выход
//выбор регистра команд RS=1
//записать команду в порт PORTC
//сформировать на выводе E строб 1-0
//передачи команды
void LCD_init(void)
Назначение: инициализация ЖКИ
//все разряды PORTC на выход
// инкремент курсора, без сдвига экрана
//вывод трех команд 0x30
//разряды PORTD на выход
//включить ЖКИ и курсор, без мерцания
// очистить экран, курсор в начало
void showMe(unsigned char *what)
Функция,
которая вывода на дисплей текста с
помощью указателя.
interrupt [EXT_INT2] void led_flash(void)
Начало обработки прерываний.
//включение/ выключение диодов
Блок-схема основной части кода:
//названия цветов спектра
//настойка ног мк, к которым подключен диод - на выход
//настройка прерываний
//локальное разрешение прерываний от кнопки на PD2
//настройка прерываний на фронт сигнала
//глобальное разрешение прерываний
//бесконечный цикл вывода последовательности слов на ЖКИ
//вывод i-того слова на ЖКИ
//очистка дисплея
Текст программы на языке С:
#include <mega128a.h>
#include <delay.h>
#define RS 7 // выбор регистра
#define E 6 // строб передачи
void LCD_cmd(unsigned char cmd)
{
//[]--------------------------------------------------[]
//| Назначение: запись кодов в регистр команд ЖКИ |
//| Входные параметры: cmd - код команды |
//[]--------------------------------------------------[]
DDRC = 0xFF; // все разряды PORTC на выход
DDRD |= ((1<<E)|(1<<RS)); // разряды PORTD на выход
PORTD &= ~(1<<RS); // выбор регистра команд RS=0
PORTC = cmd; // записать команду в порт PORTC
PORTD |= (1<<E); // \ сформировать на
delay_us(5); // | выводе E строб 1-0
PORTD &= ~(1<<E); // / передачи команды
delay_ms(100); // задержка для завершения записи
}
void LCD_data(unsigned char data)
{
DDRC = 0xFF; // все разряды PORTC на выход
DDRD |= ((1<<E)|(1<<RS)); // разряды PORTD на выход
PORTD |= (1<<RS); // выбор регистра data RS=1
PORTC = data; // записать команду в порт PORTC
PORTD |= (1<<E); // \ сформировать на
delay_us(5); // | выводе E строб 1-0
PORTD &= ~(1<<E); // / передачи команды
delay_ms(1); // задержка для завершения записи
}
void LCD_init(void)
{
//[]--------------------------------------------------[]
//| Назначение: инициализация ЖКИ |
//[]--------------------------------------------------[]
DDRC = 0xFF; // все разряды PORTC на выход
DDRD |= ((1<<E)|(1<<RS)); // разряды PORTD на выход
delay_ms (100); // задержка для установления
// напряжения питания
LCD_cmd(0x30); // \ вывод
LCD_cmd(0x30); // | трех
LCD_cmd(0x30); // / команд 0x30
LCD_cmd(0x38); // 8 разр.шина, 2 строки, 5 ? 7 точек
LCD_cmd(0x0E); // включить ЖКИ и курсор, без мерцания
LCD_cmd(0x06); // инкремент курсора, без сдвига экрана
LCD_cmd(0x01); // очистить экран, курсор в начало
}
void showMe(unsigned char *what) //функция, которая вывода на дисплей текста с помощью указателя
{
while(*what)
{
LCD_data(*what++);
}
}
interrupt [EXT_INT2] void led_flash(void) //начало обработки прерываний
{
PORTA ^= 0x05; //включение/выключение диодов
}
void main()
{
unsigned char i,*words[]={"red","orange","yellow","green","cyan","blue","violet"}; //названия цветов спектра
DDRA = 0x07; //настойка ног мк, к которым подключен диод - на выход
LCD_init();
//настройка прерываний
EIMSK = 1 << INT2; //локальное разрешение прерываний от кнопки на PD2
EICRA = (1<<ISC20) | (1<<ISC21); //настройка прерываний на фронт сигнала
#asm("sei"); //глобальное разрешение прерываний
while(1) //бесконечный цикл вывода последовательности слов на ЖКИ
{
for(i=0;i<7;i++)
{
showMe(words[i]); //вывод i-того слова на ЖКИ
delay_ms(3000); //задержка в 3с по заданию
LCD_cmd(1); //очистка дисплея
}
}
}
Вывод: Были запрограммирована процедура обработки прерываний от внешнего источника. Оно возникает при нажатии кнопки , функция обработки которого инвертирует состояние RGB-светодиода. Цвет светодиода и способ его задания для каждого варианта данной лабораторной работы были взяты из задания к лабораторной работе № 4. По окончании работы ПОП основная программа продолжает свою работу.