加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
keyfun.c 2.69 KB
一键复制 编辑 原始数据 按行查看 历史
dk鲁晓东 提交于 2019-12-20 13:12 . 4*4键盘驱动
#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;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化