📄 keyprocess.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 + -