📄 2410keypad.c
字号:
#include "def.h"
#include "option.h"
#include "2410addr.h"
#include "2410lib.h"
#include "2410slib.h"
#include "2410keypad.h"
void __irq KeyPad_Int(void); //also Eint1 int
int KeyPadInit(void);
/****************************************************************
* OURS2410EDU KEYPAD configuration *
* KEYPAD CHIP UR5HCSPI *
* GPB6=/CS, GPG7 =SPIMISO0, GPE12=SPIMOSI0, GPE13=SPICLK0 *
* GPB6 =/CS, GPG5 =SPIMISO1, GPG6 =SPIMOSI1, GPG7 =SPICLK1 *
* GPB0 =DIO DIRECTION 0:MOSI→DIO 1: DIO→MISO *
****************************************************************/
#define ONEBIT 0x1
#define KEYPADCSDIS (rGPBDAT |=(ONEBIT << 6))
#define KEYPADCSEN (rGPBDAT &=~(ONEBIT << 6))
#define KEYPADDIRMO (rGPBDAT &=~(ONEBIT << 0))
#define KEYPADDIRMI (rGPBDAT |=(ONEBIT << 0))
void Delay30us(void)
{
unsigned int i;
for (i=0;i<0x4ff;i++);
}
void Delay60us(void)
{
unsigned int i;
for (i=0;i<0x9ff;i++);
}
int putcToKBCTL(U8 c)
{
U32 i;
KEYPADCSEN;
KEYPADDIRMO;
Delay60us();
while((rSPSTA1 & ONEBIT)==0); // wait while busy
rSPTDAT1 = c; // write left justified data
while((rSPSTA1 & ONEBIT)==0); // wait while busy
KEYPADCSDIS;
i = rSPRDAT1;
return(i);
}
U8 readKBValue(void)
{
unsigned char i;
KEYPADCSEN;
KEYPADDIRMO;
Delay60us();
while((rSPSTA1 & ONEBIT)==0); // wait while busy
rSPTDAT1 = 0x15; // write read key value command
while((rSPSTA1 & ONEBIT)==0); // wait while busy
Delay30us();//delay 30us
KEYPADDIRMI;
rSPTDAT1 = 0xff; // write read key value command
while((rSPSTA1 & ONEBIT)==0); // wait while busy
i = rSPRDAT1;
KEYPADCSDIS;
KEYPADDIRMO;
return(i);
}
int KeyPadInit()
{
int t;
char dummy = (char)0xff;
// Setup IO port for SPI interface & Keyboard
// Setup EINT1 (KBDINT)
rGPFCON &= ~(0x3 << 2); // Clear GPF1
rGPFCON |= (0x2 << 2); // Set GPF1 to EINT1 for Keyboard interrupt
rEXTINT0 &= ~(0x7 << 4); // Clear EINT1
rEXTINT0 |= (0x2 << 4); // fallig edge triggered for EINT1
// setup SPI interface
// GPG5 : SPIMISO (KBDSPIMISO)
// GPG6 : SPIMOSI (KBDSPIMOSI)
// GPG7 : SPICLK (KBDSPICLK)
rGPGCON &= ~((0x3 << 10) | (0x3 << 12) | (0x3 << 14)); // Clear GPG5,6,7
rGPGCON |= ((0x3 << 10) | (0x3 << 12) | (0x3 << 14));
// setup _SS signal(nSS_KBD)
rGPBCON &= ~(0x3 << 12); // Clear GPB6
rGPBCON |= (ONEBIT << 12); // Set Port GPB6 to output for nSS signal
KEYPADCSDIS; // Set /SS high
// setup Dir signal (KEYBOARD) CPU->7289
rGPBCON &= ~(0x3 << 0); // Clear GPB0
rGPBCON |= (ONEBIT << 0); // Set Port GPB0 to output for _PWR_OK signal
// rGPDDAT &=~(ONEBIT << 0); // set _PWR_OK to 0
KEYPADDIRMO;
// Setup SPI registers
// Interrupt mode, prescaler enable, master mode, active high clock, format B, normal mode
// rSPCON1 = (ONEBIT<<5)|(ONEBIT<<4)|(ONEBIT<<3)|(0x0<<2)|(ONEBIT<<1);
// Poll mode, prescaler enable, master mode, active high clock, format A, normal mode
rSPCON1 = (0<<5)|(ONEBIT<<4)|(ONEBIT<<3)|(0x0<<2)|(0<<1);
// Developer MUST change the value of prescaler properly whenever value of PCLK is changed.
rSPPRE1 = 255; // 99.121K = 203M/4/2/(255+1) PCLK=50.75Mhz FCLK=203Mhz SPICLK=99.121Khz
putcToKBCTL(0xa4); //send init command
Uart_Printf("Key Pad Init complete:\n");
rSRCPND = BIT_EINT1; //to clear the previous pending states
rINTPND = BIT_EINT1;
//Define the keypad int entry
pISR_EINT1 = (unsigned)KeyPad_Int;
rINTMSK=~(BIT_EINT1); //enable Eint
return(TRUE);
}
void __irq KeyPad_Int(void)
{
U8 ui8ScanCode;
ui8ScanCode=readKBValue();
Uart_Printf("中断产生 key %d pressed!\n",ui8ScanCode);
rSRCPND = BIT_EINT1; //to clear the previous pending states
rINTPND = BIT_EINT1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -