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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Аватар для MisterDi
 
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
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.RU
 
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
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
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
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,056
Сказал спасибо: 2,562
Сказали Спасибо 11,889 раз(а) в 5,963 сообщении(ях)
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, время: 23:18.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot