Programmiertechnik Tastenabfrage

Algorithmen

rbr50
 
Avatar
 
Subject:

Programmiertechnik Tastenabfrage

 · 
Posted: 03.02.2012 - 17:29  ·  #1
Hallo,

ich habe hier ein Grafikdisplay mit Touch, welches per serieller den (zuvor definierten Code) einer gedrückten Taste sendet. Um diese Tasten jetzt auszuwerten, benutze ich folgendes Konstrukt:

Ich habe einen Aufzählungstypen:

Code
Type TKeyNames = (NullDummy, Key_OK, Key_Stunden, Key_Messen, Key_ZeitStellen,
  Key_0,   Key_1,  Key_2,  Key_3,  Key_4,  Key_5,  Key_6,  Key_7,  Key_8,
  Key_9,  Key_Back);


Und Bitvariablen:

Code
  TastenSatz1    : word;
  TasteOK[@TastenSatz1, 0]   : bit;
  TasteStunden [@TastenSatz1, 1]: bit;
  TasteMessen[@TastenSatz1, 2]: bit;
  TasteZeitStellen[@TastenSatz1, 3]: bit;
  Taste0 [@TastenSatz1, 4]   : bit;
  Taste1 [@TastenSatz1, 5]   : bit;
  Taste2 [@TastenSatz1, 6]   : bit;
  Taste3 [@TastenSatz1, 7]   : bit;
  Taste4 [@TastenSatz1, 8]   : bit;
  Taste5 [@TastenSatz1, 9]   : bit;
  Taste6 [@TastenSatz1, 10]  : bit;
  Taste7 [@TastenSatz1, 11]  : bit;
  Taste8 [@TastenSatz1, 13]  : bit;
  Taste9 [@TastenSatz1, 14]  : bit;
  TasteBack [@TastenSatz1, 15]: bit;


In einem Process schaue ich nach, ob Daten bereitliegen. Wenn ja, setzte ich die Variablen:

Code
Task DatenAbfrage(idata, 4, resumed);
var
  len            : byte;
  TastCode       : byte;
begin

  if SendPin = false then
    SysLEDflashOnce(byte(LEDSys));
    ch:= #0;
    Serout(DC2);
    Serout($1);
    Serout($53);
    Serout($66);
    ch:= serinp;  //ACK vom Display
    ch:= serinp;  //DC1 vom Display
    len:= serinp;  //LEN vom Display
    SerinpBlock_p(@buf, word(len + 1));
    if buf[1] = ord('A') then  //Antwort vom Touch, dass Taste gedrückt
      TastCode:= buf[3];
      case TastCode of
        Key_OK          : incl(TasteOK);
                        |
        Key_Stunden     : incl(TasteStunden);
                        |
        Key_Messen      : incl(TasteMessen);
                        |
        Key_ZeitStellen : incl(TasteZeitStellen);
                        |
        Key_0           : incl(Taste0);  KeyChar:= '0';
                        |
        Key_1           : incl(Taste1);  KeyChar:= '1';
                        |
        Key_2           : incl(Taste2);  KeyChar:= '2';
                        |
        Key_3           : incl(Taste3);  KeyChar:= '3';
                        |
        Key_4           : incl(Taste4);  KeyChar:= '4';
                        |
        Key_5           : incl(Taste5);  KeyChar:= '5';
                        |
        Key_6           : incl(Taste6);  KeyChar:= '6';
                        |
        Key_7           : incl(Taste7);  KeyChar:= '7';
                        |
        Key_8           : incl(Taste8);  KeyChar:= '8';
                        |
        Key_9           : incl(Taste9);  KeyChar:= '9';
                        |
        Key_Back        : incl(TasteBack); KeyChar:= 'D';
                        |

      endcase;
    endif;
    SysLEDflashOnce(byte(LEDOK));
  endif;
end;


Innerhalb der Procedure und Funktionen kann ich dann die Vars nutzen, z.B. so:

Code
 repeat
    if KeyChar <> #0 then
      if KeyChar <> 'D' then
        Eingabe:= Eingabe + KeyChar;
      endif;
        TastenSatz1:=0;
      KeyChar:=#0;
    endif;
    if Eingabe <> '' then
      Buffer:= '#ZL1,35,' + Eingabe + #10;
      DataOut;
      mdelay(100);
    endif;
  until TasteOK;
  excl(TasteOK);


Das funktioniert zwar, aber da ich weiß, dass ich nicht sonderlich gut programmieren kann:
Das geht bestimmt viel eleganter und sparsamer. Kann mir jemand eine Richtung zeigen?


Vielen Dank für Eure Zeit und viele Grüße aus Petershagen!

Rolf
Merlin
Administrator
Avatar
Gender:
Age: 24
Posts: 1373
Registered: 03 / 2005
Subject:

Re: Programmiertechnik Tastenabfrage

 · 
Posted: 03.02.2012 - 18:29  ·  #2
Hi Rolf

If you did not have NullDummy it would be easier. If you can drop this you can do the following

Code

Type TKeyNames = (Key_OK, Key_Stunden, Key_Messen, Key_ZeitStellen, 
  Key_0,   Key_1,  Key_2,  Key_3,  Key_4,  Key_5,  Key_6,  Key_7,  Key_8, 
  Key_9,  Key_Back);
Type TKeySet = set of TKeyNames;

var
  TastenSatz : TKeySet;

Task DatenAbfrage(idata, 4, resumed); 
var 
  len            : byte; 
  TastCode       : TKeyNames ; 
begin 

  if SendPin = false then 
    SysLEDflashOnce(byte(LEDSys)); 
    ch:= #0; 
    Serout(DC2); 
    Serout($1); 
    Serout($53); 
    Serout($66); 
    ch:= serinp;  //ACK vom Display 
    ch:= serinp;  //DC1 vom Display 
    len:= serinp;  //LEN vom Display 
    SerinpBlock_p(@buf, word(len + 1)); 
    if buf[1] = ord('A') then  //Antwort vom Touch, dass Taste gedrückt 
      TastCode:= TKeyNames (buf[3]);
       incl( TastenSatz , TastCode );
    endif; 
    SysLEDflashOnce(byte(LEDOK)); 
  endif; 
end; 




Untested, but you get the idea.

Merlin.
rbr50
 
Avatar
 
Subject:

Re: Programmiertechnik Tastenabfrage

 · 
Posted: 03.02.2012 - 18:52  ·  #3
Hi Merlin!

Thanks a lot for answering! Yes, i think, you showed me the right path, thanks again.
The magic word is "set of". Your code looks much nicer, really!

Best regards,

Rolf
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 13   64   77 · Page-Gen-Time: 0.028408s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI