⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyboard.c

📁 北京航空航天大学2006年嵌入式系统课件及试验.适合嵌入式初级学者!
💻 C
字号:
/***************************************************************************\
	Copyright (c) 2004-2007 threewater@up-tech.com, All rights reserved.
	by threewter	2004.4.26
\***************************************************************************/
	

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

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

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

\***************************************************************************/
//#include "includes.h"

#include "../inc/reg2410.h"
//#include "../inc/zlg7290.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 "../src/miniGUI/uhal/ucos2input.h"
#include <stdio.h>
#include <string.h>

//#undef DPRINTK

//#undef DEBUG
//#define DEBUG
//#ifdef DEBUG
//#define DPRINTK			printf
//#else
//#define DPRINTK			printfNULL
//#endif

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

//#if OS_KeyBoard_Scan_Task==1

/*static OS_STK Key_Scan_Stack[STACKSIZE]={0, };   //Key_Test_Task堆栈
static void Key_Scan_Task(void *Id);             //键盘扫描任务
#define Key_Scan_Task_Prio      10*/

static void KeyMap_init(void);

//OS_FLAG_GRP *Input_Flag=NULL;

//#if KEYBOARD_TYPE==KBDTYPE_ZLG7290

//#define IRQ_KBD		IRQ_EINT4

/*typedef struct{
	unsigned char key;
	unsigned char RepeatCnt;
	unsigned char Funckey;
}Zlg7290Key;*/

/*static unsigned short KeyBoard_Map[64] ;

typedef struct{
	unsigned short int keyraw;
	unsigned short int map2;
}KeyBoard_Map2;*/

//#if USE_MINIGUI==1
//#include <miniGUI/common.h>
/*static KeyBoard_Map2 KeyBoard_MapArray[]={{17, SCANCODE_NUMLOCK},
		{21, SCANCODE_KEYPADDIVIDE},{19, SCANCODE_KEYPADMULTIPLY},
		{11, SCANCODE_KEYPADMINUS},{49, SCANCODE_KEYPAD7},{53, SCANCODE_KEYPAD8},
		{51, SCANCODE_KEYPAD9},{41, SCANCODE_KEYPAD4},{45, SCANCODE_KEYPAD5},
		{43, SCANCODE_KEYPAD6},{52, SCANCODE_KEYPADPLUS},{33, SCANCODE_KEYPAD1},
		{37, SCANCODE_KEYPAD2},{35, SCANCODE_KEYPAD3},{36, SCANCODE_KEYPADENTER},
		{29, SCANCODE_KEYPAD0},{27, SCANCODE_KEYPADPERIOD},};
#else*/

//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, '.'},};

//#endif //#if USE_MINIGUI==1

/*static void Key_ISR(int vector, void* data)
{
	INT8U err;
	OSFlagPost(Input_Flag, UCOS2_KBINPUT, OS_FLAG_SET, &err);
}*/

/*void Key_init(void)
{
	//INT8U err;
	int ret;

	//KeyMap_init();

	IIC_init();
	//set_external_irq(IRQ_KBD, EXT_FALLING_EDGE, GPIO_PULLUP_EN);
	
	Set_IIC_mode(ZLG7289_IICCON, NULL);
	ret=IIC_Read(ZLG7290_ADDR, 0);

	DPRINTK("zlg7290 system register=0x%x\n", ret);*/

	//if(!Input_Flag)
	//	Input_Flag=OSFlagCreate(0, &err);

	//SetISR_Interrupt(IRQ_KBD, Key_ISR, NULL);

//#if USE_MINIGUI==0
//	OSTaskCreate(Key_Scan_Task,  (void *)0,  (OS_STK *)&Key_Scan_Stack[STACKSIZE-1],  Key_Scan_Task_Prio);
//#endif
//}

//读取键盘按键扫描码,如果没有按键,则返回-1
//参数: ndev,设备号,isBlock是否阻塞
/*int KeyBoard_Read(int ndev, BOOL isBlock)
{
	Zlg7290Key key;
	static unsigned char lastkey=0;

	IIC_ReadSerial(ZLG7290_ADDR, 1, (unsigned char*)&key, 3);

	if(key.RepeatCnt==0 && key.Funckey!=0xff)
		return -1;
	if(key.key>=NumberOfArray(KeyBoard_Map))
		return -1;

	DPRINTK("key=0x%x, repeat=%d, func=0x%x\n", key.key, key.RepeatCnt, key.Funckey);

	if(key.key!=0){
		lastkey=KeyBoard_Map[key.key];
		return lastkey|KEY_DOWN;
	}

	return lastkey;
}*/

//#elif KEYBOARD_TYPE==KBDTYPE_MCUIIC

#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];
static unsigned short mcukey;

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

//#if USE_MINIGUI==1
//#include <miniGUI/common.h>
//static KeyBoard_Map2 KeyBoard_MapArray[]={{0x2, SCANCODE_NUMLOCK},
/*		{0xa, SCANCODE_KEYPADDIVIDE},{0x12, SCANCODE_KEYPADMULTIPLY},
		{0x11, SCANCODE_KEYPADMINUS},{0x5, SCANCODE_KEYPAD7},{0xd, SCANCODE_KEYPAD8},
		{0x15, SCANCODE_KEYPAD9},{0x6, SCANCODE_KEYPAD4},{0xe, SCANCODE_KEYPAD5},
		{0x16, SCANCODE_KEYPAD6},{0x1d, SCANCODE_KEYPADPLUS},{0x7, SCANCODE_KEYPAD1},
		{0xf, SCANCODE_KEYPAD2},{0x17, SCANCODE_KEYPAD3},{0x1f, SCANCODE_KEYPADENTER},
		{0x10, SCANCODE_KEYPAD0},{0x18, SCANCODE_KEYPADPERIOD},};
#else*/

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, '.'},};//

//#endif //#if USE_MINIGUI==1

static void Key_ISR(int vector, void* data)
{  
   
	static int framecnt=0;
//	INT8U err;
//    int key;
	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)
		//key=KeyBoard_Read(0,FALSE);
		{framecnt=0;
		break;}
		else
		//LCD_Cls();
		//{
		Uart_Printf(0,"\nmcukey is %x",mcukey);
		
		LCD_printf("the key is %x ",mcukey);
		//}
		//DPRINTK("key irq: key=0x%x\n", mcukey);
//		OSFlagPost(Input_Flag, UCOS2_KBINPUT, OS_FLAG_SET, &err);
        //Uart_SendByten(0,(U8)mcukey);
		framecnt=0;
		break;
		
		
	}

	rIICCON &= ~IICCON_INTPEND;
	
}

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

	//KeyMap_init();

	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));

//	err = IIC_Read(MEGA8_I2CADDRESS, CMD_MST_ADDR);
//	printf("master address=0x%x\n", err);
//	err = IIC_Read(MEGA8_I2CADDRESS, CMD_CTRL);
//	printf("ctrl=0x%x\n", err);

//	if(!Input_Flag)
//		Input_Flag=OSFlagCreate(0, &err);
    //INTS_OFF();
	SetISR_Interrupt(IRQ_KBD, Key_ISR, NULL);
    //INTS_ON();
//#if USE_MINIGUI==0
//	OSTaskCreate(Key_Scan_Task,  (void *)0,  (OS_STK *)&Key_Scan_Stack[STACKSIZE-1],  Key_Scan_Task_Prio);
//#endif
}

//读取键盘按键扫描码,如果没有按键,则返回-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;
	//}
}

//#else

//#error "no keyboard support!"
//#endif



//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;
	}
}

/*#if USE_MINIGUI==0
static void Key_Scan_Task(void *Id)
{
	U32 key;
	INT8U err;
	POSMSG pmsg;

	printk("begin key task \n");

	for (;;){
		OS_FLAGS flag;

		flag=OSFlagPend(Input_Flag, UCOS2_KBINPUT, OS_FLAG_WAIT_SET_ANY, 0, &err);
		OSFlagPost(Input_Flag, flag, OS_FLAG_CLR, &err);
		key=KeyBoard_Read(0,FALSE);
		if(key==-1)
			continue;

		pmsg=OSCreateMessage(NULL, OSM_KEY,key,0);
		if(pmsg)
			SendMessage(pmsg);
	}
}
#endif*/

//#endif	//#if OS_KeyBoard_Scan_Task==1

⌨️ 快捷键说明

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