Помогите решить такую задачу! Требуется реализовать на микроконтроллере Atmel матричную клавиатуру (например 4x3, то есть 12 кнопок). Идея абсолютно ясна (
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;
}
-= Александр =- писал(а):Я пошлю раньше: на сайте Атмел в разделе АВР есть аппноут про матричную клавиатуру. :wink:
RolaxD писал(а):Требуется реализовать на микроконтроллере Atmel матричную клавиатуру (например 4x3, то есть 12 кнопок). Идея абсолютно ясна (http://radiokot.ru/start/mcu_fpga/avr/16/ ). Но дело в том что это нужно написать это на Си (CodeVisionAVR) что для меня пока (я только учусь) представляет большую трудность!
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);
}
-= Александр =- писал(а):Аппноут:http://www.atmel.com/dyn/resources/prod ... oc2532.pdf
И код:http://www.atmel.com/dyn/resources/prod ... AVR243.zip
-= avr123.nm.ru =- писал(а):для тех кому трудно и легко в CVAVR есть ПРИМЕРЫ !
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16