📄 keyboard.c
字号:
/*+++++++++++++++++++++++++++++++++++++++++++++++++++/
程序名 :KeyBoard.c 键盘扫描子程序
入口:
出口:键盘值
+++++++++++++++++++++++++++++++++++++++++++++++++++*/
#include "CPLD.h"
//===============================================
unsigned char idata ucKeyState;
float p1;
float p2;
float *p=&p1;
unsigned char idata op;
int flag=1;//控制小数点个数
float f1;
float f2;
void ISR_int1(void) interrupt 2 using 0
{
//ucSKey初始化
unsigned int uiI;
unsigned char ucLcdPosX;
unsigned char ucLcdPosY;
for (uiI=0;uiI<10000;uiI++);
//延时,去掉抖动
if(INT1==1) goto end01; //读入int0,
//关闭外部中断
for (uiI=0;uiI<10000;uiI++);
//延时,去掉抖动 ;
//ucSKey=GetKey();
ucKeyState=GetKey();
//按键所对应的符号first=first&ucKeyState;
while(INT1==0);
//按键是否弹起
if(ucLcdPosY==16||ucLcdPosY==32)
{
ucLcdPosX^=1,ucLcdPosY=0;
}
//按下后显示按键所对应的单个字符
if(ucKeyState!='=')
{
if(ucKeyState>='0'&&ucKeyState<='9') //如果用户输入的字符是数字,那么就把对相应的操作数进行处理
{
if(ucLcdPosY==16||ucLcdPosY==32)
{
ucLcdPosX^=1,ucLcdPosY=0;
}
DispOneChar(ucLcdPosX,ucLcdPosY++,ucKeyState);
(*p)=(*p)*f1+(ucKeyState-'0')/f2;
//'0'的意思是把用户输入的字符转变为对应的数字,如果用户没有输入小数点,那么f1=10,f2=1,否则f1=1,f2的值会每次都改变。
f2=((f2-1)<1)?1:(f2*10);
}
//用户输入的不是数字,则可能是小数点或者运算符
else if(ucKeyState=='.'&&flag) //是小数点,那么改变状态变量,准备接受操作数的小数部分
{
flag=0;
f1=1;
f2=10;
if(ucLcdPosY==16||ucLcdPosY==32)
{
ucLcdPosX^=1,ucLcdPosY=0;
}
DispOneChar(ucLcdPosX,ucLcdPosY++,ucKeyState);
// DispOneChar(ucLcdPosX++,ucLcdPosY,'.');
}
else if(ucKeyState=='+'||ucKeyState=='-'||ucKeyState=='*'||ucKeyState=='/') // 是操作符,把操作符保存在变量o里,同时改变指针p指向的变量,准备接受第二个操作数,并把状态变量设为始值
{
flag=1;
op=ucKeyState;
p=&p2;
f1=10;
f2=1;
cls();
ucLcdPosX=0,ucLcdPosY=0;
}
else if(ucKeyState=='a')
{
flag=1;
cls();
p1=0,p2=0,p=&p1;
f1=10;f2=1;
ucLcdPosY=0;
}
}
//NextPos();
end01:;
}
unsigned char GetKey(void)
{
unsigned char kc,ucRetKc;
unsigned char m;
m=1;
ucRetKc=XBYTE[0x8000]& 0x0f;
if(ucRetKc!=0x0f)
while(m<=0x10){
if(m==0x01)ucRetKc=XBYTE[0x80f7]&0x0f;
if(m==0x02)ucRetKc=XBYTE[0x80ef]&0x0f;
if(m==0x04)ucRetKc=XBYTE[0x80df]&0x0f;
if(m==0x08)ucRetKc=XBYTE[0x80bf]&0x0f;
if(m==0x10)ucRetKc=XBYTE[0x807f]&0x0f;
if(ucRetKc!=0x0f)
{ucRetKc=ucRetKc<<4;
kc=ucRetKc+m;
goto end00;}
m*=2;}
end00:
switch (kc) //按键所在的具体位置对应于相应的符号
{
case 0xE1: kc='+' ;
break;
case 0xD1: kc='9' ;
break;
case 0xB1: kc='8' ; //--- + 9 8 7 ---
break;
case 0x71: kc='7'; //--- - 6 5 4 ---
break;
case 0xE2: kc='-' ; //--- * 3 2 1 ---
break;
case 0xD2: kc='6' ; //--- / = . 0 ---
break;
case 0xB2: kc='5' ;
break;
case 0x72: kc='4' ;
break;
case 0xE4: kc= '*';
break;
case 0xD4: kc= '3';
break;
case 0xB4: kc='2' ;
break;
case 0x74: kc='1' ;
break;
case 0xE8: kc='/' ;
break;
case 0xD8: kc='=' ;
break;
case 0xB8: kc= '.';
break;
case 0x78: kc='0' ;
break;
case 0xF0: kc='a' ;
break;
case 0xE0: kc='b' ;
break;
case 0xC0: kc='c' ;
break;
case 0x80: kc='d' ;
break;
default: kc='q';
}
return kc;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -