📄 keytest.c
字号:
#include<reg51.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
#define KEYPORT P1
static unsigned long int counter;//用来记录输入的数据
static unsigned long int counter_save;
unsigned char value[4][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};
char code row[4]={0x70,0xb0,0xd0,0xe0};
char code line[4]={0x07,0x0b,0x0d,0x0e};
unsigned char code LED[11]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x00};
bit XFLAG=0;
char k;
uchar keyvalue;
//----------------------------------------------------------------------
senddata(uchar b)
{
char i;
i=b;
SBUF=LED[i];
while(TI==0);
TI=0;
}
//----------------------------延时程序---------------------------
void delay(uint delaytime)
{
char i;
for(;delaytime>0;delaytime--)
for(i=0;i<121;i++)
{;}
}
//-------------------------------------------------------------------
uchar keyscan(void)
{
uchar xinvalue,yinvalue,i,j;
uchar kvalue;
KEYPORT=0x0f;
while(KEYPORT==0x0f);
if(KEYPORT!=0x0f)
{
delay(20);//延时消抖
if(KEYPORT!=0x0f)
{
KEYPORT=0x0f;//输出行扫描码
xinvalue=KEYPORT;
KEYPORT=0xf0;//输出列扫描码
yinvalue=KEYPORT;
for(i=0;i<4;i++)
{
if((xinvalue&0x0f)==line[i])
for(j=0;j<4;j++)
{
if((yinvalue&0xf0)==row[j])
{
kvalue=value[i][j];
return(kvalue);//反回按键值
}
}
}
}
}
}
//------------------------keyprocess函数-----------------------
void keyprocess(uchar kvalue)
{
char cosave[8];
char i;
char a=0;
a=0;
//输出数据
switch(kvalue)
{
case 0:
senddata(0);
counter=counter*10;
break;
case 1:
senddata(1);
counter=counter*10+1;
break;
case 2:
senddata(2);
counter=counter*10+2;
break;
case 3:
senddata(3);
counter=counter*10+3;
break;
case 4:
senddata(4);
counter=counter*10+4;
break;
case 5:
senddata(5);
counter=counter*10+5;
break;
case 6:
senddata(6);
counter=counter*10+6;
break;
case 7:
senddata(7);
counter=counter*10+7;
break;
case 8:
senddata(8);
counter=counter*10+8;
break;
case 9:
senddata(9);
counter=counter*10+9;
break;
case 10:
for(i=0;i<8;i++)
senddata(10);
counter=0;
counter_save=0;
break;
case 11:
for(i=0;i<8;i++)
senddata(10);//清除屏幕
if(XFLAG==0)//查询是加法还是减法
counter_save=counter_save+counter;
if(XFLAG==1)
counter_save=counter_save-counter;
counter=counter_save;
for(i=0;i<8;i++)
{
cosave[i]=(counter_save%10);
counter_save/=10;
}
for(i=7;i>=0;i--)
{
if(cosave[i]>0)
{
a=i;
break;
}
}
for(;a>=0;a--)
{
senddata(cosave[a]);
}
break;
case 12:
XFLAG=0;
counter_save=counter;//保存加数
counter=0;//清除原来计数用来记录下一个输入的加数
for(i=0;i<8;i++)
senddata(10);//清除屏幕以便显示下一个加数
break;
case 13:
XFLAG=1;//减法标志位有效
counter_save=counter;//保存被减数
counter=0;//清除计数用来储存减数
for(i=0;i<8;i++)
senddata(10);//清除屏幕用来显示下一个减数
break;
case 14:
for(i=0;i<8;i++)
senddata(10);//清除屏幕可以显示以下的数据
counter=counter*10+1;
counter_save=counter;
for(i=0;i<8;i++)
{
cosave[i]=counter_save%10;
counter_save/=10;
}
for(i=7;i>=0;i--)
{
if(cosave[i]>0)
{
a=i;
break;
}
}
for(;a>=0;a--)
{
senddata(cosave[a]);
}
break;
case 15:
for(i=0;i<8;i++)
senddata(10);//清除屏幕可以显示以下的数据
counter=counter*10-1;
counter_save=counter;
for(i=0;i<8;i++)
{
cosave[i]=counter_save%10;
counter_save/=10;
}
for(i=7;i>=0;i--)
{
if(cosave[i]>0)
{
a=i;
break;
}
}
for(;a>=0;a--)
{
senddata(cosave[a]);
}
break;
}
}
//----------------------------主函数--------------------------------------
void main(void)
{
counter=0;
counter_save=0;
for(k=0;k<8;k++)
senddata(10);
while(1)
{
keyvalue=keyscan();
if(keyvalue>=0&&keyvalue<=15)
keyprocess(keyvalue);
delay(600);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -