📄 drvkeybrd.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 + -