shox4mysro
|
|
1 | |
Клавиатура на сдвиговом регистре 74hc16608.02.2015, 20:45. Показов 15944. Ответов 2
Метки нет (Все метки)
Сразу отмечу, опыта в проектировании/программировании у меня немного, так что не судите строго.
Однако данная разработка мне кажется интересной и уже оказалась полезной. 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 Кб] |
08.02.2015, 20:45 | |
Ответы с готовыми решениями:
2
Режим бегущих огней на сдвиговом регистре Клавиатура в верхнем регистре Массив из русских букв в верхнем регистре перевести в буквы в нижнем регистре Вывод строки: в нижнем регистре / в верхнем регистре / в HEX формате Как сделать слова, буквы четным индексом будет в верхнем регистре, а с нечетными в нижнем регистре |
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 | |
09.02.2015, 00:06 | |
Помогаю со студенческими работами здесь
3
Посчитайте сколько в веденной строке цифр, букв в верхнем регистре, в нижнем регистре и других символов Напишите функцию, которая возвращает строку strв нижнем регистре, но каждый третий знак в верхнем регистре Заменить все символы строки в верхнем регистре на символы в нижнем регистре, кроме первых букв слов Введенную строку вывести в нижнем регистре (все строчные) и в верхнем регистре (все прописные) букв Клавиатура - Клавиатура Logitech G G810 ORION SPECTRUM проблема с подсветкой Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |