/******************************************************************/
/* 按键状态显示试验 *
/* *
/* 连接方法:连接JP8(P1)与JP4(按钮接口) *
/* JP11 (P2)与JP1(LED接口) *
*
/*按键则点亮LED灯,8路指示灯接p0口 *
/******************************************************************/
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp;
uchar key=233;
void delay(uchar x)
{ uchar j;
while((x--)!=0)
{ for(j=0;j<125;j++)
{;}
}
}
void keyscan(void)
{
temp = 0;
P1=0xF0; //高四位输入 行为高电平 列为低电平
delay(1);
temp=P1; //读P1口
temp=temp&0xF0; //屏蔽低四位
temp=~((temp>>4)|0xF0);
if(temp==1) // p1.4 被拉低
key=0;
else if(temp==2) // p1.5 被拉低
key=1;
else if(temp==4) // p1.6 被拉低
key=2;
else if(temp==8) // p1.7 被拉低
key=3;
P1=0x0F; //低四位输入 列为高电平 行为低电平
delay(1);
temp=P1; //读P1口
temp=temp&0x0F;
temp=~(temp|0xF9);
if(temp==2) // p1.1 被拉低
key=key+0;
else if(temp==4) // p1.2 被拉低
key=key+4;
if(key == 0) P0 = 0xFE;
if(key == 1) P0 = 0xFD;
if(key == 2) P0= 0xFB;
if(key == 3) P0 = 0xF7;
if(key == 4) P0 = 0xEF;
if(key == 5) P0 = 0xDF;
if(key == 6) P0 = 0xBF;
if(key == 7) P0 = 0x7F;
}
/*************************************************************/
/* */
/*判断键是否按下 */
/* */
/*************************************************************/
void keydown(void)
{
P1=0xF8;
if(P1!=0xF8) //判断按键是否按下 如果按钮按下 会拉低P1其中的一个端口
{
keyscan();
}
}
main()
{
while(1)
{
P0 = 0xFF;
keydown();
}
}
这个程序我是任选矩阵按键中的两行控制八个LED灯,我选的是前两行。烧录完成后第四个和第八个按键按下去灯不亮,其他灯都亮。什么情况?求解释。 |