Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы

Клавиатура 4х4

Непрочитано 05.09.2014, 21:07  
ppmmonvp
Частый гость
 
Регистрация: 05.09.2014
Сообщений: 14
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
ppmmonvp на пути к лучшему
По умолчанию Клавиатура 4х4

Код:
#asm 
.equ __lcd_port=0x15 
#endasm 

#include ‹lcd.h› 
#include ‹stdio.h› 
#include ‹delay.h› 
#include ‹mega16.h› 

// quartz crystal frequency [Hz] 
#define F_XTAL 3686400L 
// PIND0..3 will be row inputs 
#define KEYIN PIND 
// PORTD4..7 will be column outputs 
#define KEYOUT PORTD 
// used for TIMER0 count initialization 
#define INIT_TIMER0 TCNT0=0x100L-F_XTAL/64L/500L 
#define FIRST_COLUMN 0x80 
#define LAST_COLUMN 0x10 

typedef unsigned char byte; 
// store here every key state as a bit, 
// bit 0 will be KEY0, bit 1 KEY1,... 
unsigned keys; 
// LCD display buffer 
char buf[33]; 

// TIMER 0 interrupt at every 2 ms 
interrupt [TIM0_OVF] void timer0_int(void) 
{
static byte key_pressed_counter=20; 
static byte key_released_counter,column=FIRST_COLUMN; 
static unsigned row_data,crt_key; 
// reinitialize TIMER0 
INIT_TIMER0; 
row_data‹‹=4; 
// get a group of 4 keys in in row_data 
row_data|=~KEYIN&0xf; 
column››=1; 
if (column==(LAST_COLUMN››1)) 
{//(1) 
column=FIRST_COLUMN; 
if (row_data==0) goto new_key; 
if (key_released_counter) --key_released_counter; 
else 
{//(2) 
if (--key_pressed_counter==9) crt_key=row_data; 
else 
{//(3) 
if (row_data!=crt_key) 
{//(4) 
new_key: 
key_pressed_counter=10; 
key_released_counter=0; 
goto end_key; 
};//(4) 
if (!key_pressed_counter) 
{//(5) 
keys=row_data; 
key_released_counter=20; 
};//(5) 
};//(3) 
};//(2) 
end_key:; 
row_data=0; 
};//(1) 
// select next column, inputs will be with pull-up 
KEYOUT=~column; 
} 

// test if a key was pressed 
unsigned inkey(void) 
{ 
unsigned k; 
if (k=keys) keys=0; 
return k; 
} 

void init_keypad(void) 
{ 
DDRD=0xf0; 
INIT_TIMER0; 
TCCR0=3; 
TIMSK=2; 
#asm("sei") 
} 

main() { 
unsigned k; 
init_keypad(); 
lcd_init(20); 
lcd_putsf("CVAVR Keypad"); 
// read keys and display key code 
while (1) 
{ 
lcd_gotoxy(0,1); 
if (k=inkey()) 
{ 
sprintf(buf,"Key code=%Xh",k); 
lcd_puts(buf); 
} 
else lcd_putsf("NO KEY "); 
delay_ms(500); 
} 
}
Это программа работы микроконтроллера с матричной клавиатурой 4х4.
Здравствуйте помогите пожалуйста понять алгоритм работы выделенного жирным шрифтом фрагмента кода. Мне нужно его понять, чтоб написать свою программу. Иначе не выходит. Насколько я понял здесь в качестве выходов столбцов ножки порта D 7,6,5,4. Входы строк ножки порта D 1,2,3,4.
После каждого некоторого количества микросекунд срабатывает прерывание и мы проходимся по каждому столбцу и считываем была ли нажата клавиша в какой - либо строке.
Но мне не понятно условие if (column==(LAST_COLUMN››1))
При самом первом вызове прерывания, там будет if(64 == 8) условие не выполняется, мы пропускаем все скобки и перемещаемся к строке KEYOUT=~column; И на этом всё, чтения не было. А как же тогда происходит считывание нажатых клавиш?
Реклама:

Последний раз редактировалось ppmmonvp; 05.09.2014 в 21:16.
ppmmonvp вне форума  
Непрочитано 06.09.2014, 00:13  
MisterDi
Почётный гражданин KAZUS.RUN
 
Аватар для MisterDi
 
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,284
Сказал спасибо: 441
Сказали Спасибо 1,040 раз(а) в 701 сообщении(ях)
MisterDi на пути к лучшему
По умолчанию Re: Клавиатура 4х4

Цитата:
Но мне не понятно условие if (column==(LAST_COLUMN››1))
Тут выполнение начнется только после 4-го прерывания. Но очень похоже на ошибку, этот код взят из рабочего проекта или из курсового?
__________________
misterdi<@>i.ua
MisterDi вне форума  
Непрочитано 07.09.2014, 12:27  
ppmmonvp
Частый гость
 
Регистрация: 05.09.2014
Сообщений: 14
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
ppmmonvp на пути к лучшему
По умолчанию Re: Клавиатура 4х4

Спасибо за ответ, это программный код, который находится на очень многих сайтах, где демонстрируют код для работы с матричной клавиатурой 4х4
ppmmonvp вне форума  
Непрочитано 07.09.2014, 12:52  
ppmmonvp
Частый гость
 
Регистрация: 05.09.2014
Сообщений: 14
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
ppmmonvp на пути к лучшему
По умолчанию Re: Клавиатура 4х4

Я хочу разобрать прерывание по переполнению таймера отдельно. Вот такой код я сделал, тут в случае срабатывания прерывания на всех ножках порта С будет логическая "1". Но прерывание не срабатывает, что нужно мне сделать, что прерывание происходило?
#include ‹mega16.h›
#include ‹delay.h›
interrupt [TIM0_OVF] void timer0_int(void)//прерывание по переполнению Таймера/Счетчика 0
{
DDRC=0xFF;
PORTC=0xFF;
}
void main(void)
{
SREG=0b10000000;
TCCR0=0b00000001;
while(1)
{
delay_ms(500);
}
}
ppmmonvp вне форума  
Непрочитано 07.09.2014, 12:57  
Ara41
Почётный гражданин KAZUS.RUN
 
Регистрация: 30.09.2006
Сообщений: 1,557
Сказал спасибо: 157
Сказали Спасибо 660 раз(а) в 430 сообщении(ях)
Ara41 на пути к лучшему
По умолчанию Re: Клавиатура 4х4

Сообщение от ppmmonvp Посмотреть сообщение
Но прерывание не срабатывает, что нужно мне сделать, что прерывание происходило?
Прочитать что-нибудь по теме вопроса, например. Методом тыка вряд ли что-то толковое получится. RTFM, вообщем.
Ara41 вне форума  
Непрочитано 07.09.2014, 13:03  
Харрисон
Временная регистрация
 
Регистрация: 17.01.2010
Сообщений: 60
Сказал спасибо: 3
Сказали Спасибо 31 раз(а) в 19 сообщении(ях)
Харрисон на пути к лучшему
По умолчанию Re: Клавиатура 4х4

Сообщение от ppmmonvp Посмотреть сообщение
это программный код,
извините, но это - ГОВНОкод. Переходы goto, когда можно обойтись без них - совсем плохо, а внутрь условных блоков - просто АД. Писавший вообще не понимал, что пишет. А растиражированность по сайтам - ну так копипастят всё, что под руку попадётся, даже не задумываясь.

А указанное вами условие... Там в предыдущей строчке вычисляется следующая колонка для опроса. Поскольку сдвинув текущее значение колонки мы можем выскочить за пределы имеющихся колонок - вот эта проверка и вставлена. И зачем-то всё остальное под эту проверку загнано. Хотя правильно сравнивать ещё не сдвинутую на новое положение колонку (можем вылететь за разрядность) с конечной, и если не достигнуто - то сдвигать, иначе инициализировать стартовой.

Это не код, это ахтунг.
Харрисон вне форума  
Непрочитано 07.09.2014, 13:45  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Клавиатура 4х4

Сообщение от Харрисон Посмотреть сообщение
Это не код, это ахтунг.
Дык, с самого начала - CAVAR как бы намекает ...
__________________
Осторожно , злой кот
dosikus вне форума  
Непрочитано 07.09.2014, 21:47  
Харрисон
Временная регистрация
 
Регистрация: 17.01.2010
Сообщений: 60
Сказал спасибо: 3
Сказали Спасибо 31 раз(а) в 19 сообщении(ях)
Харрисон на пути к лучшему
По умолчанию Re: Клавиатура 4х4

Сообщение от dosikus Посмотреть сообщение
CAVAR как бы намекает ...
ну даже на нём нет необходимости такое дерьмо месить. Вполне можно и нормально писать, даже на нём, он же не заставляет... Только провоцирует тем, что позволяет... А голова тогда зачем? Не для того, что б на провокации поддаваться, мне кажется.
Харрисон вне форума  
Непрочитано 07.09.2014, 21:59  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Клавиатура 4х4

Опять плевки и нападки на CV... А чо на ASM не наезжаете? Уж там-то такого можно наворотить...
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Непрочитано 08.09.2014, 08:31  
Харрисон
Временная регистрация
 
Регистрация: 17.01.2010
Сообщений: 60
Сказал спасибо: 3
Сказали Спасибо 31 раз(а) в 19 сообщении(ях)
Харрисон на пути к лучшему
По умолчанию Re: Клавиатура 4х4

Сообщение от akegor Посмотреть сообщение
Опять плевки и нападки на CV
только не от меня. Где вы нашли? А провоцирует любая развитая система. Чем больший сервис предоставляет - тем меньше разработчик хочет думать.
Харрисон вне форума  
 

Метки
клавиатура 4х4
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Старая клавиатура для "486", типа AT Cahes2 Ремонт оргтехники 25 31.01.2014 16:48
Не матричная клавиатура для МП alexplev Микроконтроллеры, АЦП, память и т.д 8 22.02.2009 03:16
Телефон Cameron CT-2040 не работает ни дисплей ни клавиатура RA3TSL Поиск схем. Делимся схемами 0 11.10.2008 19:53
Дистанционная клавиатура (RC-5 -> PS/2) swona Микроконтроллеры, АЦП, память и т.д 3 26.06.2008 11:45
ХЭЛП: самодельная клавиатура к ПК на 5 кнопок tnosov Микроконтроллеры, АЦП, память и т.д 8 24.05.2008 13:59


Часовой пояс GMT +4, время: 18:59.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.