1. 请问单片机4*4矩阵键盘如何检测并返回多个按键按下的键值和多个按键抬起的键值(注:不使用死循环)
你按键要是没有松手检测的话,按键按下后程序会执行一次按键一的数据,然后在执行按键2的数据,按键1和按键2就成了循环检测了,执行两个按键事件,如果按键有松手检测的话,例如按键1按下,程序会在按键1哪里等待按键松手后,才会跳出按键,否则按键会一直死在哪里等待按键松手,希望我的回答对你有帮助!
那就用这种方法解决:
if(keyxxx == 0)
{
if(++i <= 10)
return;
//
if(keyxxx == 0)
{
i = 0;
//处理按键程序
}
}
if(keyxxx == 0)
{
if(++y <= 10)
return;
//
if(keyxxx == 0)
{
y = 0;
//处理按键程序
}
}
2. C51单片机4X4矩阵键盘检测程序问题
可以参考:
http://hi..com/%d7%f6%b6%f8%c2%db%b5%c0/blog/item/ef086222268d4f4eac34de59.html
程序中,读取4*4矩阵键盘的函数,可以得到0~f,和16。
当读出为16的时候,即是按键放手了,可以执行对应的功能程序。
3. 求助程序:51单片机矩阵键盘是否按下检测程序
/**************************************************************************************
* 矩阵按键实验 *
实现现象:下载程序后数码管显示0,按下矩阵按键上的按键显示对应的数字
S1-S4:0-3
S5-S8:4-7
S9-S12:8-B
S13-S16:C-F。
注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
#define GPIO_DIG P0
#define GPIO_KEY P1
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 KeyValue; //用来存放读取到的键值
u8 code smgan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : KeyDown
* 函数功能 : 检测有按键按下并读取键值
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void KeyDown(void)
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//读取按键是否按下
{
delay(1000);//延时10ms进行消抖
if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
{
//测试列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
//测试行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测
{
delay(1000);
a++;
}
}
}
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
LSA=0; //给一个数码管提供位选
LSB=0;
LSC=0;
while(1)
{
KeyDown(); //按键判断函数
GPIO_DIG=smgan[KeyValue]; //
}
}
4. 单片机上矩阵键盘出现问题
你应该把P1.0设置成0输出,P1.2
P1.3
P1.1输出为1.再依次检测P1.4-P1.7
再把P1.1设置成0输出,P1.2
P1.3
P1.0输出为1.再依次检测P1.4-P1.7
再把P1.2设置成0输出,P1.1
P1.3
P1.0输出为1.再依次检测P1.4-P1.7
再把P1.3设置成0输出,P1.2
P1.1
P1.0输出为1.再依次检测P1.4-P1.7
这样扫描键盘就可以了
5. 单片机矩阵键盘扫描方式
首先单片机引脚默认输出高电瓶的。令控制某一行(假设第n行)键盘的引脚为0,然后按下该行的某一键,然后一列一列的检查低电平(假设检测出为第m列),由此判断出按下的为第nm键。思路就是令行为低电平,检查列(当然反之也可以)
6. 单片机矩阵键盘松手检测问题,怎样加松手检测
display()没问题,但是键盘扫描的时候和消抖都是要花时间的,要综合起来考虑问题,动态扫描最好用定时中断方式
7. 51单片机4 x 4矩阵键盘的检测中P3=0xfe,temp=P3;看解释ms第二步是把按下去的键P3赋给temp 但p3不是被
这个问题是这样的,首先单片机的c语言和电脑的编译器不是一样的,你要考虑硬件,下面步入正题:
P3=0xfe; //P3等于0xfe
temp=P3; //temp等于P3等于0xfe
temp=temp&0xf0; //到这里,如果你按下矩阵键盘的第一个键,那么temp等于0xee
temp=0xee&0xf0=0xe0
while(temp!=0xf0) //你这里打错了,不是while语句是if语句,现在temp的值是0xe0
0xe0不等于0xf0,所以进入语句内部
{
delay(5); //去抖动
temp=P3; //现在赋值,这是你还在按着第一个键,那么P3=0xee,所以temp等于0xee
temp=temp&0xf0; //temp=0xee&0xf0=0xe0,“看这里,这是temp=0xe0”
while(temp!=0xf0) //这里还是写错了,是if语句,0xe0不等于0xf0再次进入语句内部
{
temp=P3;//在没执行这一步的时候,temp的值是0xe0,如果不把P3的值赋予temp
那么当进入switch语句后就没有相应的case,这是你还在按键,那么
P3=0xee,所以temp也等于0xee,然后进入switch语句判断,进入
相应的case
switch(temp)
8. 51单片机矩阵键盘检测方面的问题
第一个问题,应该是考虑如果先开锁存器,在那一时刻,P0的值还是上一次给P0赋的值,下在一条语句才将这次的值给P0,这样会造成数码管的余辉,静态显示的时候,因为太快看不到,动态显示时,就会比较明显了。第二个问题他的程序应该检测的是高四位,是否被拉低,因为temp和0xf0与,低四位不管是什么,都是0,只有高四位的值从1,变为0,0xf0才会发生改变。