📄 f0dc396eaccc001d1b149b113a8ef8e7
字号:
/*----------------------------------------------------------------------------
*
* 该函数用来处理键值输入
*
*
*
* ------------------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "task.h"
//#include "mkd.h"
#include "type.h"
#include "../gui/font5_7.h"
#include "uart.h"
#include "stdio.h"
#include "keyscan.h"
#include "kbd.h"
#include "package.h"
#include "../gui/GUI_StockC.h"
#include "../lcd/lcddrive.h"
#define FINISH 0x01
/*-------------------------全局变量--------------------------------------------*/
/*--------------键值表 ------------------------*/
uint8 KEY0[2]={'#','*'};
uint8 KEY1[4]={',','.','!','?'};
uint8 KEY2[6]={'a','b','c','A','B','C'};
uint8 KEY3[6]={'d','e','f','D','E','F'};
uint8 KEY4[6]={'g','h','i','G','H','I'};
uint8 KEY5[6]={'j','k','l','J','K','L'};
uint8 KEY6[6]={'m','n','o','M','N','O'};
uint8 KEY7[8]={'p','q','r','s','P','Q','R','S'};
uint8 KEY8[6]={'t','u','v','T','U','V'};
uint8 KEY9[8]={'w','x','w','z','W','X','W','Z'};
struct TURNPAGE m_TurnPage;
extern struct KBD StatKBD;
extern struct CmdRcv CmdRcvIrq;
/*------------------------------------------------------------------------------
*
*
* 初始化键值接收的数据结构
*
*
* ------------------------------------------------------------------------------*/
void InitScanKey(uint8 *ptr)
{
uint8 i;
m_key.echo=*ptr; ptr++;
m_key.timeLimit=*ptr; ptr++;
m_key.x=*ptr; ptr++;
m_key.y=*ptr; ptr++;
m_key.num=*ptr;
m_key.m_CurPositon=0;
for(i=0;i<20;i++)
m_key.m_KeyBuff[i]=0xff;
m_KeyMode.lastKeyValue=0xff;
m_KeyMode.lastKeyNum=0xff;
m_KeyMode.timelag=0x00;
m_KeyMode.saveCondition=0;
m_KeyMode.stroketimes=0;
StatKBD.kbd_num=0; //采集到的键值数为0
}
/*-------------------------------------------------------------------------------
*
* 从键值采集程序得到一个键值
*
* ------------------------------------------------------------------------------*/
uint8 GetKeyValue(void)
{
uint8 tmp,num,i;
num=StatKBD.kbd_num;
tmp=StatKBD.kbd_buff[0];
StatKBD.kbd_num--;
for(i=0;i<(StatKBD.kbd_num);i++)
{
StatKBD.kbd_buff[i]=StatKBD.kbd_buff[i+1];
}
return tmp;
}
/*-------------------------------------------------------------------------------
*
* function : PollingKeyMKD
*
* specification : 采集键值
*
*
* ------------------------------------------------------------------------------*/
int PollingKeyMKD(uint8 * ptr)
{
portTickType xkbdRate, xLastkbdTime;
uint8 key_value,i,tmpChar[20];
xkbdRate = getKEY_RATE_BASE ;
xkbdRate /= portTICK_RATE_MS;
ptr++; /*skip PM */
InitScanKey(ptr);
StatKBD.kbd_start=1; //开始采集键值
xLastkbdTime = xTaskGetTickCount();
for(i=0;;) //i++)i<keylen
{
vTaskDelayUntil( &xLastkbdTime, xkbdRate ); //每隔100ms询问一次是否有输入
//DislayCursorMKD(m_key.x,m_key.y+m_key.m_CurPositon,1);
if(m_KeyMode.timelag>150) //如果延时超过900ms
{
storeTheKey(key_value);
DislayCursorMKD(m_key.x,m_key.y+m_key.m_CurPositon,1);
}
if(CmdRcvIrq.cResult==FINISH) //如果接收完一个有用的数据包
{
if(CmdRcvIrq.buffer[0]=='C') return 0;//如果接收到的是一个命令帧,返回
}
if(m_key.num==m_key.m_CurPositon) break; //获得足够的键值,返回
if(!StatKBD.kbd_num) //如果没有输入,continue
continue; //读取的频率一般要高于键按下的频率
key_value=GetKeyValue(); //读取一个键值
if(key_value>0x09) //如果是功能键
{
switch(key_value)
{
case 0x0a: //确认
PressEnter();
return 0;
case 0x0b: //删除
PressDel();
break;
case 0x0c: //→
PressRight();
break;
case 0x0d: //上
PressUp();
break;
case 0x0e: //下
PressDown();
break;
case 0x0f: //取消
PressCancel();
return 0;
}
continue ;
}
else if(StatKBD.kbd_scan_mode==0)
key_value=speKey_Num(key_value); //如果是数字模式下
else
key_value=speKey_Lett(key_value); //如果是字母模式下
//if(m_KeyMode.saveCondition)
{
//storeTheKey(key_value); //保存该键值
//m_key.m_CurPositon++;
}
dispKey(key_value); //显示键值
}
tmpChar[0]=0x00;
tmpChar[1]=0x00;
for(i=0;i<m_key.num;i++)
{
tmpChar[2+i]=m_key.m_KeyBuff[i];
}
responseReport('R',tmpChar,3+m_key.num);
return NORMAL;
}
/*--------------------------------------------------------------------------
* function : speKey_Num
*
* specify the key in num mode.
*
* -------------------------------------------------------------------------*/
uint8 speKey_Num(uint8 key)
{
m_KeyMode.lastKeyNum=key;
m_KeyMode.lastKeyValue=key+0x30;
storeTheKey(m_KeyMode.lastKeyValue);
return key+0x30;
}
/*-----------------------------------------------------------------------------
*
* function : speKey_Lett
* specify the key in letter mode.
*
* ---------------------------------------------------------------------------*/
uint8 speKey_Lett(uint8 key)
{
m_KeyMode.saveCondition=0;
if(m_KeyMode.timelag!=0) //已经有待判定的键值
if(m_KeyMode.lastKeyNum!=key) // 如果按下不同的键
storeTheKey(m_KeyMode.lastKeyValue);
m_KeyMode.lastKeyNum=key; //保存解释前的键值
switch(key)
{
case 0:
key=KEY0[m_KeyMode.stroketimes%2];
m_KeyMode.stroketimes++;
break;
case 1:
key=KEY1[m_KeyMode.stroketimes%4];
m_KeyMode.stroketimes++;
break;
case 2:
key=KEY2[m_KeyMode.stroketimes%6];
m_KeyMode.stroketimes++;
break;
case 3:
key=KEY3[m_KeyMode.stroketimes%6];
m_KeyMode.stroketimes++;
break;
case 4:
key=KEY4[m_KeyMode.stroketimes%6];
m_KeyMode.stroketimes++;
break;
case 5:
key=KEY5[m_KeyMode.stroketimes%6];
m_KeyMode.stroketimes++;
break;
case 6:
key=KEY6[m_KeyMode.stroketimes%6];
m_KeyMode.stroketimes++;
break;
case 7:
key=KEY7[m_KeyMode.stroketimes%8];
m_KeyMode.stroketimes++;
break;
case 8:
key=KEY8[m_KeyMode.stroketimes%6];
m_KeyMode.stroketimes++;
break;
case 9:
key=KEY9[m_KeyMode.stroketimes%8];
m_KeyMode.stroketimes++;
break;
}
m_KeyMode.lastKeyValue=key; //保存解释后的键值
m_KeyMode.timelag=1; //敲击间隔复位
return key;
}
/*------------------------------------------------------------------------------
*
* function : storeTheKey
* save a key_value if m_KeyMode.saveCondition=1
*
*
* -----------------------------------------------------------------------------*/
uint8 storeTheKey(uint8 key)
{
m_key.m_KeyBuff[m_key.m_CurPositon]=key; // 保存一个键值
ClearCursorMKD(m_key.x,m_key.y+m_key.m_CurPositon,1);
m_key.m_CurPositon++;
m_KeyMode.stroketimes=0; //清除敲击次数
m_KeyMode.timelag=0; //清除敲击时间间隔
return 0;
}
/*-------------------------------------------------------------------------------
*
* function : dispKey
*
* 如果没有保存,即m_CurPosition没有增加,y=m_key.y+m_key.m_CurPositon;如果保存了一个键值,显示位置=y-1;
*
* -----------------------------------------------------------------------------*/
uint8 dispKey(uint8 key)
{
uint8 x,y;
uint8 tmp=0x4a;
if(m_KeyMode.timelag==0) //
y=m_key.y+m_key.m_CurPositon-1;
else y=m_key.y+m_key.m_CurPositon;
x=m_key.x;
if(m_key.echo==0x00)
PutString(x,y,&key,1); //明文显示
else if(m_key.echo==0x02)
PutString(x,y,&tmp,1); //显示*
DislayCursorMKD(m_key.x,m_key.y+m_key.m_CurPositon,1);
return 0;
}
/*------------------------------------------------------------------------
*
* function : 按下各个功能键
*
*
*
* -----------------------------------------------------------------------*/
uint8 PressDel(void)
{ //<-
if(m_key.m_CurPositon==0) return 0;
ClearCursorMKD(m_key.x,m_key.y+m_key.m_CurPositon,1);
m_key.m_CurPositon--;
ClearCurChar(m_key.x,m_key.y+m_key.m_CurPositon);
DislayCursorMKD(m_key.x,m_key.y+m_key.m_CurPositon,1);
return 0;
}
uint8 PressEnter(void)
{
uint8 i,tmpChar[20];
tmpChar[0]=0x00;
tmpChar[1]=0x00;
for(i=0;i<m_key.m_CurPositon;i++)
{
tmpChar[2+i]=m_key.m_KeyBuff[i];
}
tmpChar[3+m_key.m_CurPositon]=0x0a; //表示按下了确认键
responseReport('R',tmpChar,4+m_key.m_CurPositon);
return 0;
}
uint8 PressCancel(void)
{
uint8 tmpChar[20];
tmpChar[0]=0x00;
tmpChar[1]=0x00;
tmpChar[2]=0x0f; //表示按下了取消键
responseReport('R',tmpChar,4);
return 0;
}
uint8 PressUp()
{
return 0;
}
uint8 PressDown()
{
uint8 tmp;
if(!m_TurnPage.len) //TurnPageFlag也是未显示的字符数
return 0;
LCD_FillDat(0,0,120,120,0x00); // clear the screen
tmp=m_TurnPage.len; //是否需要翻页
if(tmp>220)
{
PutString(0,0,m_TurnPage.ptr,220);
m_TurnPage.len=tmp-220;
DisplayFlag(2);
}
else
{
PutString(0,0,m_TurnPage.ptr,m_TurnPage.len);
m_TurnPage.len=0;
m_TurnPage.ptr=0;
ClearFlag();
}
return 0;
}
uint8 PressRight()
{
return 0;
}
/*--------------------------------------------------------------------------
*
* function : DislayCursorMKD and ClearCursorMKD
*
* specification : display or clear a cursor under the current position
*
* parameter : x是行,y是列,mode 说明cursor是1字节还是两个字节
*--------------------------------------------------------------------------*/
void DislayCursorMKD(uint8 x,uint8 y,uint8 mode)
{
uint32 x0,y0,y1;
x0=(uint32)(x)*12-1; //x是行,从第1行到第10行
y0=(uint32)(y-1)*6; //y是列,从第1列到第10列
y1=(uint32)(y0+mode*6-1); //mode=1表示1个字节,mode=2表示2个字节
GUI_HLine(y0,x0,y1,1);
}
void ClearCursorMKD(uint8 x,uint8 y,uint8 mode)
{
uint32 x0,y0,y1;
x0=(uint32)(x)*12-1; //x是行,从第1行到第10行
y0=(uint32)(y-1)*6; //y是列,从第1列到第10列
y1=(uint32)(y0+mode*6-1); //mode=1表示1个字节,mode=2表示2个字节
GUI_HLine(y0,x0,y1,0);
}
/*---------------------------------------------------------------------
*
*
* 删除x行y列的一个字符
*
* ---------------------------------------------------------------------*/
void ClearCurChar(uint8 x,uint8 y)
{
uint32 x0,y0,y1,i;
x0=(uint32)(x)*12-12; //x是行,从第1行到第10行
y0=(uint32)(y-1)*6-1; //y是列,从第1列到第10列
y1=(uint32)(y0+6); //mode=1表示1个字节,mode=2表示2个字节
for(i=0;i<12;i++)
GUI_HLine(y0,x0+i,y1,0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -