drv_key.c

来自「s1d13716的源码 windiws ce 或8位单片机」· C语言 代码 · 共 92 行

C
92
字号
/********************************************************************************************************
 *													
 *	Copyright (C) SEIKO EPSON CORP. 2002
 *
 *	File name: Drv_key.c
 *	  This is key matrix driver for Star.
 *
 *
 *	Revision history
 *		2002.05.30	Andrew Yin	Start.
 *
 *******************************************************************************************************/

#include "io.h"
#include "int.h"
#include "key.h"

void vInitKey( void );
void vIntKey( void );
void vEnableKey0Int(void);
void vDisableKey0Int(void);

unsigned char rucK5PortData;
unsigned char gucKeyCode;

void vInitKey( void )
{
	//[0x402c0] set K50, K51,K52,K53,K54=KEYI0,KEYI1,KEYI2,KEYI3 KEYI4
	*(volatile unsigned char *)IN_CFK5_ADDR &= 0xe0;	// select K5 function: K50, K51,K52,K53,K54
	//[0x402c9]
	*(volatile unsigned char *)IN_SEP_ADDR &= 0xe0;
	//[0x402ca]
	*(volatile unsigned char *)IN_SPPK_ADDR &= 0x0fc;	//set FPK0 interrupt input port K5
	//[0x402cc]
	*(volatile unsigned char *)IN_SCPK0_ADDR |= 0x1F;	//set K50-K54 input comparison register 0 
	//[0x402ce]
	*(volatile unsigned char *)IN_SMPK0_ADDR |= 0x1F;	//set K50-K54 interrupt mask enable
	//[0x40262]
	*(volatile unsigned char *)INT_PK0_PK1_ADDR &= 0x0f0;
	*(volatile unsigned char *)INT_PK0_PK1_ADDR |= INT_PRIL_LVL4;	//set Key input0 interruput level 4
	//[0x40280]
	*(volatile unsigned char *)INT_FP0_FK_ADDR |= 0x10;		// reset Key input0 interrupt flag
	//[0x40270]
	*(volatile unsigned char *)INT_EP0_EK_ADDR |= 0x10;		// enable Key input0 interrupt
}

void vIntKey( void )
{
	asm("pushn	%r15");			// save r1,r2...r15
	asm("ld.w	%r9,%psr");		// EI,enable interrupt 
	asm("or 	%r9,0x10");
	asm("ld.w	%psr,%r9");
  
	rucK5PortData = *(volatile unsigned char *)IN_K5D_ADDR & 0x1F;	// [0x402c1]
   	switch( rucK5PortData )
 	{
 		case 0x1E:
 			gucKeyCode = OKKEY;	//K50
 			break;
 		case 0x1D:
 			gucKeyCode = LEFTKEY;	//K51
 			break;
 		case 0x1B:
 			gucKeyCode = DOWNKEY;	//K52
 			break;
 		case 0x17:
 			gucKeyCode = UPKEY;	//K53
 			break;
 		case 0x0F:
 			gucKeyCode = RIGHTKEY;	//K54
 			break;
 		default:
 			gucKeyCode = NULLKEY;
 	}

 	//[0x40280]
	*(volatile unsigned char *)INT_FP0_FK_ADDR |= 0x10;		// reset Key input0 interrupt flag

	asm("popn	%r15");			// restore r1,r2...r15
	asm("reti");
}

void vEnableKey0Int()
{
	*(volatile unsigned char *)INT_FP0_FK_ADDR |= 0x10;
	*(volatile unsigned char *)INT_EP0_EK_ADDR |= 0x10;	
}

void vDisableKey0Int()
{
	*(volatile unsigned char *)INT_EP0_EK_ADDR &= 0xEF;		
}

⌨️ 快捷键说明

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