📄 10e8fff210c0001d1369d968286a6809
字号:
/*
*/
//#include <stdlib.h>
//#include <stdio.h>
/* Scheduler include files. */
#include "FreeRTOS.h"
#include "task.h"
#include "kbd.h"
#include "type.h"
#include "../gui/font5_7.h"
#include "../lcd/lcddrive.h"
#include "package.h"
#define _kbd_DEBUG_
#define kbdSTACK_SIZE configMINIMAL_STACK_SIZE
/*
#define ledNUMBER_OF_LEDS ( 3 )*/
#define kbd_RATE_BASE ( ( portTickType ) 111 )
uint32 keyscanmark[4]={0x00800000,0x01000000,0x02000000,0x04000000};
uint8 KeyValTable[40]={ 0x0d,0,4,8,' ',
0x0c,1,5,9,' ',
0x0b,2,6,0x0a,' ',
0x0e,3,7,0x1b,0x0f,' '
};
/*
uint8 KeyValTable[40]={ 0x01,'0', '4' ,'8',
' ', 0x04,'1' ,'5',
'9' ,' ', 0x03,'2',
'6', 0x0d,' ' ,0x02,
'3', '7' ,0x1b,' ',
' ', 0x0d,' ' ,' ',
};*/
struct KBD StatKBD;
void noticeKeyBoardStart(unsigned char mode)
{
portENTER_CRITICAL();
StatKBD.kbd_scan_mode=mode;
StatKBD.kbd_start=1;
portEXIT_CRITICAL();
}
unsigned char checkKeyBoardIn(void)
{
unsigned char cKin=0;
portENTER_CRITICAL();
//if(StatKBD.kbd_comp==2)
{
//cKin=StatKBD.kbd_value;
//StatKBD.kbd_comp=0;
StatKBD.kbd_start=0;
}
portEXIT_CRITICAL();
return cKin;
}
void CancelKeyBoardIn(void)
{
portENTER_CRITICAL();
//StatKBD.kbd_value=0;
//StatKBD.kbd_comp=0;
StatKBD.kbd_start=0;
StatKBD.kbd_scan_mode=0;
portEXIT_CRITICAL();
}
void StoreKeyValueKBD(uint8 keyval)
{
portENTER_CRITICAL();
StatKBD.kbd_buff[StatKBD.kbd_num]=keyval; //保存采集到的键值
StatKBD.kbd_num++; //采集到的键值数+1
portEXIT_CRITICAL();
}
void preInitKeyBoardScanLine(void)
{
PINSEL7 =0x00000000;
PINMODE7=0xfffc0000; /*已该为全是下拉电阻 //0xffc00000; */ // PINMODE7=0x3fc00000; /*定义P3.23--P3.26保留;P3.27--P3.31接下拉电阻;*/
FIO3MASK=0x00000000; /*定义P3.15--P3.31为可读写口;*/
FIO3DIR =0x07800000; /*定义P3.23--P3.26为输出,P3.27--P3.31为输入;*/
//all start, we setup the set-line as high
FIO3SET =0x07800000;
}
uint32 KeyBePush(void)
{
uint32 val=0;
FIO3PIN =0x07800000;
val=FIO3PIN;
val &=0xf8000000;
return val;
}
uint8 ScanKey(uint8 *keyVal,uint8 xLastkbdTime)
{
uint8 row,col,tmp[2];
uint8 KeyISPress;
uint32 keyscanresult=0;
KeyISPress=0;
for(row=0;row<4;row++)
{
FIO3PIN=keyscanmark[row];
keyscanresult=FIO3PIN;
keyscanresult=(keyscanresult&0xFF800000);
if(keyscanresult!=keyscanmark[row])
{
keyscanresult=FIO3PIN;
keyscanresult=(keyscanresult&0xFF800000);
if(keyscanresult!=keyscanmark[row])
{
KeyISPress=1;
break;
}
}
FIO3CLR=keyscanmark[row];
}
if(!KeyISPress) return 0;
keyscanresult>>=27; // result maybe: 1 2 4 8 16
switch(keyscanresult)
{
case 0: //error
return 0;
case 1:
col=0;
break;
case 2:
col=1;
break;
case 4:
col=2;
break;
case 8:
col=3;
break;
case 16:
col=4;
default:
return 0;
}
* keyVal=col+row*5;
*keyVal=KeyValTable[*keyVal];
//tmp[0]=col+0x30;
//tmp[1]=row+0x30;
//PutString(8,3,tmp,2);
return 1;
}
/*--------------------------------------------------------------------
*
*
* 等待键松开
*
*
* -------------------------------------------------------------------*/
uint8 KeyBeFree(portTickType * lt)
{
portTickType xkbdRate;
uint8 i;
xkbdRate = kbd_RATE_BASE ; //111
xkbdRate /= portTICK_RATE_MS;
for(i=0;i<10;i++)
{
if(KeyBePush()==0) return 0;
vTaskDelayUntil( lt, xkbdRate );
}
return 1; //error
}
/* The task that is created three times. */
static portTASK_FUNCTION_PROTO( vKBDTask, pvParameters );
/*-----------------------------------------------------------
*
* 键值采集任务,负责采集按下的键值,并传输给键值解释函数PollingKeyMKD
*
*
*
* -----------------------------------------------------------*/
void vStartKBDTasks( unsigned portBASE_TYPE uxPriority )
{
/* Create the task. */
StatKBD.kbd_scan_mode=0;
//StatKBD.kbd_comp=0;
StatKBD.kbd_start=0;
preInitKeyBoardScanLine();
xTaskCreate( vKBDTask, ( signed portCHAR * ) "KBD", kbdSTACK_SIZE, NULL, uxPriority,( xTaskHandle *)NULL );
}
/*-----------------------------------------------------------*/
static portTASK_FUNCTION( vKBDTask, pvParameters )
{
portTickType xkbdRate, xLastkbdTime;
uint8 valKey=0;
//char szTmp[40];
/* The parameters are not used. */
( void ) pvParameters;
xkbdRate = kbd_RATE_BASE ;
xkbdRate /= portTICK_RATE_MS;
/* We need to initialise xLastkbdTime prior to the first call to vTaskDelayUntil(). */
xLastkbdTime = xTaskGetTickCount();
DisplayFlag(119,119,0); //数字输入
for(;;)
{
/* Delay for half the flash period then turn the LED on. */
vTaskDelayUntil( &xLastkbdTime, xkbdRate );
if((FIO3PIN&0xF8000000)==0x80000000) //功能键按下
{
KeyBeFree(&xLastkbdTime);
ChangeInputMode(); //功能键对应0x10
}
if(!StatKBD.kbd_start) continue; //if keyboard forbidden
if(KeyBePush()==0x00000000) continue; //no key be pressed ,continue;
/* wait a while, flash like eyes */
//vTaskDelayUntil( &xLastkbdTime, xkbdRate );
if(KeyBePush()==0x00000000) continue; //maybe is noise, continue;
if(ScanKey(&valKey,xLastkbdTime)==0) continue;
else
StoreKeyValueKBD(valKey);
KeyBeFree(&xLastkbdTime);
}
}
/*-----------------------------------------------------------------------
*
* To change the inputing mode .
*
*
* ---------------------------------------------------------------------*/
extern struct KEYMODE m_KeyMode;
void ChangeInputMode()
{
if(StatKBD.kbd_scan_mode==0)
{
StatKBD.kbd_scan_mode=1;
DisplayFlag(119,119,1); //数字输入
m_KeyMode.saveCondition=1;
m_KeyMode.timelag=0;
}
else
{
StatKBD.kbd_scan_mode=0;
DisplayFlag(119,119,0); //字母输入
m_KeyMode.saveCondition=0;
m_KeyMode.timelag=1; //开始计时
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -