Материал: MPU_SU_Laboratornaya_rabota_7_Avramenok_Pshebelskaya

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

МиНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра систем автоматического управления

Лабораторная работа №7

по дисциплине

«Микропроцессорный устройства систем управления»

Вариант 9

Студенты гр. 8491

Авраменок Д.А.

Пшебельская Р.С.

Преподаватель

Голик С.Е.

Санкт-Петербург

2020

Цель работы: Программирование процедур обработки прерываний от внешнего источника.

Задание: Во всех вариантах заданий осуществляется внешнее прерывание по входу INT2 (ножка PD2 порта PORTD), которое инициируется нажатием подключенной к нему кнопки. В основной программе производится в бесконечном цикле периодический вывод на первую строку ЖКИ заданной символьной информации с интервалом индикации 3 с. При нажатии кнопки возникает прерывание, функция обработки которого инвертирует состояние RGB-светодиода (зажигает, если он был погашен или гасит, если он был зажжен). Цвет светодиода и способ его задания для каждого варианта данной лабораторной работы определен в задании к лабораторной работе No 4. По окончании работы ПОП основная программа продолжает свою работу. Задание представлено в табл.1.

Табл.1.

Номер варианта

Основная программа

Прерывания

9

Вывод названия цветов спектра

По фронту

  1. С хема макета, относящегося к заданию:

Рис.1. Схема макета.

  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-того слова на ЖКИ

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

  1. Текст программы на языке С:

#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. По окончании работы ПОП основная программа продолжает свою работу.

Источник: https://studfile.net/preview/16437839/