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 + -
显示快捷键?