#include "reg51.h"
typedef unsigned int uint;
typedef unsigned char uchar;
sbit LED1=P0^0;
sbit LED2=P0^1;
sbit LED3=P0^2;
sbit LED4=P0^3;
/*sbit LED5=P0^4;
sbit LED6=P0^5;
sbit LED7=P0^6;
sbit LED8=P0^7;
sbit LED9=P2^0;
sbit LED10=P2^1;
sbit LED11=P2^2;
sbit LED12=P2^3;
sbit LED13=P2^4;
sbit LED14=P2^5;
sbit LED15=P2^6;
sbit LED16=P2^7;*/
//延时函数 毫秒延时
void delay(uint xms)
{
int x,y;
for(x=0;x<xms;x++)
for(y=130;y>0;y--);
}
//键盘扫描函数
void scankey(void)
{
uchar temp=0;
/******************扫描第一行*********************/
P1=0xfe;//选择第一行 1111 1110
temp=P1;//把P0口的电平变化实时给temp
temp=temp&0xf0;//屏蔽低四位,只考虑高四位控制的列
if(temp!=0xf0)
{
delay(10);
temp=P1;//把P0口的电平变化实时给temp
temp=temp&0xf0;//屏蔽低四位,只考虑高四位控制的列
if(temp!=0xf0)
{
temp=P1;//由于temp被前面的0xf0改变了,所以在此需要再获得一次P0的值
switch(temp)
{
case 0x7e:LED1=~LED1 ; break;//第一行第一列按键按下
case 0xbe:LED2=~LED2 ; break;//第一行第二列按键按下
case 0xde:LED3=~LED3 ; break;//第一行第三列按键按下
case 0xee:LED4=~LED4; break;//第一行第四列按键按下
}
while(temp!=0xf0)//按键释放程序
{
temp=P1; //再次读取P0的值,看看有没有释放,如果释放高四位全是1
temp=temp&0xf0;
}
}
}
}
void main()
{
while(1)
{
scankey();
}
}
|