📄 key_new.c
字号:
//-------------------------------- ------------------------------------------------------------------
#include<reg51.h>
#include<key.h>
#define uchar unsigned char
#define uchar unsigned char
#define uint unsigned int
void delays(void);
uchar kbscan(void);
bit flag_P2;
/***********************************
//函数名称: kbscan 键盘扫描子程序
//传递参数: 无
//返 回 值: 无
//函数功能: 判断是否有键按下,有返回键值,没有返回0
//函数说明: 先根据列判断是否有键按下,没有返回0,有,则逐行扫描以确定按键所在的行,再确定按键所在列
// 从而最终确定该按键。
***********************************/
uchar kbscan(void)
{
uchar sccode,recode;
P3=0x0f; //置所有行为低电平,行扫描,列线输入(此时)
P2=0x00;
//if((P2&0x02)!=0x020)
// delays();
// if((P2&0x02)!=0x02)
if((P3&0x0f)!=0x0f) //判断是否有有键按下(读取列的真实状态,若第4列有键按下则P1的值会变成0111 0000),有往下执行
{
delays(); //延时去抖动(10ms)
if((P3&0x0f)!=0x0f) //再次判断列中是否是干扰信号,不是则向下执行
{
sccode=0xef; //逐行扫描初值(即先扫描第1行)
while((sccode&0x80)!=0) //行扫描完成时(即4行已经全部扫描完成)sccode为1110 1111 停止while程序
{
P3=sccode; //输出行扫描码
if ((P3&0x0f)!=0x0f) //本行有键按下(即P1(真实的状态)的高四位不全为1)
{
recode=(P3&0x0f)|0xf0; //列
//if(flag_P2==0){sccode=0xff;}
return((~sccode)+(~recode)); //返回行和列
}
else //所扫描的行没有键按下,则扫描下一行,直到4行都扫描,此时sccode值为1110 1111 退出while程序
{
sccode=(sccode<<1)|0x01;//行扫描码左移一位
if(sccode==0x7f)
{
P2=0x00;
flag_P2=0;
}
else
{
P2=0xff;
flag_P2=1;
}
}
}
}
}
else
{
return 0; //无键按下,返回0
}
}
/***********************************
//函数名称: delays 键消抖的延时函数
//传递参数: 无
//返 回 值: 无
//函数功能: 延时去抖
//函数说明: 无
***********************************/
void delays(void)
{
uchar i;
for(i=300;i>0;i--);
}
//--------------------------------------------------------------------------------------------------
// 函数名称: kbscan 键盘扫描子程序
// 函数功能: 判断是否有键按下,有返回键值,没有返回0
// p1的高四位为列,低四位为行 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0
// 列4 列3 列2 列1 行4 行3 行2 行1
// 过程:先根据列判断是否有键按下,没有返回0,有,则逐行扫描以确定按键所在的行,再确定按键所在列
// 从而最终确定该按键。
//--------------------------------------------------------------------------------------------------
uchar kbscan1(void)
{
uchar sccode,recode;
P3=0xf0; //置所有行为低电平,行扫描,列线输入(此时)
P2=0x0f;
if((P2&0x0f)!=0x0f)
{
delays(); //延时去抖动(10ms)
if((P2&0x0f)!=0x0f) //再次判断列中是否是干扰信号,不是则向下执行
{
sccode=0xFE; //逐行扫描初值(即先扫描第1行)
while((sccode&0x10)!=0) //行扫描完成时(即4行已经全部扫描完成)sccode为1110 1111 停止while程序
{
P3=sccode; //输出行扫描码
if ((P2&0x0f)!=0x0f) //本行有键按下(即P1(真实的状态)的高四位不全为1)
{
recode=(P3&0x0f)|0xf0;//列
return((~sccode)); //返回行和列
}
else //所扫描的行没有键按下,则扫描下一行,直到4行都扫描,此时sccode值为1110 1111 退出while程序
{
sccode=(sccode<<1)|0x01;//行扫描码左移一位
}
}
}
}
if((P3&0xf0)!=0xf0) //判断是否有有键按下(读取列的真实状态,若第4列有键按下则P1的值会变成0111 0000),有往下执行
{
delays(); //延时去抖动(10ms)
if((P3&0xf0)!=0xf0) //再次判断列中是否是干扰信号,不是则向下执行
{
sccode=0xFE; //逐行扫描初值(即先扫描第1行)
while((sccode&0x10)!=0) //行扫描完成时(即4行已经全部扫描完成)sccode为1110 1111 停止while程序
{
P3=sccode; //输出行扫描码
if ((P3&0xf0)!=0xf0) //本行有键按下(即P1(真实的状态)的高四位不全为1)
{
recode=(P3&0xf0)|0x0f; //列
return((~sccode)+(~recode)); //返回行和列
}
else //所扫描的行没有键按下,则扫描下一行,直到4行都扫描,此时sccode值为1110 1111 退出while程序
{
sccode=(sccode<<1)|0x01;//行扫描码左移一位
}
}
}
}
else
{
return 0; //无键按下,返回0
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -