shox4mysro
1

Клавиатура на сдвиговом регистре 74hc166

08.02.2015, 20:45. Показов 15944. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Сразу отмечу, опыта в проектировании/программировании у меня немного, так что не судите строго.

Однако данная разработка мне кажется интересной и уже оказалась полезной.


http://s010.***********/i311/1502/46/2cf51af7356b.jpg

Существует несколько проектов клавиатур на сдвиговых регистрах [1,2,3,4,5].

ИМХО все они не без изъяна. То ограничены применением аппаратных SPI, то в коде фиг разберешься (тут мои знания не без изъяна :) ).
В общем собрал свою восьмикнопочную клавиатуру на 8-битном PISO сдвиговом регистре.
Отличием данного девайса является подключение к кристаллу по трем проводам к любым трем свободным пинам. Плюс два провода на питание и землю.


http://i067.***********/1502/c6/e758b0ff2f42.jpg

Код написал на C:/*
* klava.c
*
* Created: 06.10.2014 20:46:37
* Author: shox4mysro
*/

#defyme F_CPU 4000000UL

#ymstude <avr/io.h> // Библиотека ввода/вывода
#ymstude <avr/interrupt.h> // Библиотека прерываний

// Настраиваем порты для работы с клавиатурой
#defyme clk 4 // Задаем пин для генератора импульсов
#defyme SH_LD 6 // Задаем пин для инициализации PISO
#defyme SO 7 // Задаем пин для приема данных
#defyme PORT PORTD // Задаем порт для работы с клавиатурой
#defyme PIN PIND // Задаем пины для работы с клавиатурой
#defyme DDR DDRD // Задаем порт для работы с клавиатурой
#defyme DDR_out DDRB // Настраиваем регистр вывода (закомментировать, если пишем в РОН)

unsykned char REG_out, n, t; // Определяем тип регистра вывода, счетчик для таймера Т0, счетчик для разряда регистра вывода REG_out

ISR(TIMER0_OVF_vect) // Обработчик прерывания
{
asm("nop");
PORT ^=(1<<clk); // Инвертируем пин генератора

if (n>=17) // Если счет дошел до 17-и
{
n=0; // Обнуляем счетчик n
PORTB = REG_out; // Записываем значение регистра данных в регистр порта
REG_out = 0x00; // Обнуляем регистр данных для следующего значения
}

else if (n==0) // Если n=0, прижимаем SH_LD
{
PORT ^=(1<<SH_LD); // Инвертируем пин инициализации (SH_LD)
n++; // Считаем дальше
}

else if (n==2) // Если n=0, поднимаем SH_LD
{
PORT ^=(1<<SH_LD); // Инвертируем пин инициализации (SH_LD)
n++; // Считаем дальше
}

else if (PIN & (1<<SO)) // Читаем пин данных SO
{
t=(n-1)/2; // Вычисляем требуемый разряд для записи в регистр REG_out
REG_out |=(1<<t); // И записываем 1 в t разряд регистра вывода REG_out
n++; // Считаем дальше
}

else n++; // Иначе, считаем дальше
}

int main(void) // Основная программа
{

PORT |=(1<<clk); // Ставим пин в 1 для генерации такта
PORT |=(1<<SH_LD); // Ставим пин в 1 для инициализации PISO
PORT &=~(1<<SO); // Ставим пин в ноль для приема данных
PORTB = 0x00; // Ставим пины порта в 1 для вывода информации

DDR_out = 0xff; // Открываем порт данных (закомментировать, если пишем в РОН)
DDR |= (1<<clk) | (1<<SH_LD); // Открываем пины на PISO
DDR &=~(1<<SO); // Открываем пин данных с PISO

TCNT0 = 0x00; // Обнуляем таймер
TCCR0 |= (0<<CS02) | (1<<CS01) | (0<<CS00); // Выставляем делитель таймера
TIMSK |= (1<<TOIE0); // Сброс счетчика Т0 по переполнению

sei(); // Разрешаем прерывания

while(1) // Карусель-карусель
{
asm("nop");
}

}

Архив проекта см. в приложении.

Принцип работы PISO [6,7]


[57.96 Кб]
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2015, 20:45
Ответы с готовыми решениями:

Режим бегущих огней на сдвиговом регистре
Здравствуйте, подскажите, пожалуйста, как можно реализовать бегущие огни на сдвиговом регистре.

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

Массив из русских букв в верхнем регистре перевести в буквы в нижнем регистре
Здравствуйте! Подскажите, пожалуйста, как массив из русских букв в верхнем регистре перевести в...

Вывод строки: в нижнем регистре / в верхнем регистре / в HEX формате
Использование библиотеки ввода-вывода языка С++ 14. Напишите программу которая будет просить...

Как сделать слова, буквы четным индексом будет в верхнем регистре, а с нечетными в нижнем регистре
Ввожу слова или текс в textBox вывожу на label, как измененную строку у которой каждая буква с...

2
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
08.02.2015, 23:32 2
В прерывании нужно размещать только самое необходимое. Прерывание должно только выставлять флаг необходимости опроса клавиатуры с необходимой периодичностью. Все остальное должно делаться в главном цикле.
0
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
09.02.2015, 00:06 3
Не с целью критики, устаканивания для. Пост в первом приближении является переложением на С этой статьи. Ну или параллельным изобретением велосипеда. В качестве экономии аппаратных ресурсов МК (таймера) и/или оптимизации вычислительных/энергетических ресурсов можно добавить 8 диодов (одну сборку), один резистор и задействовать 1 дополнительный вход (например, для мега8- INT0(1) ). Тогда по нажатию любой кнопки будет генерироваться прерывание, результатом обработки которого и станет ваша программная реализация SPI. Возможно, в некоторых приложениях этот подход будет предпочтительнее. Это, скорее, мысли вслух, чем критика.
0
09.02.2015, 00:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.02.2015, 00:06
Помогаю со студенческими работами здесь

Посчитайте сколько в веденной строке цифр, букв в верхнем регистре, в нижнем регистре и других символов
Посчитайте сколько в веденной строке цифр, букв в верхнем регистре, в нижнем регистре и других...

Напишите функцию, которая возвращает строку strв нижнем регистре, но каждый третий знак в верхнем регистре
Задание 1 Напишите функцию, которая возвращает строку strв нижнем регистре, но каждый третий знак...

Заменить все символы строки в верхнем регистре на символы в нижнем регистре, кроме первых букв слов
Здравствуйте, не могу разобраться с tolower и toupper в С++. Есть задание: Дана строка. Слово...

Введенную строку вывести в нижнем регистре (все строчные) и в верхнем регистре (все прописные) букв
s=input() print(s.lower()) print(s.upper()) Ввести строку из прописных и строчных букв. Если...

Клавиатура - Клавиатура Logitech G G810 ORION SPECTRUM проблема с подсветкой
Здравствуйте. У двух кнопок в клавиатуре Logitech G G810 ORION SPECTRUM перестала гореть подсветка...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru