Активный ряд клавиатурной матрицы при помощи дешифратора HC138 DD3. В таблице 1.4 приведены соответствия номера ряда к коду.
Таблица 1.4 – Соответствие ряда коду на Adis
Текст программы
#include "ioavr.h" //Подключение макросов и библиотечных функций для доступа к периферии микроконтроллера
#include "inavr.h" //Подключение сервисных библиотечных функций
#include "lib\common_utils.h"
#include "lib\lcd.h" //Подключение модуля работы с ЖКИ
//Макросы для сканирования клавиатуры
#define COL1 (PINC & (1<<5)) //Считывания клавиш с входа
#define COL2 (PINC & (1<<6))
#define COL3 (PINC & (1<<7))
//Коды клавиш
#define KEY_1 7 // KEY_1 присваивается порядковый номер 7
#define KEY_2 8
#define KEY_3 9
#define KEY_4 4
#define KEY_5 5
#define KEY_6 6
#define KEY_7 1
#define KEY_8 2
#define KEY_9 3
#define KEY_0 11
#define KEY_STAR 10
#define KEY_HASH 12
void KBD_init(void)
{
//Порт на выход
DDRC |= 15;
}
unsigned char scan_key() //Объявление символьных констант
{
unsigned char i, temp = 0, tmp; //Объявление символьных констант
for (i = 0; i < 4; i++) //до тех пор пока i < 4
{
//Перебор рядов
//Выбрать следующий ряд
tmp = PINC; // присваивание к tmp
tmp &= 0xF8; //маска
tmp |= i;
PORTC = tmp;
__delay_cycles(Del_ms(1));
//Формирование кода нажатой клавиши
if (COL1) //если нажата клавиша в COL1, то выполняется условие
temp = i*3+1;
else // иначе выполняется условие 2
if (COL2)
temp = i*3+2;
else // иначе выполняется условие 3
if (COL3)
temp = i*3+3;
if (temp) // остановка действия
break;
}
return temp; // возврат к temp
}
__task void main(void) //Выполнение главной программы
{
unsigned char digit, k; //Объявление целых констант
unsigned short num, rez;
common_init(); //Инициализация стенда
LCD_init(); //Инициализация МЖКИ
KBD_init(); //Инициализация клавиатуры
digit = 0; //Количество набранных цифр
num = 0; //Набранное число
rez = 0; //Результат операции
LCD_write_str("Введите число"); //Вывод строки 1 на дисплей МЖКИ
LCD_gotoXY (0, 1); // Координаты вывода символов
LCD_write_str("Число х 2 ="); //Вывод строки 2 на дисплей МЖКИ
while (1) //Бесконечный цикл
{
k = scan_key(); //Считывание нажатой клавиши
if (k) //Если клавиша нажата
{
switch (k) //то происходит выбор одного из множества вариантов
{
case KEY_STAR: //Если нажата клавиша '*'
digit = 0;
num = 0;
rez = 0;
k = 0xFF;
break;
case KEY_HASH: //Если нажата клавиша '#'
rez = num * 2;
digit = 0;
k = 0xFF;
break;
case KEY_0:
k = 0;
break;
case KEY_1:
k = 1;
break;
case KEY_2:
k = 2;
break;
case KEY_3:
k = 3;
break;
case KEY_4:
k = 4;
break;
case KEY_5:
k = 5;
break;
case KEY_6:
k = 6;
break;
case KEY_7:
k = 7;
break;
case KEY_8:
k = 8;
break;
case KEY_9:
k = 9;
break;
}
if (k != 0xFF) //если нажаты цифровые клавиши
{
if (digit)
{
num = num * 10 + k; //расчет введенного числа
}
else
num = k;
if ((++digit) == 3) digit = 0;//увеличение количества введенных цифр
}
}
LCD_gotoXY (13, 0);
LCD_write_int (num, 3); //вывод введенного числа
LCD_gotoXY (12, 1);
LCD_write_int (rez, 4); //вывод результата операции
__delay_cycles(Del_ms(200));
}
}
Библиотечные функции
Заголовок #include "lib\common_utils.h"
Функции:
common_init() – Начальная инициализация оборудования стенда.
Заголовок #include "lib\lcd.h" – Работа с МЖКИ
Функции:
LCD_init() - Инициализация МЖКИ.
LCD_init() - Инициализация МЖКИ.
void LCD_put_char(char ch) – Вывод символа.
void LCD_write_str(char str[]) – Вывод строки.
void LCD_clear(void) – Очистка ЖКИ.
void LCD_gotoXY (unsigned char x, unsigned char y) – Перевод курсора в позицию
X,Y.
void LCD_write_int (signed int val, unsigned char digits) – Вывод целого числа
val в текущую позицию, используя digits символов.
2. Задания к лабораторной работе
Разработать программу для учебного стенда НТЦ-31.100, позволяющую вводить данные с клавиатуры (КЛ), выполнять определенные действия над данными и выводить поясняющие надписи и результат вычислений на матричный жидкокристаллический индикатор (МЖКИ) или на дискретный светодиодный индикатор (ДСИ).
Клавишу "#" использовать, как подтверждение ввода, а клавишу "*" – как сброс операции.
1) Ввести последовательно два трехзначных числа, найти их разность и результат вывести на МЖКИ
2) Ввести последовательно два трехзначных числа, найти их сумму и результат вывести на МЖКИ
3) Ввести последовательно два трехзначных числа, найти результат поразрядной логической операции ИЛИ и вывести на МЖКИ в десятичной форме
4) Ввести последовательно два трехзначных числа, найти их произведение и результат вывести на МЖКИ
5) Ввести последовательно два трехзначных числа, найти результат поразрядной логической операции ИСКЛЮЧАЮЩЕЕ ИЛИ и вывести на МЖКИ в десятичной форме
6) Ввести последовательно два трехзначных числа, найти результат поразрядной логической операции И, вывести результат на МЖКИ в десятичной форме
7) Ввести последовательно два двухзначных числа, найти их разность и результат вывести на ДСИ
8) Ввести последовательно два двухзначных числа, найти их сумму и результат вывести на ДСИ
9) Ввести последовательно два двухзначных числа, найти результат поразрядной логической операции ИСКЛЮЧАЮЩЕЕ ИЛИ и вывести на ДСИ
10) Ввести два двухзначных числа, найти минимальное из них и вывести его на ДСИ
11) Ввести последовательно два двухзначных числа, найти результат поразрядной логической операции И и вывести на ДСИ в десятичной форме
12) Ввести последовательно два двухзначных числа, найти результат поразрядной логической операции ИЛИ и вывести на ДСИ в десятичной форме
13) Ввести три трехзначных числа, найти максимальное из них и вывести его на МЖКИ
14) Ввести три двухзначных числа, найти максимальное из них и вывести его на ДСИ
15) Ввести три двухзначных числа, найти минимальное из них и вывести его на ДСИ
3. ПРИМЕР ВЫПОЛНЕНИЯ ЗАДАНИЯ
Ввести последовательно два трехзначных числа, найти их сумму
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.