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

📄 10e8fff210c0001d1369d968286a6809

📁 基于FREERtos和LPC2468的程序。里面实现了串口通信
💻
字号:
/*
	
	
*/

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