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

📄 f0dc396eaccc001d1b149b113a8ef8e7

📁 基于FREERtos和LPC2468的程序。里面实现了串口通信
💻
字号:
/*----------------------------------------------------------------------------
 * 
 * 该函数用来处理键值输入
 * 
 * 
 * 
 * ------------------------------------------------------------------------------*/

#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 + -