Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273

Вывод на LCD значения клавиши клавиатуры

03.11.2021, 17:00. Показов 4486. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Нужно реализовать вывод на LCD значения нажатой клавиши клавиатуры. В протеус создал схему, прошивка в микроконтроллер залита, ошибок не выдает, но при запуске симуляции ничего не происходит. Не выводится на экран ни символов нажатой клавиши ни приветственная надпись.
Помогите, пожалуйста, разобраться что не так.
Архив со схемой прикладываю в архиве там же и код программы.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#include <avr/io.h> // заголовок чтобы разрешить контроль данных на контактах
#define F_CPU 1000000  // задание тактовой частоты микроконтроллера
#include <util/delay.h> // заголовок чтобы задействовать функции задержки в программе
#define    E   5 // задействуем 5-й контакт PORTD (“enable”), поскольку он соединен с контактом “enable” ЖК дисплея
#define RS  6 // задействуем выбор регистра (“registerselection”) на 6-м контакте PORTD, поскольку он соединен с контактом RS ЖК дисплея
 
void send_a_command(unsigned char command);
void send_a_character(unsigned char character);
void send_a_string(char *string_of_characters);
int main(void)
{
    DDRB = 0xFF; // установка portB на вывод данных
    DDRD = 0xFF; // установка portD на вывод данных
    _delay_ms(50); //задержка 50ms
    int key=0;// переменная чтобы осуществить сброс ЖК дисплея когда количество символов на его экране достигнет лимита
    int keypressed=0;// переменная целого типа для хранения значения матрицы (нажатой кнопки)
    
    send_a_command(0x01); // очистить экран 0x01 = 00000001
    _delay_ms(50);
    send_a_command(0x38);// сообщаем ЖК дисплею что мы будем использовать 8 битный режим передачи данных/команд
    _delay_ms(50);
    send_a_command(0b00001111); //включаем курсор и мигание курсора на ЖК дисплее
    send_a_string("PRESS A KEY"); //отображение строки "PRESS A KEY" (нажмите клавишу)
    send_a_command(0x80 + 0x40 +0);// перемещение курсора на вторую строку ЖК дисплея
    DDRA=0xF0;// назначаем контакты столбцов входными, а контакты строк выходными
    _delay_ms(1);
    PORTA=0x0F;// подаем напряжение на строки, то есть переключаем напряжение со столбцов на строки клавишной панели
    _delay_ms(1);
    
    while(1)
    {
        if (PINA!=0b11110000) // если в течение цикла на каком-нибудь контакте столбца появится высокое напряжение
        {
            _delay_ms(5);
            keypressed = PINA; // номер столбца записываем в переменную
            DDRA ^=0b11111111;// делаем строки входными контактами, а столбцы - выходными
            _delay_ms(1);
            PORTA ^= 0b11111111;// подаем напряжение на столбцы
            _delay_ms(1);
            
            keypressed |=PINA; // применяем операцию "или" к полученным значениям строки и столбца
            
            if (keypressed==0b00010001)
            {
                send_a_string("1"); //если строка 1 и столбец 1 высокого напряжения, то показать “1”
                key++;
            }
            if (keypressed==0b00010010)
            {
                send_a_string("4"); //если строка 1 и столбец 2 высокого напряжения, то показать “4”
                key++;
            }
            if (keypressed==0b00010100)
            {
                send_a_string("7"); //если строка 1 и столбец 3 высокого напряжения, то показать “7”
                key++;
            }
            if (keypressed==0b00011000)
            {
                send_a_string("*");//если строка 1 и столбец 4 высокого напряжения, то показать “*”
                key++;
            }
            
            if (keypressed==0b00100001)
            {
                send_a_string("2"); //если строка 2 и столбец 1 высокого напряжения, то показать “2”
                key++;
            }
            if (keypressed==0b00100010)
            {
                send_a_string("5"); //если строка 2 и столбец 2 высокого напряжения, то показать “5”
                key++;
            }
            if (keypressed==0b00100100)
            {
                send_a_string("8"); //если строка 2 и столбец 3 высокого напряжения, то показать “8”
                key++;
            }
            if (keypressed==0b00101000)
            {
                send_a_string("0"); //если строка 2 и столбец 1 высокого напряжения, то показать “0”
                key++;
            }
            
            
            
            if (keypressed==0b01000001)
            {
                send_a_string("3");
                key++;
            }
            if (keypressed==0b01000010)
            {
                send_a_string("6");
                key++;
            }
            if (keypressed==0b01000100)
            {
                send_a_string("9");
                key++;
            }
            if (keypressed==0b01001000)
            {
                send_a_string("#");
                key++;
            }
            
            
            
            if (keypressed==0b10000001)
            {
                send_a_string("A");
                key++;
            }
            if (keypressed==0b10000010)
            {
                send_a_string("B");
                key++;
            }
            if (keypressed==0b10000100)
            {
                send_a_string("C");
                key++;
            }
            if (keypressed==0b10001000)
            {
                send_a_string("D");
                key++;
            }
            keypressed=0;// после того как показали нажатую клавишу на экране очистим переменную, хранящую информацию о номере строки и номере столбца
            DDRA ^=0b11111111;// переключение входных и выходных портов
            _delay_ms(1);
            PORTA ^= 0b11111111;// подача питания на строки клавишной панели
            _delay_ms(220);
            
        }
        if (key==16) // если 16 символов показаны на ЖК дисплее
        {
            send_a_command(0x01);// очистить экран ЖК дисплея
            send_a_string("PRESS A KEY"); //отображение строки "PRESS A KEY" (нажмите клавишу)
            send_a_command(0x80 + 0x40 +0); // перемещение курсора на вторую строку ЖК дисплея
            key=0;
        }
    }
    
}
 
void send_a_command(unsigned char command)
{
    PORTA = command;
    PORTD &= ~ (1<<RS); // устанавливаем RS в 0 чтобы сообщить ЖК дисплею что мы будем передавать команду
    PORTD |= 1<<E; // сообщаем ЖК дисплею чтобы он принял команду/данные
    _delay_ms(50);
    PORTD &= ~1<<E; // сообщаем ЖК дисплею что мы закончили передачу данных
    PORTA= 0;
}
 
void send_a_character(unsigned char character)
{
    PORTA= character;
    PORTD |= 1<<RS; // сообщаем ЖК дисплею что мы будем передавать данные (не команду)
    PORTD |= 1<<E; // сообщаем ЖК дисплею чтобы он начал прием данных
    _delay_ms(50);
    PORTD &= ~1<<E;// сообщаем ЖК дисплею что мы закончили передачу данных
    PORTA = 0;
}
void send_a_string(char *string_of_characters)
{
    while(*string_of_characters > 0)
    {
        send_a_character(*string_of_characters++);
    }
}
Вложения
Тип файла: rar Microproc.rar (75.8 Кб, 26 просмотров)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.11.2021, 17:00
Ответы с готовыми решениями:

Вывод кода клавиши из буфера клавиатуры
Добрый вечер. Преподаватель дал задание написать курсовую. &quot;Напишите программу обработки прерывания клавиатуры, которая выводит на экран...

Ввод с клавиатуры значения=>работа функции=>вывод значения на экран
Есть функция факториала: SECTION .start global _start _start: mov eax, 10; mov ecx, eax; mov ebx, 1; for_loop: imul ebx,...

Горячие клавиши - обойти наведение фокуса и привязать клавиши клавиатуры к кнопкам на форме
всем доброго времени суток. столкнулся с такой проблемой. требуется чтобы при нажатии определенных кнопок на клавиатуре соответственно...

25
07.11.2021, 22:43
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от gogaze Посмотреть сообщение
Ну тогда и детей в школу отправлять не надо.
Почему высчитаете обучение в школе ненужным?

0
5 / 5 / 0
Регистрация: 25.06.2017
Сообщений: 586
07.11.2021, 22:53
...
0
29 / 26 / 8
Регистрация: 09.12.2017
Сообщений: 435
08.11.2021, 00:28
Лучший ответ Сообщение было отмечено IIIIIIIIIgor как решение

Решение

IIIIIIIIIgor, Готовое на блюдечке.
Вложения
Тип файла: rar Microproc.rar (87.8 Кб, 23 просмотров)
1
29 / 26 / 8
Регистрация: 09.12.2017
Сообщений: 435
08.11.2021, 04:28
Библиотека для дисплея отдельная с подробными комментариями.

Добавлено через 3 часа 54 минуты
COKPOWEHEU, Снова не по теме
Кликните здесь для просмотра всего текста
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Почему высчитаете обучение в школе ненужным?
Я то как раз считаю нужным! Это же Ваши слова- "Какой дурак будет изучать программирование по видосам?"?
А что такое уроки по "видосам" - та же школа, только по удаленке.
0
08.11.2021, 10:08

Не по теме:

Цитата Сообщение от gogaze Посмотреть сообщение
Я то как раз считаю нужным!
Но вы же написали:
Цитата Сообщение от gogaze Посмотреть сообщение
детей в школу отправлять не надо. 7 лет исполнилось - дали книжки за первый класс и пусть учит сам и так далее.
Это ваши слова, не мои.
Цитата Сообщение от gogaze Посмотреть сообщение
А что такое уроки по "видосам" - та же школа, только по удаленке.
Честно говоря, не знаю как там сейчас учатся на удаленке. Но разве там нет какого-никакого диалога с учителем, домашних заданий, плана занятий, учебников и всего такого?
Цитата Сообщение от gogaze Посмотреть сообщение
Снова не по теме
Для этого есть тэг [OFF][/OFF]

0
08.11.2021, 11:30

Не по теме:

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Честно говоря, не знаю как там сейчас учатся на удаленке. Но разве там нет какого-никакого диалога с учителем, домашних заданий, плана занятий, учебников и всего такого?
Так как раз и в видеоуроках тоже есть "диалог с учителем", можно задать вопрос и получить ответ. Если Вы принципиально не смотрите видеоуроки, то дальнейшее обсуждение данного вопроса считаю бессмысленным. Пусть каждый для себя решает сам.
По поводу использования тегов - спасибо.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.11.2021, 11:30

Есть ли разница между программным посылом клавиши PostMessage и посылом клавиши при нажатии клавиатуры?
Всем привет) Может ерунду говорю, но.. Есть ли разница между программным посылом клавиши postmessage и посылом клавиши при нажатие...

Ввод с клавиатуры номера элемента и вывод значения Xn для последовательности
Написать программу, которая осуществляет ввод с клавиатуры номера элемента и выводит значение Xn для последовательности Xn=(n/Xn-1);...

Вывод результата на LCD
Подскажите пожалуйста, как выполнить арифметические операции Например: сложение 2х чисел, но числа не целые, а дробные например 2,5+4,15 и...

Вывод на LCD значенияс переменной
Привет всем. Вот приехал ко мне Lanchpad начал я его мучать и разбираться с msp430. Подключил дисплей hd44780. Библиотека: //...

LCD number вывод температуры
Здравствуйте, что бы понятно было, я не изучал не когда не Python не QT . Собрался я на без Raspberry Pi3 умный дом собрать, первая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru