C51 单片机P1.0-P1.4口用作按键输入时,使用switch语句怎么定义?

我要用到P1.0-P1.4口这五个IO口作为按键检测使用,(P1.5-P1.7用作其它控制),如果我要用switch语句来定义P1.0-P1.4,该怎么定义呢?可说明详细点呢?
例如:
switch(P1)
{
case 0xfe: Temp = 6; break;// 1111 1110
case 0xfd: Temp = 9; break;// 1111 1101
case 0xfb: Temp = 12; break;// 1111 1011
case 0xf7: Temp = 15; break;// 1111 0111
case 0x7f: Temp = 18; break;// 1110 1111
case 0xbf: Temp = 21; break;// 1101 1111
case 0xdf: Temp = 24; break;// 1011 1111
case 0xef: Temp = 27; break;// 0111 1111
case 0xee: Temp = 30; break;// 1110 1110
case 0xde: Temp = 33; break;// 1101 1110
case 0xbe: Temp = 36; break;// 1011 1110
case 0x7e: Temp = 39; break;// 0111 1110
default: Temp = 10;

}

如果我按以上这么定义,只要P1.5-P1.7口有功能,P1口出来的就是default的值了,有没办法只对前面5位作定义呢?谢谢!

你好 简单的键功能用if语句较好如
if(key0==0)//P1.0为0
delay;//延时10ms
if(key0==0)//P1.0为0 消抖再次确认
程序语句。。。。
if(key1==0) //P1.1为0
同上。。。。
。。。。。
共5个键分别检测,执行。对端口要求简单,也不会受邻居的影响,或干扰邻居(如你的P1.7端口)。你的问题是用switch() 语句对一个寄存器判断(P1口也是一个寄存器),可以这样:
KeyScan()
{
unsigned char keyvalue; //定义键盘数据缓存
keyvalue=P1;
keyvalue=keyvalue|0x7f; //0为按下,屏蔽高3位
if(keyvalue!=0xff) //键按下判断
{
DelayMs(10); //延时消抖,键按下判断
keyvalue=P1;
keyvalue=keyvalue|0x7f; //0为按下,屏蔽高3位
if(keyvalue!=0xff) //有键按下,处理
{
switch(keyvalue)
{
case 0xfe:功能 1;break;
case 0xfd:功能 2;break;
case 0xfb:功能 3;break;
case 0xf7:功能 4;break;
case 0xef:功能 5;break;
default:break; // 非以上数据直接跳出
}
}
}
}追问

谢谢您详细的回复,由于用if语句太长了,我想用switch可能会简单点喔!

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2018-05-07
可以先定义一个变量temp1
令temp1 = 0x1f&P1 ; 只取P1低5位的值
再对temp1 进行switch运算
即switch(temp1)
这样就可以不管P1.5-P1.7的状态了本回答被提问者和网友采纳
第2个回答  2012-11-12
unsigned char keyval;
keyval=P1|0xe0;
switch(keyval)
{
case 0xfe: Temp = 6; break;// 1111 1110
case 0xfd: Temp = 9; break;// 1111 1101
case 0xfb: Temp = 12; break;// 1111 1011
case 0xf7: Temp = 15; break;// 1111 0111
case 0x7f: Temp = 18; break;// 1110 1111
case 0xbf: Temp = 21; break;// 1101 1111
case 0xdf: Temp = 24; break;// 1011 1111
case 0xef: Temp = 27; break;// 0111 1111
case 0xee: Temp = 30; break;// 1110 1110
case 0xde: Temp = 33; break;// 1101 1110
case 0xbe: Temp = 36; break;// 1011 1110
case 0x7e: Temp = 39; break;// 0111 1110
default: Temp = 10;

}
第3个回答  2012-11-12
可以,用p1和00011111做与运算后再去判断,这样的话不管p1口高三位不管是什么都会被屏蔽掉了,可以另做它用

C51 单片机P1.0-P1.4口用作按键输入时,使用switch语句怎么定义?
共5个键分别检测,执行。对端口要求简单,也不会受邻居的影响,或干扰邻居(如你的P1.7端口)。你的问题是用switch() 语句对一个寄存器判断(P1口也是一个寄存器),可以这样:KeyScan(){ unsigned char keyvalue; \/\/定义键盘数据缓存 keyvalue=P1;keyvalue=keyvalue|0x7f; \/\/0为按下,屏...

利用51单片机,4个数码管设计一个计时器,要求在数码管上显示的数据从0开...
P1.4--P1.7:单片机的P1口,和反光二极管L1--L4相连,通过单片机的P1.4--P1.7控制,用以显示秒表和时钟的时间变化。(3)功能简介LED显示模块与单片机的连接中,对LED显示模块的读写和字位、字段通道的选择是通过单片机的P2.6、P2.7口完成。其中,P2.6、P2.7口的片选信号需要和读写信号做一定的逻辑操作,以保证字位和...

C51单片机用IO口做为几个按键的控制,现在想用4X4键盘控制,请问下面显示...
这样我们可以先识别K01、K02、K03、K04、K05,若没有按键按下然后再和思路四的设计一样去识别其他按键。但这样存在一个问题,如果IO1配置为0,IO5读到0,那么怎么知道是K51按下还是K05按下呢,这里只需要在程序里做下判断,先判断下是不是K05按下,若不是就是K51,因为按键K01、K02、K03、K04、...

有c51单片机的一些项目代码吗?
4. P05 端口按键:增加;P04端口按键:减少[注:AT89S51使用12M晶振]===*\/\/*#include <AT89x51.h>*\/#include <REGX51.H>#include <string.h>#include<intrins.h>#define LCM_RS P2_0 \/\/定义引脚#define LCM_RW P2_1#define LCM_E P2_2#define LCM_Data P0#define Busy 0x80 \/\/用于检测LCM状态字...

怎样用51单片机实现累加计时和倒计时,并用六个共阴极数码管显示出来。用...
L1--L4:发光二极管,通过单片机的P1.4--P1.7控制,用以显示秒表和时钟的时间变化。BUZZER:扬声器,在程序规定的情况下,发出声音,提示计时完毕。74LS373:地址锁存器,将P0口的地址和数据分开,分别输入到2764的数据和地址端口。2764:EPROM,为单片机提供外部的程序存储区。开关K0、K1、K2分别调整秒、分、时。按键RESET:...

相似回答