📄 keyscan.c
字号:
/******************************************************
说 明: 4*4扫描程序,能自动读取键值,输出对应的值
P10-P14接列(读状态),P14_P17接行(送扫描)
功 能: 实现键盘扫描功能
时 间: 2007/03/14
作 者: 李早红
******************************************************/
/******************************************************
修改时间:2007/03/15
这段程序实现4*4键盘的基本功能,如检查是否有按键,输出自定义的键盘值
输出字符串等功能:
有两个能在主程序里调用的函数:
1.unsigned char keyscan(void) //按键扫描程序,根据反回值的不同,确定是否有键按下
当键值为0表示没有键按下。键值为1~16则对应相应的键值按下。
2.keystring(unsigned char *keystingvalue) //按键字符串输入
有两个参数。第一个为要输入字符要存入的数组,另一个为确定输入字符串的长度。调用此函数据前要确认有键按下
********************************************************/
/******************************************************
函数名称:delay()
功 能:实现延时
入口参数:time
出口参数:无
********************************************************/
void delay(unsigned int delaytime)
{
unsigned char i,j;
for(i=0;i<delaytime;i++)
{
for(j=0;j<200;j++);
}
}
/******************************************************
函数名称:keyscan()
功 能:认键盘直的按下,并返回键值
入口参数:无
出口参数:keyvalue
********************************************************/
unsigned char keyscan(void)
{
unsigned char temp,keyvalue=0;
P1=0x0f;
delay(2); //延时 可以不要
temp=P1;
if(temp!=0x0f) //有键按下
{
delay(1);
temp=P1;
if(temp!=0x0f) //去抖动
{
P1=0x0ef;
temp=P1;
switch (temp&0x0f) //计算键值
{
case 14: keyvalue=1; return keyvalue;
case 13: keyvalue=2; return keyvalue;
case 11: keyvalue=3; return keyvalue;
case 7: keyvalue=4; return keyvalue;
}
P1=0x0df;
temp=P1;
switch(temp&0x0f)
{
case 14: keyvalue=5; return keyvalue;
case 13: keyvalue=6; return keyvalue;
case 11: keyvalue=7; return keyvalue;
case 7: keyvalue=8; return keyvalue;
}
P1=0x0bf;
temp=P1;
switch(temp&0x0f)
{
case 14: keyvalue=9; return keyvalue;
case 13: keyvalue=10; return keyvalue;
case 11: keyvalue=11; return keyvalue;
case 7: keyvalue=12; return keyvalue;
}
P1=0x07f;
temp=P1;
switch(temp&0x0f)
{
case 14: keyvalue=13; return keyvalue;
case 13: keyvalue=14; return keyvalue;
case 11: keyvalue=15; return keyvalue;
case 7: keyvalue=16; return keyvalue;
}
}
}
keyvalue=0;
return keyvalue; //没有键按下
}
/******************************************************
函数名称:valuechange()
功 能:键值转换
入口参数:keyrealvalue
出口参数:keydisvalue
********************************************************/
#define KEY_0 0 //定义键值
#define KEY_1 1
#define KEY_2 2
#define KEY_3 3
#define KEY_4 4
#define KEY_5 5
#define KEY_6 6
#define KEY_7 7
#define KEY_8 8
#define KEY_9 9
#define KEY_ADD 10
#define KEY_SUB 11
#define KEY_MUL 12
#define KEY_DIV 13
#define KEY_CLO 14
#define KEY_EQU 15
unsigned char valuechange (unsigned char keyrealvalue)
{
unsigned char i;
code unsigned char keydisvalue[]={KEY_7,KEY_8,KEY_9,KEY_DIV,KEY_4,KEY_5,KEY_6,KEY_MUL,KEY_1,KEY_2,KEY_3,KEY_SUB,KEY_CLO,KEY_0,KEY_EQU,KEY_ADD};
for(i=1;i<=16;i++)
{
if(i==keyrealvalue)
{
return keydisvalue[i-1];
}
}
}
/******************************************************
函数名称:keystring()
功 能:输入一串字符
入口参数:*keystringvalue
出口参数:无
说书 明:调用此函数之前要确认有键按下。
********************************************************/
keystring(unsigned char *keystringvalue) //调用此函数之前要确认有键按下。
{
unsigned char i=0,temp=0;
// for(i=20;i>0;i--) //数组清零
// {
// keystringvalue[i]=0;
// }
while(1)
{
while(keyscan()==0); //等待按键
temp=keyscan();
if(temp==KEY_EQU)
{
keystringvalue[i]='\0';
return;
}
keystringvalue[i]=valuechange(temp)+48; //对应CGROM码
while(keyscan()!=0); //松开按键
i++;
}
}
/********2007-3-15 16:48
//#include <reg51.h>
main()
{
delay(10);
while(1)
{
unsigned char b,a,keystringvalue[10],*stringlongth;
unsigned char i;
a=keyscan();
b=valuechange(a);
while(1)
{
//P2=b;
if(keyscan()!=0)
{
*stringlongth=0;
keystring(keystringvalue,stringlongth);
//P1=0x0f;
for(i=0;i<*stringlongth;i++)
{
P2=keystringvalue[i];
delay(50);
}
}
}
}
}
*********/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -