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

📄 drv_kpp.c

📁 基于Freescale的MX21处理器的bootloader程序
💻 C
字号:
/*-------------------------------------------------------------------
FILE NAME:
	drv_kpp.c
DESCRIPTION:
	this file includes keyboard driver. 
AUTHOR:
	WYF
VERSION:
	2005.1122.00
COMPANY:
	DATANG MICROELECTRONICS TECHNOLOGY CO,.LTD
HISTORY:
	2005.1122 Creat this file
	...
--------------------------------------------------------------------*/
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include "nucleus.h"
#include "ADSmx21_defs.h"
#include "drv_defs.h"
#include "drv_extr.h"

static TDRV_KPP kpp;

static void kb_TIMER(UNSIGNED id)
{
	STATUS s;
	static unsigned short col_idx = 0;
	unsigned char col, row;
	unsigned short i, key, key_v;

	if (col_idx > 0){
		row = ~(KPDR_ROW);
		if (row){
			key = KPDR;
			col_idx = 0;
			KPDR_COL = 0;
			i = 0x000c;
			KPSR |= i;
			i = (1<<9);  /* Enable release interrupt */
			KPSR |= i;
			key_v = ~key;
			kpp.key = key_v;
			kpp.status = 1;
			if (kpp.cb){
				(kpp.cb)(0,key_v);
			}
			return;
		}
	}	
	col = ~(1<<col_idx);
	KPDR_COL = col;

	col_idx ++;
	if (col_idx <= 6){
		s = NU_Reset_Timer(&(kpp.timer), kb_TIMER, 2, 0, NU_ENABLE_TIMER);
		assert(s == NU_SUCCESS);
	}
	else{
		col_idx = 0;
		KPDR_COL = 0;
		i = 0x000c;
		KPSR |= i;
		i = (1<<8);
		KPSR |= i;
	}
}

static void kpp_LISR(INT vector)
{
	STATUS s = 0xFFFFFFFF;
	short i;

	i = (1<<8)|(1<<9);
	KPSR &= (~i);   /* Disable press & release interrupt */
	
	s = NU_Activate_HISR(&(kpp.hisr));
	assert(s == NU_SUCCESS);
}

static void kpp_HISR(void)
{
	unsigned short i;
	
	if (kpp.status){
		KPDR_COL = 0;
		i = 0x000c;
		KPSR |= i;
		i = (1<<8);
		KPSR |= i;
		kpp.status = 0;
		if (kpp.cb){
			(kpp.cb)(1,kpp.key);
		}
	}
	else {
		KPDR_COL = 0x3f;
		KPCR_COL = 0;  /* Switch column to totem pole output */
		i = 0x3f;
		KPCR_COL = i;  /* Switch column back open-drain output */

		kb_TIMER(0);
	}
}

void keypad_init(void (*cb)(int,int))
{
	unsigned short i;
	STATUS s;
	void (*old)(int);

	kpp.cb = cb;
	kpp.status = 0;

	PCCR1 |= (1<<30);   /* Enable KPP_EN */

	KPCR_ROW = 0x3f;    /* ROW: 6 */
	KPDR_COL = 0;       /* Clear column out */
	KPCR_COL = 0x3f;    /* Column(6) as open-drain */
	KDDR_ROW = 0;       /* Row: input */
	KDDR_COL = 0x3f;    /* Column: output */
	KPSR = 0;
	i = 0x000c;
	KPSR |= i;
	i = (1<<8)|(1<<10); /* Enable Press interrupt */
	KPSR |= i;
	
	s = NU_Register_LISR(21, kpp_LISR, &old);
	assert(s == NU_SUCCESS);
	s = NU_Create_HISR(&(kpp.hisr), "kpp", kpp_HISR, 2, kpp.stack, 1024);
	assert(s == NU_SUCCESS);
	memset(&(kpp.timer),0,sizeof(NU_TIMER));
	s = NU_Create_Timer(&(kpp.timer), "kpp", kb_TIMER, 1, 2, 2, NU_DISABLE_TIMER);
	assert(s == NU_SUCCESS);

	INTENNUM = 21;      /* Enable KPP interrupt */
}


void keypad_register(void (*cb)(int,int))
{
	kpp.cb = cb;
}

void keypad_unregister(void)
{
	kpp.cb = NULL;
}

⌨️ 快捷键说明

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