#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();
}
}
|