mirror of
https://github.com/sachikoxz12/Taiko-Input.git
synced 2025-02-26 14:31:43 +01:00
253 lines
4.4 KiB
C
253 lines
4.4 KiB
C
|
#include "GPIO.h"
|
|||
|
|
|||
|
#define GPIO_STA_FLOAT 0x0
|
|||
|
#define GPIO_STA_PP 0x1
|
|||
|
#define GPIO_STA_OD 0x2
|
|||
|
#define GPIO_STA_DEF 0x3
|
|||
|
|
|||
|
void GPIO_SET(UINT8 Port, UINT8 IO, UINT8 STA){
|
|||
|
if(IO > 7)return;
|
|||
|
|
|||
|
if(Port == 1){
|
|||
|
if(STA & 0x1)
|
|||
|
P1_DIR_PU |= 1<<IO;
|
|||
|
else
|
|||
|
P1_DIR_PU &= ~(1<<IO);
|
|||
|
|
|||
|
if(STA & 0x2)
|
|||
|
P1_MOD_OC |= 1<<IO;
|
|||
|
else
|
|||
|
P1_MOD_OC &= ~(1<<IO);
|
|||
|
}
|
|||
|
|
|||
|
if(Port == 3){
|
|||
|
if(STA & 0x1)
|
|||
|
P3_DIR_PU |= 1<<IO;
|
|||
|
else
|
|||
|
P3_DIR_PU &= ~(1<<IO);
|
|||
|
|
|||
|
if(STA & 0x2)
|
|||
|
P3_MOD_OC |= 1<<IO;
|
|||
|
else
|
|||
|
P3_MOD_OC &= ~(1<<IO);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void InitIO(void){
|
|||
|
|
|||
|
GPIO_SET(3,2,GPIO_STA_FLOAT);
|
|||
|
GPIO_SET(1,4,GPIO_STA_FLOAT);
|
|||
|
GPIO_SET(1,5,GPIO_STA_FLOAT);
|
|||
|
GPIO_SET(1,6,GPIO_STA_FLOAT);
|
|||
|
|
|||
|
IN1 = IN2 = IN3 = IN4 = 0;
|
|||
|
|
|||
|
GPIO_SET(1,3,GPIO_STA_PP);
|
|||
|
|
|||
|
LED_USB = 0;
|
|||
|
|
|||
|
GPIO_SET(1,1,GPIO_STA_DEF);
|
|||
|
GPIO_SET(3,3,GPIO_STA_DEF);
|
|||
|
GPIO_SET(3,4,GPIO_STA_DEF);
|
|||
|
GPIO_SET(3,5,GPIO_STA_DEF);
|
|||
|
|
|||
|
KEY1 = KEY2 = KEY3 = KEY4 = 1;
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
UINT8 READ_KEY(UINT8 ID){
|
|||
|
switch(ID){
|
|||
|
// case 0:return (!IN1);
|
|||
|
// case 1:return (!IN2);
|
|||
|
// case 2:return (!IN3);
|
|||
|
// case 3:return (!IN4);
|
|||
|
case 0:return (IN1);
|
|||
|
case 1:return (IN2);
|
|||
|
case 2:return (IN3);
|
|||
|
case 3:return (IN4);
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
UINT8 READ_KEY2(UINT8 ID){
|
|||
|
switch(ID){
|
|||
|
case 0:return (!KEY1);
|
|||
|
case 1:return (!KEY2);
|
|||
|
case 2:return (!KEY3);
|
|||
|
case 3:return (!KEY4);
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
extern UINT8 IO_ErrFlag;
|
|||
|
|
|||
|
#define HAND_TIME 2000
|
|||
|
#define ERROR_TIME 20000
|
|||
|
#define FILTER_TIME 2
|
|||
|
|
|||
|
UINT16 ReadIO(void){
|
|||
|
|
|||
|
static UINT16 IO_COUNT[4] = {0};
|
|||
|
static UINT16 IO_COUNT_FILTER_UP[4] = {0};
|
|||
|
static UINT16 IO_COUNT_FILTER_DN[4] = {0};
|
|||
|
static UINT16 IODATA = 0;
|
|||
|
UINT8 i;
|
|||
|
|
|||
|
for(i=0;i<4;i++){
|
|||
|
if(READ_KEY(i)){
|
|||
|
IO_COUNT_FILTER_DN[i] = 0;
|
|||
|
if(IO_COUNT_FILTER_UP[i] < FILTER_TIME)IO_COUNT_FILTER_UP[i]++;
|
|||
|
if(IO_COUNT[i] < ERROR_TIME)IO_COUNT[i]++;
|
|||
|
|
|||
|
if(IO_COUNT_FILTER_UP[i] >= FILTER_TIME){
|
|||
|
IODATA |= 0x01<<i;
|
|||
|
}
|
|||
|
if(IO_COUNT[i] >= HAND_TIME){
|
|||
|
IODATA &= ~(0x01<<i);
|
|||
|
}
|
|||
|
if(IO_COUNT[i] >= ERROR_TIME){
|
|||
|
IO_ErrFlag |= 0x01<<i;
|
|||
|
}
|
|||
|
}
|
|||
|
else{
|
|||
|
IO_COUNT_FILTER_UP[i] = 0;
|
|||
|
if(IO_COUNT_FILTER_DN[i] < FILTER_TIME)IO_COUNT_FILTER_DN[i]++;
|
|||
|
|
|||
|
if(IO_COUNT_FILTER_DN[i] >= FILTER_TIME){
|
|||
|
IODATA &= ~(0x01<<i);
|
|||
|
IO_ErrFlag &= ~(0x01<<i);
|
|||
|
IO_COUNT[i] = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
IODATA &= 0xFF;
|
|||
|
IODATA |= ReadIOSlow()<<8;
|
|||
|
|
|||
|
return IODATA;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#define HAND_TIME2 6000
|
|||
|
#define FILTER_TIME2 10
|
|||
|
|
|||
|
#define LONG_PRESS_TIME 2000
|
|||
|
|
|||
|
#define TRIGGER_TIME (150 * 13 / 5)
|
|||
|
|
|||
|
UINT8 ReadIOSlow(void){
|
|||
|
|
|||
|
static UINT16 IO_COUNT_FILTER_UP[4] = {0};
|
|||
|
static UINT16 IO_COUNT_FILTER_DN[4] = {0};
|
|||
|
static UINT8 IODATA = 0;
|
|||
|
static UINT8 IODATA_bak = 0;
|
|||
|
static KeyOut = 0;
|
|||
|
static UINT16 IODATA_count = 0;
|
|||
|
UINT8 i;
|
|||
|
|
|||
|
UINT8C kEYtABLE[0x10] = {
|
|||
|
// # | 1 | 2 | 3 | 4
|
|||
|
0x00,
|
|||
|
0x01,
|
|||
|
0x02,
|
|||
|
0x11,
|
|||
|
0x03,
|
|||
|
0x00,
|
|||
|
0x12,
|
|||
|
0x21,
|
|||
|
0x04,
|
|||
|
0x1F,
|
|||
|
0x00,
|
|||
|
0x00,
|
|||
|
0x13,
|
|||
|
0x00,
|
|||
|
0x21,
|
|||
|
0x31,
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
for(i=0;i<4;i++){
|
|||
|
if(READ_KEY2(i)){
|
|||
|
IO_COUNT_FILTER_DN[i] = 0;
|
|||
|
if(IO_COUNT_FILTER_UP[i] < FILTER_TIME2)IO_COUNT_FILTER_UP[i]++;
|
|||
|
|
|||
|
if(IO_COUNT_FILTER_UP[i] >= FILTER_TIME2){
|
|||
|
IODATA |= 0x01<<i;
|
|||
|
}
|
|||
|
}
|
|||
|
else{
|
|||
|
IO_COUNT_FILTER_UP[i] = 0;
|
|||
|
if(IO_COUNT_FILTER_DN[i] < FILTER_TIME2)IO_COUNT_FILTER_DN[i]++;
|
|||
|
|
|||
|
if(IO_COUNT_FILTER_DN[i] >= FILTER_TIME2){
|
|||
|
IODATA &= ~(0x01<<i);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if(IODATA){
|
|||
|
IODATA_count++;
|
|||
|
}
|
|||
|
else{
|
|||
|
IODATA_count = 0;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// if(KeyOut){
|
|||
|
// //<2F><>ǰ<EFBFBD>а<EFBFBD><D0B0><EFBFBD>
|
|||
|
// if(IODATA == 0){
|
|||
|
// KeyOut = 0;
|
|||
|
// }
|
|||
|
// }
|
|||
|
// else{
|
|||
|
// if(IODATA_bak && IODATA == 0){
|
|||
|
// //<2F><><EFBFBD>²<EFBFBD><C2B2><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// if(IODATA_bak == 1)KeyOut = 1;
|
|||
|
// else if(IODATA_bak == 2)KeyOut = 2;
|
|||
|
// else if(IODATA_bak == 4)KeyOut = 3;
|
|||
|
// else if(IODATA_bak == 8)KeyOut = 4;
|
|||
|
// else KeyOut = 0xFF;
|
|||
|
// }
|
|||
|
// else if(IODATA && IODATA_count > LONG_PRESS_TIME){
|
|||
|
// //<2F><><EFBFBD><EFBFBD>
|
|||
|
// if(IODATA == 1)KeyOut = 0x81;
|
|||
|
// else if(IODATA == 2)KeyOut = 0x82;
|
|||
|
// else if(IODATA == 4)KeyOut = 0x83;
|
|||
|
// else if(IODATA == 8)KeyOut = 0x84;
|
|||
|
// else KeyOut = 0xFF;
|
|||
|
// }
|
|||
|
// else if(IODATA == 0x03){
|
|||
|
// KeyOut = 0x05;
|
|||
|
// }
|
|||
|
// else if(IODATA == 0x0C){
|
|||
|
// KeyOut = 0x06;
|
|||
|
// }
|
|||
|
// }
|
|||
|
|
|||
|
if(KeyOut){
|
|||
|
//<2F><>ǰ<EFBFBD>а<EFBFBD><D0B0><EFBFBD>
|
|||
|
if(IODATA == 0){
|
|||
|
KeyOut = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
else{
|
|||
|
if(IODATA != 0 && IODATA_count >= TRIGGER_TIME){
|
|||
|
KeyOut = kEYtABLE[IODATA];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
IODATA_bak = IODATA;
|
|||
|
|
|||
|
return KeyOut;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|