|
AVR - LCD panel - kbd_2x3dm.c |
|
|
Koutek AVR -
|
|
Napsal uživatel Michal, OK1WMR
|
|
Středa, 14 Březen 2012 08:58 |
|
.
.
Untitled
#ifndef setb #include "wait.c"
#endif
#ifndef PIN_KBD1
#define PIN_KBD1 PINC
#define PORT_KBD1 PORTC
#define DDR_KBD1 DDRC
#endif
#ifndef PIN_KBD2
#define PIN_KBD2 PINC
#define PORT_KBD2 PORTC
#define DDR_KBD2 DDRC
#endif
#ifndef PIN_KBD3
#define PIN_KBD3 PINC
#define PORT_KBD3 PORTC
#define DDR_KBD3 DDRC
#endif
#ifndef PORT_KBDAB
#define PORT_KBDAB PORTC
#define DDR_KBDAB DDRC
#endif
#ifndef KBD1
#define KBD1 0
#endif
#ifndef KBD2
#define KBD2 1
#endif
#ifndef KBD3
#define KBD3 2
#endif
#ifndef KBDAB
#define KBDAB 3
#endif
#ifndef KBD_SKIP
#define KBD_SKIP 20 #endif #ifndef KBD_ACC
#define KBD_ACC 4 #endif
void kbd_ini(void)
{
clrb(DDR_KBD1,KBD1);
clrb(DDR_KBD2,KBD2);
clrb(DDR_KBD3,KBD3); setb(PORT_KBD1,KBD1);
setb(PORT_KBD2,KBD2);
setb(PORT_KBD3,KBD3); setb(DDR_KBDAB,KBDAB); }
unsigned char kbd_read(void)
{
static unsigned char klavesa_old=0, cekani=0, zrychleni=0;
unsigned char klavesa=0, i;
clrb(PORT_KBDAB,KBDAB);
for(i=0;i<2;i++) {
wait_us(5); if((PIN_KBD1&(1<<KBD1))==0) setb(klavesa,0+(3*i)); if((PIN_KBD2&(1<<KBD2))==0) setb(klavesa,1+(3*i)); if((PIN_KBD3&(1<<KBD3))==0) setb(klavesa,2+(3*i)); negb(PORT_KBDAB,KBDAB); }
if(klavesa>0) {
if(klavesa_old==klavesa) {
if(cekani>KBD_SKIP) {
cekani=zrychleni; if(zrychleni<=KBD_SKIP) zrychleni+=KBD_ACC; return klavesa; }
else cekani++; } else {
cekani=0;
zrychleni=0;
klavesa_old=klavesa; return klavesa; } }else
klavesa_old=0;
return 0;
}
|