klavesnice

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
teo
Příspěvky: 51
Registrován: 26 říj 2008, 02:00
Kontaktovat uživatele:

klavesnice

#1 Příspěvek od teo »

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 . . .

Uživatelský avatar
GeorgeB
Příspěvky: 1187
Registrován: 21 lis 2005, 01:00
Bydliště: Pardubice
Kontaktovat uživatele:

#2 Příspěvek od GeorgeB »

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

Uživatelský avatar
BOBOBO
Příspěvky: 18110
Registrován: 25 úno 2008, 01:00
Bydliště: Rychnovsko

#3 Příspěvek od BOBOBO »

Našel jsem toto .
Přílohy
DSC00523.JPG
(153.41 KiB) Staženo 62 x
DSC00522.JPG
(161.11 KiB) Staženo 62 x

Uživatelský avatar
Crifodo
Příspěvky: 14471
Registrován: 11 říj 2005, 02:00

#4 Příspěvek od Crifodo »

teo píše: mám to připojené na Atmel a nevím jak zjistit že je něco zmačknuto . . .
nepřeskočil jsi nějakou vývojovou větev? :twisted:

Uživatelský avatar
teo
Příspěvky: 51
Registrován: 26 říj 2008, 02:00
Kontaktovat uživatele:

#5 Příspěvek od teo »

tak já mám klavesnici připojenou přímo na P1.0 až P1.6.šlo by to zprovoznit asi nějak takto?

Kód: Vybrat vše

int stisknuto;
P1=0x7F;
if(P1==0x6F){
                   stisknuto=3;
                   goto exit;
                   }
if(P1==0x5F){
                   stisknuto=6;
                   goto exit;
                   }
a tak dale by to pokracovalo podobne. . .

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#6 Příspěvek od Andrea »

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?

Kód: Vybrat vše

int stisknuto;
P1=0x7F;
if(P1==0x6F){
                   stisknuto=3;
                   goto exit;
                   }
if(P1==0x5F){
                   stisknuto=6;
                   goto exit;
                   }
a tak dale by to pokracovalo podobne. . .
Nešlo.

bohous1

#7 Příspěvek od bohous1 »

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.

Uživatelský avatar
endthe
Příspěvky: 56
Registrován: 07 bře 2009, 01:00
Bydliště: Brno
Kontaktovat uživatele:

#8 Příspěvek od endthe »

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)) ;
                
}

Uživatelský avatar
teo
Příspěvky: 51
Registrován: 26 říj 2008, 02:00
Kontaktovat uživatele:

#9 Příspěvek od teo »

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:

Uživatelský avatar
jano80
Příspěvky: 73
Registrován: 16 lis 2008, 01:00
Bydliště: Michalovce

#10 Příspěvek od jano80 »

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 


}

};

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#11 Příspěvek od Andrea »

jano80 píše:nieco jednoduchsie (menej pisania) =)
A k čemu je tam tahle řádka?

Kód: Vybrat vše

   _delay_us(50);//ustalenie portu 

Uživatelský avatar
jano80
Příspěvky: 73
Registrován: 16 lis 2008, 01:00
Bydliště: Michalovce

#12 Příspěvek od jano80 »

50 us ustalenie portu (bez toho to blbne zrejeme pomaly port)

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#13 Příspěvek od Andrea »

jano80 píše:50 us ustalenie portu (bez toho to blbne zrejeme pomaly port)
A kterého portu?

Uživatelský avatar
jano80
Příspěvky: 73
Registrován: 16 lis 2008, 01:00
Bydliště: Michalovce

#14 Příspěvek od jano80 »

PORTD, vid. priklad...

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#15 Příspěvek od Andrea »

A jaký to má smysl, čekat 50us na ustálení portu, když se jeho stav následujícím příkazem mění?

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“