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

📄 key.c

📁 关于日本最著名的实时系统T-KERNEL的平台下的AD键盘实现源码
💻 C
字号:
/*""FILE COMMENT""*************************************************************
*       System Name : RENESAS T-Engine, micro T-Engine series
*       File Name   : key.c
*       Version     : 1.00.00
*       Contents    : Key switch
*       Model       : T-Engine/SH7727
*       CPU         : SH7727
*       Compiler    : GNU
*       OS          : T-Kernel
*       note        : The Software is being delivered to you "AS IS" 
*                   : and Renesas,whether explicitly or implicitly makes  
*                   : no warranty as to its Use or performance. 
*                   : RENESAS AND ITS SUPPLIER DO NOT AND CANNOT WARRANT 
*                   : THE PERFORMANCE OR RESULTS YOU MAY OBTAIN  BY USING 
*                   : THE SOFTWARE. AS TO ANY MATTER INCLUDING WITHOUT 
*                   : LIMITATION NONINFRINGEMENT OF THIRD PARTY RIGHTS,
*                   : MERCHANTABILITY, INTEGRATION, SATISFACTORY QUALITY, 
*                   : OR FITNESS FOR ANY PARTICULAR PURPOSE.
*
*       Copyright (c) 2006 RENESAS TECHNOLOGY CORP. All Rights Reserved.
*       AND RENESAS SOLUTIONS CORP. All Rights Reserved.
*       history   : 2006.07.28 ver1.00.00
*""FILE COMMENT END""*********************************************************/
#include <machine.h>
#include <tk/tkernel.h>
#include "key.h"
#include "sample_main.h"
#include <sys/svc/h8io_svc.h>

/* MessageBuffer ID */
LOCAL	ID	mbfid;

/* key code Table */
UH codetbl[11] = {sw1_1,sw1_2,sw1_3,sw1_4,sw1_5,0,0,0,sw3,0,sw2};

/* interrupt enable/disable flag */
BOOL	int_flg;

EXPORT ID	ks_init(void)
{
	T_CMBF	cmbf;

//	writeREG(KEYCR, 1, KEY_Cnt_STR | KEY_Cnt_ONI | KEY_Cnt_OFFI | KEY_Cnt_ARKEYI);
	writeREG(KEYCR, 1, KEY_Cnt_STR | KEY_Cnt_ONI | KEY_Cnt_OFFI);
	
	cmbf.exinf = NULL;
	cmbf.mbfatr = TA_TFIFO;
	cmbf.bufsz = DEF_BUFSZ;
	cmbf.maxmsz = DEF_MAXMSZ;
	
	mbfid = tk_cre_mbf (&cmbf);
	ks_ena_int();
	
	writeREG(KATIMER, 1, KS_100MS);	
	
	return	mbfid;
}

EXPORT UH	ks_get_key(void)
{
	UH	reg_keyptr;
	
	reg_keyptr = readREG(KBITPR, 2);

	return	reg_keyptr;
}

EXPORT ER	ks_chg_key(UH *onoff,UH *code,TMO tmout)
{
	ER	ercd;
	KeyEvt	keyevt;

	ercd = tk_rcv_mbf(mbfid, &keyevt, tmout);
	if(ercd > 0){
		*code = keyevt.code;
		*onoff = keyevt.h.evttyp;
		ercd = E_OK;
	}
	return	ercd;
}

EXPORT void	ks_ena_int(void)
{
	UINT	imask;
	
	DI(imask);
	int_flg = TRUE;
	EI(imask);
}

EXPORT void	ks_dis_int(void)
{
	UINT	imask;
	
	DI(imask);
	int_flg = FALSE;
	EI(imask);
}

EXPORT ER	ke_set_rtime(UB time)
{
	INT	i,cnt = 0;
	UB	timemsk = 0x01;
	
	if(time == 0)	return	E_PAR;
	
	for(i=0;i<8;i++){
		if(time & timemsk){
			cnt++;
			if(cnt>1)	return	E_PAR;
		}
		timemsk = timemsk << 1;
	}
	writeREG(KATIMER, 1, time);		/* set Auto Repeat Time  */
	
	return	E_OK;
}

EXPORT void	ks_inthdr(UINT dintno)
{
	INT	i;
	UH	keyptr, keyptr2;
	UH	bitmsk = 0x01;
	UB	reg_keysr;
	KeyEvt	evt;

	keyptr = ks_get_key();	/* get Key Pattern */
	if(int_flg){
		reg_keysr = readREG(KEYSR, 1);
		if(reg_keysr & 0x04){ /* OFF */
			if(last_keyptr == keyptr){
				evt.h.evttyp = TDE_KEYUP;
				tk_snd_mbf(mbfid, &evt, DEF_MAXMSZ,TMO_POL);
				keyptr = 0;
			}
		}
		else {
			keyptr2 = last_keyptr ^ keyptr;
			if(keyptr2){
				for(i=0; i<=10; i++){
					if(keyptr2 & bitmsk){
						if(!(last_keyptr & bitmsk)){	/* ON */
							evt.h.evttyp = TDE_KEYDOWN;
							evt.code = codetbl[i];
							tk_snd_mbf(mbfid, &evt, DEF_MAXMSZ,TMO_POL);
						}
					}
					bitmsk = bitmsk << 1;
				}
			}
		}
	}
	last_keyptr = keyptr;
	reg_keysr = readREG(KEYSR, 1);
	writeREG(KEYSR, 1, reg_keysr & 0xf1);
}

⌨️ 快捷键说明

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