keyboard.c

来自「博创2410的实验代码」· C语言 代码 · 共 164 行

C
164
字号
/***************************************************************************\
	Copyright (c) 2004-2007 threewater@up-tech.com, All rights reserved.
	by threewter	2004.4.26
\***************************************************************************/
	

/***************************************************************************\
    #说明: 键盘驱动
	----------------------------------  Bug  --------------------------------------

	----------------------------------  TODO list  --------------------------------------

	----------------------------------修正--------------------------------------
	2004-5-9	创建

\***************************************************************************/
#include "../inc/reg2410.h"

#include "../inc/lib.h"
#include "../inc/macro.h"
#include "../inc/isr.h"
#include "../inc/KeyBoard.h"
#include "../inc/iic.h"
//#include "../inc/Uart.h"
#include "inc/lcd.h"
#include <stdio.h>
#include <string.h>



#define KBDTYPE_ZLG7290	1
#define KBDTYPE_MCUIIC		2
#define KEYBOARD_TYPE		KBDTYPE_MCUIIC
#define KEY_DOWN			(1ul<<31)


static void KeyMap_init(void);



#include "../inc/i2c-tomega8.h"

#define IRQ_KBD		IRQ_IIC
//#define MCU_IICCON		(IICCON_ACKEN |IICCON_CLK512 | IICCON_INTR | IICCON_CLKPRE(0x3))
#define MCU_IICCON		(IICCON_ACKEN  | IICCON_INTR | IICCON_CLKPRE(7))

static unsigned short KeyBoard_Map[256];
 unsigned short mcukey,mcukey1;

typedef struct{
	unsigned short keyraw;
	unsigned short map2;
}KeyBoard_Map2;



static KeyBoard_Map2 KeyBoard_MapArray[]={{0x2, 'N'},{0xa, '/'},{0x12, '*'},{0x11, '-'},
		{0x5, '7'},{0xd, '8'},{0x15, '9'},{0x6, '4'},{0xe, '5'},{0x16, '6'},{0x1d, '+'},
		{0x7, '1'},{0xf, '2'},{0x17, '3'},{0x1f, '\r'},{0x10, '0'},{0x18, '.'},};//


static void Key_ISR(int vector, void* data)
{  
   
	static int framecnt=0;
	U8 status ,kdata;
	status = rIICSTAT ;
    //printk("enter key_ISR");
	if( (status & IICSTAT_MODE_MSK) != IICSTAT_MODE_SR)
		return;
	//must slave receive mode

	kdata = rIICDS;

	switch(framecnt){
	case 0:
		if(status & IICSTAT_SLAVEADDR){
			//match the own slave address. begin to slave receive data.
			//DPRINTK("key irq: 111\n");
			framecnt++;
		}
		break;
	case 1:
		if(GetI2C_Devtype(kdata) != DTYPE_MKEYB){
			//DPRINTK("key irq: not key farme\n");
			framecnt=0;
		}
		framecnt++;
		break;
	case 2:
		mcukey = kdata;
		if(mcukey&0x80){
		  framecnt=0;
		   break;
		}
		else
		{mcukey1=mcukey;
		 //Uart_Printf(0,"\nmcukey is %x",mcukey);	
		 //LCD_printf("the key is %x ",mcukey);
		 framecnt=0;
		 break;
		}
		
	}

	rIICCON &= ~IICCON_INTPEND;
	
}

void Key_init(void)
{
//	INT8U err;
	I2C_control i2c_ctrl;

	
	IIC_init();
	Set_IIC_mode(MCU_IICCON, NULL);

	//set owner i2c address to mega8
	i2c_ctrl.cmd=CMD_MST_ADDR;
	i2c_ctrl.ctrl=I2COWNER_ADDRESS;
	IIC_Send(MEGA8_I2CADDRESS, (const char*)&i2c_ctrl, sizeof(i2c_ctrl));

	//enable keyboard
	i2c_ctrl.cmd=CMD_CTRL;
	i2c_ctrl.ctrl = CTRL_MKEn;
	IIC_Send(MEGA8_I2CADDRESS, (const char*)&i2c_ctrl, sizeof(i2c_ctrl));
	SetISR_Interrupt(IRQ_KBD, Key_ISR, NULL);
 
}

//读取键盘按键扫描码,如果没有按键,则返回-1
//参数: ndev,设备号,isBlock是否阻塞
int KeyBoard_Read(int ndev, BOOL isBlock)
{   
	//if(mcukey&0x80){
		//key down
		//return KeyBoard_Map[mcukey&0x7f]|KEY_DOWN;
		//return mcukey;
	//}

	//return KeyBoard_Map[mcukey&0x7f];
	return mcukey;
	//}
}




//initializition map board map table
static void KeyMap_init(void)
{
	int i;

	memset(KeyBoard_Map, -1, sizeof(KeyBoard_Map));

	for(i=0; i<NumberOfArray(KeyBoard_MapArray); i++){
		KeyBoard_Map[KeyBoard_MapArray[i].keyraw]=KeyBoard_MapArray[i].map2;
	}
}



⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?