代码拉取完成,页面将自动刷新
同步操作将从 dk鲁晓东/STC15库 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
#include "keyfun.h"
#define Keyport P0 //P1为键盘口,按实际情况修改
unsigned char code ScanCol[]={0xef,0xdf,0xbf,0x7f};//列扫描
unsigned char code Keymod[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};//所有的键模,0x77左上角的键
//unsigned char code Keymod[]={0x77,0xb7,0xde,0xe7,0x7b,0xbb,0xdb,0xeb,0x7d,0xbd,0xdd,0xed,0x7e,0xbe,0xde,0xee};
//Keymod是端口状态的集合,摆放顺序按行列规律,
unsigned char code Keyval[]={13,12,11,10,15,9,6,3,0,8,5,2,14,7,4,1};//键对应的贴膜上的值
bit iskey(unsigned char *portval)//把端口值放到一个有系统指定的变量中
{
unsigned char col;
for(col=0;col<4;col++) //共4列的扫描
{ Keyport=ScanCol[col]; //
if((Keyport&0x0f)!=0x0f) //首先感知键盘的按下,低4位有按下
{ //进入后马上记录
*portval=Keyport; // 得到键盘传到系统的变量
while((Keyport&0x0f)!=0x0f);//这句避免键盘长按,则等待
return 1; //显示
}//if
}
return 0;
}
/* unsigned char GetKeyorder(unsigned char *port)
{
unsigned char k, x;
x=*port;
for(k=0;k<16;k++)
{if(x==Keymod[k])
return k;
}
return 255;//没有值
}
*/
//可以得到键盘值
// 参数值:portval是键盘端口的状态值;扫描得到
// 返回:状态对应的键的编号值;是自己定义的编号
unsigned char GetKeyval(unsigned char portval)
{
unsigned char k;
for(k=0;k<16;k++)
{if(portval==Keymod[k])
break;
}
return Keyval[k];
}
//函数根据输入的键inkey和已输入数Valed,决定输出的数
//输入的inkey分2类,1类是数字、1类是操作码如+-*=cancel等
//数字类的没有小数情况每输入一个,则valed扩大10倍+新数,有小数点则新数后移到小数点最后。Npoint++
//操作运算类的则保存原数据到Opval;初始化接收新数据Npoint=0;Valed=0;
//运算结果=
float Newval(unsigned char inkey,float Valed)
{//更新数据的函数,只能计算*与+
//float yy;
static unsigned char Npoint=0;
static unsigned char Opfun;
static float Opval;
if(inkey==10)//自己定义10表示小数点
{ Npoint=1;return Valed;}
if(inkey==13)//自己定义13表示清除
{ Npoint=0;return 0.00;}
if(inkey==11||inkey==12||inkey==14)// + - *
{ Opfun=inkey;//保存操作代码
Opval=Valed;//保存第一个操作数
Npoint=0;
Valed=0;
return Valed;
}
if(inkey==15)// 计算结果"="
{
switch(Opfun)
{ case 11:Valed=Valed+Opval;break;//+
case 12:Valed=Opval-Valed;Opval=Valed;break;//- 把结果传给Opval
case 14:Valed=Valed*Opval;break;// * 保存结果
default:break;
}
Npoint=0;
Opfun=0;//无操作
return Valed;
}
if(Npoint>0)
{Valed=Valed+inkey*pow(0.1,Npoint);//0.1的0次,1次累积 有小数点后
Npoint++;}
else
Valed=Valed*10.0+inkey*1.0;//没有小数点的情况是*10累积
return Valed;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。