Технический форум по робототехнике.
RolaxD » 30 май 2007, 01:06
Доброе время суток!
Помогите решить такую задачу! Требуется реализовать на микроконтроллере Atmel матричную клавиатуру (например 4x3, то есть 12 кнопок). Идея абсолютно ясна (
http://radiokot.ru/start/mcu_fpga/avr/16/ ). Но дело в том что это нужно написать это на Си (CodeVisionAVR) что для меня пока (я только учусь) представляет большую трудность! Данная тема довольно распространенная, поэтому если у вас есть исходный код или советы как это реализовать на Си - то помогите пожалуйста! Пример из CodeVisionAVR не понял, похоже чего-то там не хватает. Очень надо!
Сергей » 30 май 2007, 01:09
[off]Щас придет дядя "123" и все расскажет и покажет
[/off]
Master » 30 май 2007, 01:51
[off]Точнее пошлет[/off]
-= Александр =- » 30 май 2007, 03:24
Я пошлю раньше: на сайте Атмел в разделе АВР есть аппноут про матричную клавиатуру. :wink:
$ilent » 30 май 2007, 09:18
Код: Выделить всё • Развернуть unsigned char keys []; unsigned short key; unsigned char i=0; unsigned char k=0; void scan_key (void) { PORTA = 0xFF; PORTA &=~BIT(2); DelayMs(1); if (!(PINA & (1 << PA1))) { while(!(PINA & (1 << PA1))) { ;; } keys[i]=1; ShowSym(keys[i]+48); i++; } else if (!(PINA & (1 << PA6))) { while(!(PINA & (1 << PA6))) { ;; } keys[i]=4; ShowSym(keys[i]+48); i++; } else if (!(PINA & (1 << PA5))) { while(!(PINA & (1 << PA5))) { ;; } keys[i]=7; ShowSym(keys[i]+48); i++; } else if (!(PINA & (1 << PA3))) { while(!(PINA & (1 << PA3))) { ;; } k=i; ClrDisp(); for (i=0;i<k;i++) { keys[k]=0x00; } i=0; k=0; } PORTA = 0xFF; PORTA &=~BIT(0); DelayMs(1); if (!(PINA & (1 << PA1))) { while(!(PINA & (1 << PA1))) { ;; } keys[i]=2; ShowSym(keys[i]+48); i++; } else if (!(PINA & (1 << PA6))) { while(!(PINA & (1 << PA6))) { ;; } keys[i]=5; ShowSym(keys[i]+48); i++; } else if (!(PINA & (1 << PA5))) { while(!(PINA & (1 << PA5))) { ;; } keys[i]=8; ShowSym(keys[i]+48); i++; } else if (!(PINA & (1 << PA3))) { while(!(PINA & (1 << PA3))) { ;; } keys[i]=0; ShowSym(keys[i]+48); i++; } PORTA = 0xFF; PORTA &=~BIT(4); DelayMs(1); if (!(PINA & (1 << PA1))) { while(!(PINA & (1 << PA1))) { ;; } keys[i]=3; ShowSym(keys[i]+48); i++; } else if (!(PINA & (1 << PA6))) { while(!(PINA & (1 << PA6))) { ;; } keys[i]=6; ShowSym(keys[i]+48); i++; } else if (!(PINA & (1 << PA5))) { while(!(PINA & (1 << PA5))) { ;; } keys[i]=9; ShowSym(keys[i]+48); i++; } else if (!(PINA & (1 << PA3))) { while(!(PINA & (1 << PA3))) { ;; } k=i; key = (keys [k-4]*10000)+ (keys [k-3]*1000)+ (keys [k-2]*100)+ (keys [k-1]*10)+ (keys [k]*1); ShowDigit(key); for (i=0;i<k;i++) { keys[k]=0x00; } i=0; k=0; } return; }
RolaxD » 31 май 2007, 22:28
-= Александр =- писал(а): Я пошлю раньше: на сайте Атмел в разделе АВР есть аппноут про матричную клавиатуру. :wink:
Это случайно не "C51 Keyboard Code Examples"? А то что-то другого не нашёл!
$ilent - тебе огромное человеческое спасибо!!!!
-= Александр =- » 01 июн 2007, 03:02
avr123.nm.ru » 01 июн 2007, 12:00
RolaxD писал(а): Требуется реализовать на микроконтроллере Atmel матричную клавиатуру (например 4x3, то есть 12 кнопок). Идея абсолютно ясна (
http://radiokot.ru/start/mcu_fpga/avr/16/ ). Но дело в том что это нужно написать это на Си (CodeVisionAVR) что для меня пока (я только учусь) представляет большую трудность!
для тех кому трудно и легко в CVAVR есть ПРИМЕРЫ !
Johnny Bravo » 01 июн 2007, 17:49
4x4
Код: Выделить всё • Развернуть unsigned char str,col; key=0; PORTA=0x0F; DDRA=0xF0; #asm("nop"); #asm("nop"); str=PINA; #asm("nop"); #asm("nop"); if(str!=0x0F) { PORTA=0xF0; DDRA=0x0F; #asm("nop"); #asm("nop"); col=PINA; #asm("nop"); #asm("nop"); while(PINA==col) buzzer_on; buzzer_off; key=(~str)&(~col); }
RolaxD » 01 июн 2007, 22:12
Огромное спасибо! Нашёл даже на русском
http://www.gaw.ru/html.cgi/txt/app/micr ... AVR243.htm -= avr123.nm.ru =- писал(а): для тех кому трудно и легко в CVAVR есть ПРИМЕРЫ !
А этим примером я что-то не разобрался!
Chooze » 04 июн 2007, 14:22
Bravo - глянул код и не вьехал, там еще чегото надо или это всё?
Chooze » 04 июн 2007, 14:40
Ха дела - уже понял. Респект!!!