maticova klavesnice v C
František Hudeček
hudaklan
Středa Březen 17 12:05:14 CET 2004
This is a multi-part message in MIME format.
------=_NextPart_000_005B_01C097EE.3D5BA240
Content-Type: text/plain;
charset="iso-8859-2"
Content-Transfer-Encoding: 7bit
Do prilohy jsem dal program rizeni ctyrmistneho displeje a cteni maticove
klavesnice s opakovanim stisknuteho znaku. Sloupce klavesnice jsou
HW sprazeny s e sloupci displeje.
V kazdem preruseni se osetri jeden sloupec displeje a precte se jeden
radek z klavesnice. Po precteni vsech radek je proveden vypocet znaku
a jeho ulozeni do klavesoveho buferu.
HUDA
----- Original Message -----
From: Jakub Ladman <ladmanj@volny.cz>
To: Multiple recipients of list <hw-news@list.gin.cz>
Sent: Thursday, February 15, 2001 3:20 PM
Subject: Re: maticova klavesnice v C
> 1) Poopravuju se, ten interval mezi prerusenimi nema byt 10ms, ale 1ms.
(f.
> celeho m-plexu: 1/(4*1ms) = 250Hz).
> Dulezite je to, ze na stejnem m-plexu bude taky matice 4x4 LED a ta nesmi
> blikat a musi mit dostatecny jas. (u kazdeho tlacitka bude jedna ledka)
> Tak tedy dalsi dotaz - je tato frekvence pro ty ledky vhodna?
> Puvodne jsem to nechtel motat dohromady, ale uz je to venku.
> 2) MH1KK1 - da se to jeste nekde sehnat? Nad necim takovym jsem puvodne
> uvazoval, ale kdyz on je docela velky, a navic tam ten m-plex tak jako tak
> musi byt.
> Diky
> Jakub Ladman
> ----- Original Message -----
> From: "Snail Instruments" <snail@iol.cz>
> To: "Multiple recipients of list" <hw-news@list.gin.cz>
> Sent: Thursday, February 15, 2001 1:09 PM
> Subject: Re: maticova klavesnice v C
>
>
> > >Ted se chystam na cteni maticove klavesnice 4x4 tlacitka pod
prerusenim.
> >
> > Otazkou zustava, je-li preruseni v tomto pripade nezbytne. Jestlize
hlavni
> > program nema cas zpracovavat stisk tlacitek, pak je zbytecne jejich stav
> > vubec sledovat. Az si cas udela, pak je mozne tlacitka nacist.
> >
> > >a prerusovat asi po 10ms.
> > >Multiplex si predstavuji tak, aby se opakoval kazde 4 preruseni.
> >
> > Testovat tlacitka s intervalem 40ms je uz dost pomale, muze se stat, ze
> > kratky stisk tlacitka unikne pozornosti programu, tech 10ms by bylo tak
> > akorat, spolehlive potlaci zakmity.
> >
> > >jak byste z te klavesnice predavali vysledky hlavnimu programu?
> > Na to musi myslet hlavni program, predavat se da treba aktualni stav
> > klavesnice v globalni promenne.
> >
> > J. Hanzal
> >
> >
> > =======================================================================
> > Electronical devices for chemical laboratory, custom electronics design
> > -----------------------------------------------------------------------
> > Snail Instruments Josef Hanzal, M. S.
> > Vojanova 615 phone/fax: +420-311-624433
> > 266 01 Beroun e-mail: snail@iol.cz
> > Czech Republic URL: http://www.vitrum.cz/snail/
> > GPS: 49deg58'28" North, 14deg 4'35" East
> > =======================================================================
> >
> >
>
>
------=_NextPart_000_005B_01C097EE.3D5BA240
Content-Type: text/plain;
name="klav.txt"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="klav.txt"
unsigned char code KLAVESY[64]=3D{ // pro foliovou klavesnici
0x0ff, // nic bit radku 4
K1, // 1
K2, // 2
0x0ff, // 12
K3, // 3
0x0ff, // 1 3
0x0ff, // 23
0x0ff, // 123
KE, // ESC
0x0ff, // 1 ESC
0x0ff, // 2 ESC
0x0ff, // 12 ESC
0x0ff, // 3ESC
0x0ff, // 1 3ESC
0x0ff, // 23ESC
0x0ff, // 123ESC
0x0ff, // nic bit radku 3
K4, // 4
K5, // 5
0x0ff, // 45
K6, // 6
0x0ff, // 4 6
0x0ff, // 5 6
0x0ff, // 456
KM, // MENU
0x0ff, // 4 MENU
0x0ff, // 5 MENU
0x0ff, // 45 MENU
0x0ff, // 6MENU
0x0ff, // 4 6MENU
0x0ff, // 5 6MENU
0x0ff, // 456MENU
0x0ff, // nic bit radku 2
K7, // 7
K8, // 8
0x0ff, // 78
K9, // 9
0x0ff, // 7 9
0x0ff, // 8 9
0x0ff, // 789
0x0ff, // NIC
0x0ff, // 7 NIC
0x0ff, // 8 NIC
0x0ff, // 78 NIC
0x0ff, // 9NIC
0x0ff, // 7 9NIC
0x0ff, // 8 9NIC
0x0ff, // 789NIC
0x0ff, // nic bit radku 1
KL, // L
K0, // 0
0x0ff, // L0
KR, // R
0x0ff, // L R
0x0ff, // 0R
0x0ff, // L0R
KN, // ENT
0x0ff, // L ENT
0x0ff, // 0 ENT
0x0ff, // L0 ENT
0x0ff, // RENT
0x0ff, // L RENT
0x0ff, // 0RENT
0x0ff, // L0RENT
};
void timer0(void) interrupt 1 using 1 // preruseni od citace 0
{ // ovlada displej, klavesnici
TL0=3DLOW(KPRER0);
TH0=3DHIGH(KPRER0);
DISPRL=3D0x00; // posli 00 na radek
DISPRH=3D0x00; // posli 00 na radek
if (citac) // citac pro zpozdeni
citac--;
if (ccitac) // citac pro zobrazovani casu
ccitac--;
DISPS=3DSLOUPCE[sloupec];
pom=3DTVARYZN[displej[sloupec]]; // vyzvedni tvar znaku
if (pom=3D=3DTNULA) // zobrazuj nulu??
{
if (!zobr) // predchazejici byla take nula??
if (sloupec>tecka)
if (sloupec)
pom=3D0x0000; // ano, nezobrazuj ji
}
else
zobr=3D1; // nastav priznak predchazejici neni 0
if (!fblik) // pri blikani nebudeme svitit
if (bsloupec) // test na blikani jen jednoho znaku
{
if (bsloupec=3D=3Dsloupec+1) // test na blikani jen jednoho =
znaku
pom=3D0x0000; // ano, zhasni znak
}
else
pom=3D0x0000; // zhasni znak
if (tecka=3D=3Dsloupec) // zobrazovat desetinnou tecku??
if (pom) // je vubec co zobrazovat
pom|=3D0x8000; // pridej deset. tecku
DISPRL=3Dpom; // posli znak na radek
DISPRH=3D(pom>>8); // posli znak na radek
// rutina pro klavesnici
p_c=3DKLAVC; // precti port s klavesnici
p_c=3Dp_c/16; // orotuju na nizsi
p_c^=3D0x0f; // oxoruju nizsi bity
p_key[sloupec]=3Dp_c; // a dam do bufferu
if ((sloupec=3D=3DMAXKDISP-1) && (dklav =3D=3D 0)) // kdyz vsechny =
sloupce precteny
{ // a delay cas uz vyprsel
for (p_c=3D0;p_c<MAXKDISP;p_c++)
{
if (p_key[p_c] !=3D0x00)
{
p_c=3DKLAVESY[(16*p_c)|(p_key[p_c])]; // dostanu cislo
if (p_c !=3D0xff) // je stisknuta skutecna klavesa
{
if ((pklav<MAXKLAV)) // osetreni opakovani znaku
{
oklav =3D p_c;
klav[pklav] =3D p_c;
pklav++;
dklav =3D KDELAY;
}
}
break;
}
}
}
else
{
if (dklav)
dklav--;
}
if (k_cas)
k_cas--;
if (sloupec) // je uz posledni sloupec??
sloupec--; // neni, zmensit
else
{
sloupec=3DMAXDISP-1; // sloupce znovu
zobr=3D0; // nastav priznak nul
}
if (blik) // je blikani znakovky ??
{
if (!blikani--) // jeste zustat??, zmensi pocitadlo
{ // uz zmenit stav blikani
blikani=3DKBLIK; // nastav pocitadlo znovu
fblik=3D!fblik; // zmen priznak stavu
}
}
else
fblik=3D1; // nastav, neblikat-svitit
}
/* funkce cteni klavesnice i s opakovanim stisknuteho znaku
unsigned char ctiznak(void)
{
unsigned char c_b;
if (pklav>0) // neni prazdny buffer
{ // precti 1 znak a posun buffer a odecti naplneni o 1
c_b=3Dklav[0];
memmove(klav,klav+1,MAXKLAV-1);
klav[MAXKLAV-1]=3D0; // nuluju posledni byte bufferu
pklav--; // snizuju naplneni bufferu
}
else // je prazdny buffer
{
if (oklav !=3D 0xff) // osetreni opakovani znaku
{
if (k_cas =3D=3D-1)
k_cas=3DKODELAY;
if (k_cas =3D=3D0 )
{
oklav=3D0xff; // dam posledni klavesu nic
k_cas =3D-1;
}
}
c_b=3D0xff; // buffer je prazdny - zadne pismenko zpet
}
return (c_b);
}
unsigned char ckbhit(unsigned char cekat)
{
unsigned char zn;
if (cekat) // budeme cekat na klavesu ???
while((zn=3Dctiznak())=3D=3D0xff); // ano, cekame na klavesu
else // ne, necekame na klavesu
zn=3Dctiznak(); // neni, vrat ze neni klavesa
return(zn); // vrat znak
}
unsigned char cgetch (void)
{
return ckbhit(1);
}
------=_NextPart_000_005B_01C097EE.3D5BA240--
Další informace o konferenci Hw-list