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