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

📄 drvkeybrd.c

📁 本人编写的无线电话程序,给予PIC18C801设计,包括了uCOS的移植以及菜单,自己设计的拼音注入法,完整地一级汉字库,希望对大家有所帮助
💻 C
字号:
/**************************************************************
 *                  KeyBoard & Hook device driver					  *
 **************************************************************/

#include "includes.h"
#include "hardware.h"
#include "device.h"
#include "funcint.h"
#include "event.h"
//#include "feeprom.h"
//#include "fi2c.h"

#define PINPUT	1
#define POUTPUT	0

#define KSI0	LATHbits.LATH4
#define KSI1	LATFbits.LATF2
#define KSI2	LATFbits.LATF6
#define KSI3	LATFbits.LATF7
#define KSI4	LATAbits.LATA1

#define KSO0	PORTFbits.RF0
#define KSO1	PORTFbits.RF1
#define KSO2	PORTHbits.RH7
#define KSO3	PORTHbits.RH6
#define KSO4	PORTHbits.RH5

#define keybrd_clear() {KSI0 = 1; KSI1 = 1; KSI2 = 1; KSI3 = 1; KSI4 = 1;}

extern INT8U erri;
extern OS_MEM			*pMemSml;
extern OS_MEM			*pMemLge;
extern INT8U rom *pMemT;
extern INT8U rom *pMemT2;
//extern MCNM_FILE	SystemFile;

void isr_tmr2(void);
void isr_rb(void);
void keybrd_init(void);
INT8U keybrd_open(void);
INT16U keybrd_ioctl(INT8U cmd, INT24U arg);

INT8U chrKeyTemp0,chrKeyTemp1,chrKeyTemp2;
INT8U chrCurHandle;

#pragma romdata EXTRAM
INT8U rom BackLED;

#pragma romdata CCODE
DEV_HEADER DEV_KEYBRD = {
	DEV_ID_KBD,				/*device ID  */
	{'k','b','d'},			/*device name*/
	DEVP_CHAR | DEVP_SHARE,	/*device Type*/
	keybrd_init,			/*device init function*/
	FNull_1,				/*device clear function*/
	keybrd_open,			/*device open function*/
	FNull_1,				/*device close function*/
	keybrd_ioctl,			/*device ioctl function*/
	FNull_1,				/*device write function*/
	FNull_1					/*device read function*/
};

#pragma code MYCODE
void keybrd_init(void){	//the initialize function
	INT8U err;

	TRISHbits.TRISH4 = P_OUTPUT;
	TRISFbits.TRISF2 = P_OUTPUT;
	TRISFbits.TRISF6 = P_OUTPUT;
	TRISFbits.TRISF7 = P_OUTPUT;
	TRISAbits.TRISA1 = P_OUTPUT;
	TRISFbits.TRISF0 = P_INPUT;
	TRISFbits.TRISF1 = P_INPUT;
	TRISHbits.TRISH5 = P_INPUT;
	TRISHbits.TRISH6 = P_INPUT;
	TRISHbits.TRISH7 = P_INPUT;

	TRISBbits.TRISB5 = P_INPUT;

	keybrd_clear();
	isr_set(INT_RB, isr_rb);
	isr_set(INT_TMR2, isr_tmr2);
	INTCONbits.RBIE 	= 0;
	BackLED = 0;
}

INT8U keybrd_open(void){
	INTCONbits.RBIE 	= 1;	
}

INT16U keybrd_ioctl(INT8U cmd, INT24U arg){
	BackLED = (INT8U) arg;
}

unsigned char Key_Scan(void){
	if((KSO0 & KSO1 & KSO2 & KSO3 & KSO4) == 1)	return (KEY_NULL);
	KSI0 = 0;
	KSI1 = 0;
	KSI2 = 0;
	KSI3 = 0;
	KSI4 = 0;
	
	KSI0 = 1;
	if(KSO0 == 1) return (KEY_1);
	if(KSO1 == 1) return (KEY_2);
	if(KSO2 == 1) return (KEY_3);
	if(KSO3 == 1) return (KEY_F3);
	if(KSO4 == 1) return (KEY_F1);
	KSI0 = 0;
	
	KSI1 = 1;
	if(KSO0 == 1) return (KEY_4);
	if(KSO1 == 1) return (KEY_5);
	if(KSO2 == 1) return (KEY_6);
	if(KSO3 == 1) return (KEY_F4);
	if(KSO4 == 1) return (KEY_F2);
	KSI1 = 0;
	
	KSI2 = 1;
	if(KSO0 == 1) return (KEY_7);
	if(KSO1 == 1) return (KEY_8);
	if(KSO2 == 1) return (KEY_9);
	if(KSO3 == 1) return (KEY_SEND);
	if(KSO4 == 1) return (KEY_DOWN);
	KSI2 = 0;
	
	KSI3 = 1;
	if(KSO0 == 1) return (KEY_STAR);
	if(KSO1 == 1) return (KEY_0);
	if(KSO2 == 1) return (KEY_CROSS);
	if(KSO3 == 1) return (KEY_FUNC2);
	if(KSO4 == 1) return (KEY_UP);
	KSI3 = 0;
	
	KSI4 = 1;
	if(KSO0 == 1) return (KEY_C);
	if(KSO1 == 1) return (KEY_FUNC1);
	if(KSO2 == 1) return (KEY_REDIAL);
	if(KSO3 == 1) return (KEY_HANDFREE);
	if(KSO4 == 1) return (KEY_F0);
	KSI4 = 0;
}


void isr_rb(void){
	INTCONbits.RBIF = 0;
	if(PORTBbits.RB4 == 0){//Key pressed
		//start key scan process. the timer2 check the key once per 20ms, if 
		//the values of 3 continues is agreed with each other, hand on the key
		TMR2 = KSTIMEOUT;
		T2CONbits.TMR2ON = 1;
		PIE1bits.TMR2IE = 1;
	}
	if(PORTBbits.RB5 != chrCurHandle){
		chrCurHandle = PORTBbits.RB5;
		//Send handle message
		if(chrCurHandle == 0)
			OSQPost(peventDVS, (OS_EVENT *) MSG_HOOK_OFF);
		else
			OSQPost(peventDVS, (OS_EVENT *) MSG_HOOK_ON);
	}
	while(INTCONbits.RBIE && INTCONbits.RBIF){
		if(PORTBbits.RB4 != 0) Nop();
		INTCONbits.RBIF = 0;		
	}
}

void isr_tmr2(void){
	PIR1bits.TMR2IF = 0;
	chrKeyTemp0 = chrKeyTemp1;
	chrKeyTemp1 = chrKeyTemp2;
	chrKeyTemp2 = Key_Scan();
	keybrd_clear();	//Do_Key_Init();
	if((chrKeyTemp0 == chrKeyTemp1) && (chrKeyTemp1 == chrKeyTemp2)&&(chrKeyTemp0 != KEY_NULL)){
		PIE1bits.TMR2IE = 0;
		//Send key press message
		pMemT = OSMemGet(pMemSml, &erri);
		if(erri == OS_NO_ERR) {
			((MSG_HEAD *)pMemT)->Msg_ID = MSG_KEY_PRESS;
			((MSG_HEAD *)pMemT)->pmemME = pMemSml;
			((MSG_HEAD *)pMemT)->Attached = FALSE;
			((MSG_KEYPRESS *)pMemT)-> Key = chrKeyTemp0;
			OSQPost(peventDVS, (OS_EVENT *) pMemT);
		}
		if(BackLED != 0) LED_CTL = 1;
		//if(SystemFile.BackGroundLED != 0) LED_CTL = 1;
		pMemT=OSMemGet(pMemSml,&erri);
		if(erri == OS_NO_ERR){
			((MSG_HEAD *)pMemT)->Msg_ID=MSG_TIMER_START;
			((MSG_HEAD *)pMemT)->Origin=peventHardware;
			((MSG_HEAD *)pMemT)->pmemME=pMemSml;
			((MSG_HEAD *)pMemT)->Attached=FALSE;
			((MSG_HEAD *)pMemT)->LenOfBody=4;
			((TIMER_MESSAGE *)pMemT)->TID=KEY_LED_ID;
			((TIMER_MESSAGE *)pMemT)->Val=500;
		    OSQPost(peventTimer,pMemT);
		}
		
		//to send DTMF sound
		pMemT = OSMemGet(pMemSml, &erri);
		if(erri == OS_NO_ERR){
			((MSG_HEAD *)pMemT)->Msg_ID = MSG_KEY_PRESS;
			((MSG_HEAD *)pMemT)->pmemME = pMemSml;
			((MSG_HEAD *)pMemT)->Attached = FALSE;
			((MSG_KEYPRESS *)pMemT)-> Key = chrKeyTemp0;
			OSQPost(peventWICCmd, (OS_EVENT *) pMemT);
		}
		chrKeyTemp0 = KEY_NULL;
		chrKeyTemp1 = KEY_NULL;
		chrKeyTemp2 = KEY_NULL;
	}
}

⌨️ 快捷键说明

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