📄 keypad.c
字号:
/*****************************************
NAME: keypad.c
DESC: keypad test codes
HISTORY: 2002.12.29:draft ver 0.0
*****************************************/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "option.h"
#include "2460addr.h"
#include "2460lib.h"
#include "2460slib.h"
#include "keypad.h"
void __irq Key_ISR(void);
void Key_pad_Init(void);
void Ch33_KEYPAD(void);
int count;
void Ch33_KEYPAD(void)
{
int GPJsave;
//rKEYIFCON=(1<<3)|(1<<2)|(0x1);
GPJsave =rGPJCON;
rGPJCON|=0x1;
rGPJDAT=0x1;
rKEYIFCON=0xd;
rKEYIFFC=0x100;
printf("rKEYIFCON=%x\n",rKEYIFCON);
Key_pad_Init();
rKEYIFCOL=0x0;
pISR_KEYPAD = (int)Key_ISR;
rINTMSK&= ~(BIT_KEYPAD);
// printf("rINTMSK=%x\n",rINTMSK);
printf("keypad test start .......\n");
while(!Uart_GetKey())
{
//printf("rSRCPND0=%x",rSRCPND);
}//printf(".");
rGPJCON=GPJsave;
ClearPending(BIT_KEYPAD);
rINTMSK |= BIT_KEYPAD; //Key Pad Int mask enable
}
void __irq Key_ISR(void)
{
unsigned short dat_row[6];
int i=0,j=0;
rGPJDAT=0x0;
count++;
printf("!\n");
rKEYIFCON=0x0;
rKEYIFSTSCLR=0x1; //Interrupt pending clear
rINTMSK |= BIT_KEYPAD;
ClearPending(BIT_KEYPAD); // Remove the pending bit
#if 1
rKEYIFCOL=0x3e;
Delay(1); //delay(100)=10msec, delay(10)=1msec
dat_row[0]=(rKEYIFROW&0x3f);
rKEYIFCOL=0x3d;
Delay(10); //delay(100)=10msec, delay(10)=1msec
dat_row[1]=(rKEYIFROW&0x3f);
rKEYIFCOL=0x3b;
Delay(10); //delay(100)=10msec, delay(10)=1msec
dat_row[2]=(rKEYIFROW&0x3f);
rKEYIFCOL=0x37;
Delay(10); //delay(100)=10msec, delay(10)=1msec
dat_row[3]=(rKEYIFROW&0x3f);
rKEYIFCOL=0x2f;
Delay(10); //delay(100)=10msec, delay(10)=1msec
dat_row[4]=(rKEYIFROW&0x3f);
rKEYIFCOL=0x1f;
Delay(10); //delay(100)=10msec, delay(10)=1msec
dat_row[5]=(rKEYIFROW&0x3f);
rKEYIFCOL=0x3f;
#else
while(1)
{
rKEYIFCOL=0x1f;
Delay(1); //delay(100)=10msec, delay(10)=1msec
dat_row[5]=(rKEYIFROW&0x3f);
if(dat_row[5]!=0x3f)
{
dat_row[0]=0;
dat_row[1]=0;
dat_row[2]=0;
dat_row[3]=0;
dat_row[4]=0;
break;
}
rKEYIFCOL=0x2f;
Delay(1); //delay(100)=10msec, delay(10)=1msec
dat_row[4]=(rKEYIFROW&0x3f);
if(dat_row[4]!=0x3f)
{
dat_row[0]=0;
dat_row[1]=0;
dat_row[2]=0;
dat_row[3]=0;
dat_row[5]=0;
break;
}
rKEYIFCOL=0x37;
Delay(1); //delay(100)=10msec, delay(10)=1msec
dat_row[3]=(rKEYIFROW&0x3f);
if(dat_row[3]!=0x3f)
{
dat_row[0]=0;
dat_row[1]=0;
dat_row[2]=0;
dat_row[4]=0;
dat_row[5]=0;
break;
}
rKEYIFCOL=0x3b;
Delay(1); //delay(100)=10msec, delay(10)=1msec
dat_row[2]=(rKEYIFROW&0x3f);
if(dat_row[2]!=0x3f)
{
dat_row[0]=0;
dat_row[1]=0;
dat_row[4]=0;
dat_row[3]=0;
dat_row[5]=0;
break;
}
rKEYIFCOL=0x3e;
Delay(1); //delay(100)=10msec, delay(10)=1msec
dat_row[0]=(rKEYIFROW&0x3f);
if(dat_row[0]!=0x3f)
{
dat_row[4]=0;
dat_row[1]=0;
dat_row[2]=0;
dat_row[3]=0;
dat_row[5]=0;
break;
}
rKEYIFCOL=0x3d;
Delay(1); //delay(100)=10msec, delay(10)=1msec
dat_row[1]=(rKEYIFROW&0x3f);
if(dat_row[1]!=0x3f)
{
dat_row[0]=0;
dat_row[4]=0;
dat_row[2]=0;
dat_row[3]=0;
dat_row[5]=0;
break;
}
}
#endif
// printf("row0:%x,row1:%x,row2:%x,row3:%x,row4:%x,row5:%x\n",
//dat_row[0],dat_row[1],dat_row[2],dat_row[3],dat_row[4],dat_row[5]);
// rKEYIFSTSCLR=0x3; //Interrupt pending clear
#if 1
for(i=0;i<7;i++)
{
if(dat_row[i]==0x3e)
{
printf("%d\n",j);
}
else if(dat_row[i]==0x3d)
{
printf("%d\n",j+1);
}
else if(dat_row[i]==0x3b)
{
printf("%d\n",j+2);
}
else if(dat_row[i]==0x37)
{
printf("%d\n",j+3);
}
else if(dat_row[i]==0x2f)
{
printf("%d\n",j+4);
}
else if(dat_row[i]==0x1f)
{
printf("%d\n",j+5);
}
j=j+6;
}
#else
for(i=0;i<7;i++)
{
if(dat_row[i]==0x3e)
{
printf("%d\n",j);
}
if(dat_row[i]==0x3d)
{
printf("%d\n",j+1);
}
if(dat_row[i]==0x3b)
{
printf("%d\n",j+2);
}
if(dat_row[i]==0x37)
{
printf("%d\n",j+3);
}
if(dat_row[i]==0x2f)
{
printf("%d\n",j+4);
}
if(dat_row[i]==0x1f)
{
printf("%d\n",j+5);
}
j=j+6;
}
#endif
// Delay(1);
rKEYIFCOL=0x0;
rKEYIFCON=0x1;
//Delay(1);
ClearPending(BIT_KEYPAD); // Remove the pending bit
rINTMSK &= ~(BIT_KEYPAD);
rGPJDAT=0x1;
}
void Key_pad_Init(void)
{
rGPDCON=0xaaaaaa;
rGPDPU=0xfff;
printf("[KEY_PAD Test]\n");
printf("GPDCON=%x\n",rGPDCON);
// rKEYIFCON=(1<<3)|(1<<2)|(0x1);
printf("KEYIFCON=%x\n",rKEYIFCON);
//[0]:Falling edge, [1]:rising edge, [2]:Debouncing filter, [3]:10-bit counter enable, [5:4]:wakeup enable
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -