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

📄 keyprocess.c

📁 基于单片机的数控开关电源设计
💻 C
字号:
//*************************************************************************************************
//*																								  *
//*			 ******************************键码处理程序**************************				  *
//*																								  *
//*************************************************************************************************

//*************************************************************************************************
//*																								  *
//*			 ******************************头文件及宏定义**************************				  *
//*																								  *
//*************************************************************************************************
#include "InputNumber.h"
#include "InputChar.h"
#include "SMC1602.h"


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<输入法标志位>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bit b_InputMode=1;			  			//0表示是数字输入法,1表示是字母输入法。
										//默认是字母输入法。

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<显示介绍>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
extern bit b_Introduce;

void vIntroduce();


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<连续按键计数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
unsigned char uc_KeyTemp=0;				//按键键码暂存。

unsigned char uc_ClickCount=1;			//同一个按连续按下的次数。

extern unsigned char uc_CleanCount;		//清除按键计数时间计数。

bit b_CleanClick=0;			   			//为1时启用清除。


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<大小写模式>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
extern bit b_CapStatus;		   			//0--大写;1--小写。(默认为0:大写)


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<刷新字符显示>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
unsigned char uca_CharBox[17]={"                "};		 
										//存储刷新字符。

unsigned char uc_CharPointer=0;			//刷新字符末位计数,指向字符光标位置。


										


//*************************************************************************************************
//*																								  *
//*			 ******************************字符显示更新函数**************************			  *
//*																								  *
//*************************************************************************************************
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<删除所有字符>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void vCleanAll()
{
	unsigned char ucCount;

	for(ucCount=0;ucCount<uc_CharPointer;ucCount++)
		uca_CharBox[ucCount]=' ';

	uc_CharPointer=0;
	vWriteCMD(0xC0);
	vShowChar("                ");
	vWriteCMD(0xC0);
}



//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<删除一个字符>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void vCleanOne()
{
	if(uc_CharPointer>0)
		{
			uc_CharPointer--;
			uca_CharBox[uc_CharPointer]=' ';
			vWriteCMD(0xC0+uc_CharPointer);
			vShowOneChar(' ');
			vWriteCMD(0xC0+uc_CharPointer);
		}
}


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<添加一个字符>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void vCharAdd(unsigned char ucChar)						   //接收的是ASC字符。
{
	unsigned char ucCount;
	if(uc_CharPointer<16)
		{

		vWriteCMD(0xC0+uc_CharPointer);
		vShowOneChar(ucChar);
		
		uca_CharBox[uc_CharPointer]=ucChar;				  //将字符写入uca_CharBox。	
		uc_CharPointer++;								  //使ucCharPoint只想下一个位置。
		}
	else
		{												  //如字符超出16个则全部清除,把光标移到最左边。
		vWriteCMD(0xC1);
		vShowChar("                 ");
		vWriteCMD(0xC0);
		vShowOneChar(ucChar);							 //写入输入字符。

		for(ucCount=1;ucCount<16;ucCount++)
			uca_CharBox[ucCount]=' ';					 //同时清空uca_CharBox。
		    uca_CharBox[0]=ucChar;
		    uc_CharPointer=1;
		   }

	b_CleanClick=1;
	uc_CleanCount=0;
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<获取按键字符ASC值(八进制)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
unsigned char ucGetChar(unsigned char ucChar)
{
	if(b_InputMode==0)
		return ucGetNum(ucChar);		   //获取数字字符。
	else
		return ucGetLetter(ucChar);		   //获取字母字符。
}


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<字符最终处理函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void vCharProcess(unsigned ucKeyCode)				  //接收的是键码。
{
	if(b_InputMode==0)								 //如果是数字输入,就直接输出。
		vCharAdd(ucGetChar(ucKeyCode));
	else
		{
		if(ucKeyCode!=42)							 //如果是字幕输入,则判断是不是标点。
			{
			if(uc_ClickCount==0)
				{
				vCharAdd(ucGetChar(ucKeyCode));		  //如果是只连续按了1次就直接输出。
				}
			else
				{
				uc_CharPointer--;					 //否则光标前移,然后再输出。
				vCharAdd(ucGetChar(ucKeyCode));
				}
			}
		else
			{
			vShowOneChar('!');							  //punc
			uca_CharBox[uc_CharPointer++]='!';			  //写入感叹号!
			}
		}
	b_CleanClick=1;
	uc_CleanCount=0;
}
//*************************************************************************************************
//*																								  *
//*			 ******************************键码处理主程序**************************				  *
//*																								  *
//*************************************************************************************************
void vKeyProcess(unsigned char ucKeyCode)
{
	if(uc_KeyTemp==ucKeyCode)			//判断按键与上一次所按的键是否相同。
		{
		if(uc_ClickCount<255)			//同一个按连续按下的次数:1~255。
		 	uc_ClickCount++;
		}
	else
		{
		uc_KeyTemp=ucKeyCode;
		uc_ClickCount=0;
		}

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<按键处理>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	switch(ucKeyCode)
		{
		case 14:		//********************显示介绍************************************************
				b_Introduce=1;
				vIntroduce();
				break;

		case 24:		//********************输入空白************************************************
				vCharAdd(' ');				
				break;

		case 34:	  //**********************大小写切换*********************************************
				if(b_InputMode==1)
					{
					b_CapStatus=~b_CapStatus;
					if(b_CapStatus==0)		   //大写。
						{
						vWriteCMD(0x8E);
						vShowOneChar('B');
						vWriteCMD(0xC0+uc_CharPointer);
						}
					else
						{
						vWriteCMD(0x8E);
						vShowOneChar('S');
						vWriteCMD(0xC0+uc_CharPointer);
						}
					}
				break;

		case 41:	  //********************删除所有字符*********************************************
				vCleanAll();
				break;

		case 43:	 //**********************删除1个字符********************************************
				vCleanOne();
				break;

		case 44:	   //********************输入法切换***********************************************
			b_InputMode=~b_InputMode;
			if(b_InputMode)
				{
				if(b_CapStatus==0)			  //切换到字符输入法时在右上角显示“C”
					{
					vWriteCMD(0x8E);		
					vShowChar("BC");		  //大写显示“BC”
					vWriteCMD(0xC0+uc_CharPointer);
					}
				else
					{
					vWriteCMD(0x8E);		
					vShowChar("SC");		 //小写显示“SC”
					vWriteCMD(0xC0+uc_CharPointer);
					}
				}
			else
				{
				vWriteCMD(0x8E);	   //切换到数字输入法时在右上角显示“N”
				vShowChar(" N");
				vWriteCMD(0xC0+uc_CharPointer);
				}	
				break;

		default:	 //*************************获得键码********************************************
				vCharProcess(ucKeyCode);
		}
}									   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -