AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
05.09.2014, 21:07
|
|
Частый гость
Регистрация: 05.09.2014
Сообщений: 14
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Клавиатура 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.
|
|
|
|
06.09.2014, 00:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
|
Re: Клавиатура 4х4
Цитата:
|
Но мне не понятно условие if (column==(LAST_COLUMN››1))
|
Тут выполнение начнется только после 4-го прерывания. Но очень похоже на ошибку, этот код взят из рабочего проекта или из курсового?
__________________
misterdi<@>i.ua
|
|
|
|
07.09.2014, 12:27
|
|
Частый гость
Регистрация: 05.09.2014
Сообщений: 14
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Клавиатура 4х4
Спасибо за ответ, это программный код, который находится на очень многих сайтах, где демонстрируют код для работы с матричной клавиатурой 4х4
|
|
|
|
07.09.2014, 12:52
|
|
Частый гость
Регистрация: 05.09.2014
Сообщений: 14
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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);
}
}
|
|
|
|
07.09.2014, 12:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
|
Re: Клавиатура 4х4
Сообщение от ppmmonvp
|
Но прерывание не срабатывает, что нужно мне сделать, что прерывание происходило?
|
Прочитать что-нибудь по теме вопроса, например. Методом тыка вряд ли что-то толковое получится. RTFM, вообщем.
|
|
|
|
07.09.2014, 13:03
|
|
Временная регистрация
Регистрация: 17.01.2010
Сообщений: 60
Сказал спасибо: 3
Сказали Спасибо 31 раз(а) в 19 сообщении(ях)
|
Re: Клавиатура 4х4
Сообщение от ppmmonvp
|
это программный код,
|
извините, но это - ГОВНОкод. Переходы goto, когда можно обойтись без них - совсем плохо, а внутрь условных блоков - просто АД. Писавший вообще не понимал, что пишет. А растиражированность по сайтам - ну так копипастят всё, что под руку попадётся, даже не задумываясь.
А указанное вами условие... Там в предыдущей строчке вычисляется следующая колонка для опроса. Поскольку сдвинув текущее значение колонки мы можем выскочить за пределы имеющихся колонок - вот эта проверка и вставлена. И зачем-то всё остальное под эту проверку загнано. Хотя правильно сравнивать ещё не сдвинутую на новое положение колонку (можем вылететь за разрядность) с конечной, и если не достигнуто - то сдвигать, иначе инициализировать стартовой.
Это не код, это ахтунг.
|
|
|
|
07.09.2014, 13:45
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: Клавиатура 4х4
Сообщение от Харрисон
|
Это не код, это ахтунг.
|
Дык, с самого начала - CAVAR как бы намекает ...
__________________
Осторожно , злой кот
|
|
|
|
07.09.2014, 21:47
|
|
Временная регистрация
Регистрация: 17.01.2010
Сообщений: 60
Сказал спасибо: 3
Сказали Спасибо 31 раз(а) в 19 сообщении(ях)
|
Re: Клавиатура 4х4
Сообщение от dosikus
|
CAVAR как бы намекает ...
|
ну даже на нём нет необходимости такое дерьмо месить. Вполне можно и нормально писать, даже на нём, он же не заставляет... Только провоцирует тем, что позволяет... А голова тогда зачем? Не для того, что б на провокации поддаваться, мне кажется.
|
|
|
|
07.09.2014, 21:59
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,058
Сказал спасибо: 2,563
Сказали Спасибо 11,890 раз(а) в 5,964 сообщении(ях)
|
Re: Клавиатура 4х4
Опять плевки и нападки на CV... А чо на ASM не наезжаете? Уж там-то такого можно наворотить...
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
08.09.2014, 08:31
|
|
Временная регистрация
Регистрация: 17.01.2010
Сообщений: 60
Сказал спасибо: 3
Сказали Спасибо 31 раз(а) в 19 сообщении(ях)
|
Re: Клавиатура 4х4
Сообщение от akegor
|
Опять плевки и нападки на CV
|
только не от меня. Где вы нашли? А провоцирует любая развитая система. Чем больший сервис предоставляет - тем меньше разработчик хочет думать.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:08.
|
|