PIC-es nyomógomb

Moczik Gabor progzmaster at freemail.hu
Sat Jun 11 14:12:34 CEST 2005


Zsolt wrote:
> Esetleg annak a full extrás megoldásnak a kódját is szívesen venném amiben,
> ha 2 másodpercig nyomják a gombot akkor az kezdjen el automatikusan
> léptetni, mint a quartz óráknál...

Itt a full extras, C-ben, nem kivanom assemblyre forditani:

// 1/50-ed masodpercben megadva
#define KBD_REPEAT_DELAY     20  /* 0.4s */
#define KBD_REPEAT_RATE      2

// keyboard buffer size
#define KB_BUF_SIZE     4

// key bits
#define KB_ENTER        0x01
#define KB_DOWN         0x02
#define KB_UP           0x04

// keyboard state machine
#define KBS_WAIT        0x00      /* awaiting for keypress */
#define KBS_DELAY       0x01      /* key held down, delay before repeat */
#define KBS_REPEAT      0x02      /* key held down, repeating */

// keyboard buffer, next free space ptr, next readable code ptr
persistent volatile unsigned char kbuf[KB_BUF_SIZE];
persistent volatile unsigned short k_holdtime; // miota tartjak lenyomva
persistent unsigned char k_now,k_press,k_dcnt;
unsigned char k_free,k_next,k_state,k_prev=0x07;

// get keycode from kbd buffer. 0x00 if buffer empty
unsigned char getkey(void)
{
     unsigned char k;

     if (k_next==k_free) return 0;      // buffer is empty
     k=kbuf[k_next++];                  // read code
     k_next&=KB_BUF_SIZE-1;             // wrap around, if needed
     return k;
}

/*
  ***** EZ A RUTIN NALAM TIMER INTERRUPTBOL MEGY, MASOPERCENKENT
  ***** 50-SZER FUT LE
*/

  // poll keypad
             IOSEL=0;
             TRISD=0xFF;
             IORW=1;
             IOSEL=1;
             k_now=PORTD&0x07;              // read keyboard
             IOSEL=0;
             k_press=(k_now^k_prev)&k_prev; // compare with previous state
             //k_press=(k_now^k_prev)&k_now;  // compare with previous state
             if (k_press) {                 // is any key pressed?
                 kbuf[k_free++]=k_press;
                 k_free&=KB_BUF_SIZE-1;
                 // initialize repeat mode, only if _not_ 'ENTER' key was 
pressed
                 if (k_press!=KB_ENTER) {
                     // key pressed, initialize delay counter for repeat
                     k_dcnt=KBD_REPEAT_DELAY;
                     // entering 'delay' state
                     k_state=KBS_DELAY;
                 }
                 k_holdtime=0;
             } else {
                 if (k_now!=0x07) {
                     k_holdtime++;
                     if (k_state>KBS_WAIT && !k_dcnt--) {
                         if (k_state==KBS_DELAY) k_state=KBS_REPEAT;
                         if (k_state==KBS_REPEAT) {
                             // repeat
                             k_dcnt=KBD_REPEAT_RATE;
                             // place in buffer
                             kbuf[k_free++]=k_now^0x07;
                             k_free&=KB_BUF_SIZE-1;
                         }
                     }
                 } else {
                     k_state=KBS_WAIT;
                 }
             }
             k_prev=k_now;         // save as 'previous value'
         }


-- 
((( Móczik Gábor  )))--((( hu <- DOT <- freemail <- AT <- progzmaster )))
((( Skype: moczik )))--((( Website: http://progzmaster.homelinux.org  )))




More information about the Elektro mailing list