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