klavesnice
Moderátor: Moderátoři
klavesnice
Netušítě někdo jak se dá ovládat tato klávesnice?
http://www.ges.cz/?ipp=12&lang=cz&cur=C ... ES06503821
resp mám to připojené na Atmel a nevím jak zjistit že je něco zmačknuto . . .
http://www.ges.cz/?ipp=12&lang=cz&cur=C ... ES06503821
resp mám to připojené na Atmel a nevím jak zjistit že je něco zmačknuto . . .
Tak zvaná maticová klávesnice.
Info ohledně snímání z klávesnice například zde: http://programujte.com/index.php?akce=c ... ednochipem nebo například zde: http://dhservis.cz/dalsi_1/klavesnice.htm
Info ohledně snímání z klávesnice například zde: http://programujte.com/index.php?akce=c ... ednochipem nebo například zde: http://dhservis.cz/dalsi_1/klavesnice.htm
Našel jsem toto .
- Přílohy
-
- DSC00523.JPG
- (153.41 KiB) Staženo 62 x
-
- DSC00522.JPG
- (161.11 KiB) Staženo 62 x
tak já mám klavesnici připojenou přímo na P1.0 až P1.6.šlo by to zprovoznit asi nějak takto?
a tak dale by to pokracovalo podobne. . .
Kód: Vybrat vše
int stisknuto;
P1=0x7F;
if(P1==0x6F){
stisknuto=3;
goto exit;
}
if(P1==0x5F){
stisknuto=6;
goto exit;
}
Nešlo.teo píše:tak já mám klavesnici připojenou přímo na P1.0 až P1.6.šlo by to zprovoznit asi nějak takto?a tak dale by to pokracovalo podobne. . .Kód: Vybrat vše
int stisknuto; P1=0x7F; if(P1==0x6F){ stisknuto=3; goto exit; } if(P1==0x5F){ stisknuto=6; goto exit; }
Pokud budete mit tu klavesnici na jednom jedinem portu (registry DDRx a portx), tak
nejdrive musite nastavit cast portu jako vstupni a druhou jako vystupni s popotazenim do H. Pak budete cist registr PINx a maskovat pouze prislusne vstupni porty a da vam to vysledek.
Nezapomenout osetrit zakmity.
Pohodlne se to resi u nekterych AVR osetrenim preruseni od zmeny stavu portu.
nejdrive musite nastavit cast portu jako vstupni a druhou jako vystupni s popotazenim do H. Pak budete cist registr PINx a maskovat pouze prislusne vstupni porty a da vam to vysledek.
Nezapomenout osetrit zakmity.
Pohodlne se to resi u nekterych AVR osetrenim preruseni od zmeny stavu portu.
no ja bych tu klavesnici resil takto ( v mem pripade 4x4) na 4 portech se rotuje 0 a na dalsich 4 se snima vysledek:
Kód: Vybrat vše
//definice portu klavesnice
DDRE=0x0F;
PORTE=0x0F;
while(1)
{
//prvni sloupec
PORTE =0b00001110;
//1
if (bit_is_clear(PINE, 4)) ;
//4
if (bit_is_clear(PINE, 5)) ;
//7
if (bit_is_clear(PINE, 6)) ;
//*
if (bit_is_clear(PINE, 7)) ;
//druhy sloupec
PORTE =0b00001101;
//2
if (bit_is_clear(PINE, 4)) ;
//5
if (bit_is_clear(PINE, 5)) ;
//8
if (bit_is_clear(PINE, 6)) ;
//0
if (bit_is_clear(PINE, 7)) ;
//treti sloupec
PORTE =0b00001011;
//3
if (bit_is_clear(PINE, 4)) ;
//6
if (bit_is_clear(PINE, 5)) ;
//9
if (bit_is_clear(PINE, 6)) ;
//#
if (bit_is_clear(PINE, 7)) ;
//ctvrty sloupec
PORTE =0b00000111;
//ESC
if (bit_is_clear(PINE, 4)) ;
//F1
if (bit_is_clear(PINE, 5)) manual();
//F2
if (bit_is_clear(PINE, 6)) ;
//ENTER
if (bit_is_clear(PINE, 7)) ;
}
já jsem to naprogramoval podobně,ale nefunguje to.Rotuju taky 0 a pak testuju.
Kód: Vybrat vše
kl_start:
//1radek
P1=0x0E;
a=P1;
if(a==0xEE)
{
stisknuto=7;
goto exit;
}
if(a==0xDE)
{
stisknuto=8;
goto exit;
}
if(a==0xBE)
{
stisknuto=9;
goto exit;
}
//2radek
P1=0x0D;
a=P1;
if(a==0xED)
{
stisknuto=4;
goto exit;
}
if(a==0xDD)
{
stisknuto=5;
goto exit;
}
if(a==0xBD)
{
stisknuto=6;
goto exit;
}
//3radek
P1=0x0B;
a=P1;
if(a==0xEB)
{
stisknuto=1;
goto exit;
}
if(a==0xDB)
{
stisknuto=2;
goto exit;
}
if(a==0xBB)
{
stisknuto=3;
goto exit;
}
//4radek
P1=0x07;
a=P1;
if(a==0xE7)
{
stisknuto=11;//shift
goto exit;
}
if(a==0xD7)
{
stisknuto=0;
goto exit;
}
if(a==0xB7)
{
stisknuto=12;//ok
goto exit;
}
goto kl_start;
exit:
nieco jednoduchsie (menej pisania) =)
Kód: Vybrat vše
/*
klavesnica 3x4 tl.
PD0-------|
PD1----| |
PD2-| | |
| | |
| | |
PD3-1--2--3
PD4-4--5--6
PD5-7--8--9
PD6-10-11-12
*/
#include <avr/io.h>
#include <util/delay.h>
unsigned char r,s;
unsigned char klavesa;
int main()
{
DDRB = 0XFF; //PORTB nastaveny ako vystup
while(1)
{
DDRD = 0X07; // DDRD 0,1,2 nastavene ako vystup v (log "0)
PORTD = 0X78;// k PORTD 3,4,5,6 pripojene pull up
if (bit_is_clear(PIND,3)) r=1;
if (bit_is_clear(PIND,4)) r=4;
if (bit_is_clear(PIND,5)) r=7;
if (bit_is_clear(PIND,6)) r=10;
_delay_us(50);//ustalenie portu
DDRD = 0X78;// DDRD 3,4,5,6 nastavene ako vystup v (log "0")
PORTD = 0X07;// k PORTD 0,1,2 pripojene pull up
if (bit_is_clear(PIND,0)) s=2;
if (bit_is_clear(PIND,1)) s=1;
if (bit_is_clear(PIND,2)) s=0;
klavesa = s+r; //spocita riadok + stlpec
PORTB = klavesa;// vystup na port
}
};
A k čemu je tam tahle řádka?jano80 píše:nieco jednoduchsie (menej pisania) =)
Kód: Vybrat vše
_delay_us(50);//ustalenie portu