//按下键灯亮，再按灯灭，如此反复
//注意：本实验是对独立键盘操作，需要通过4X4KEY/4KEY跳线帽选择使用独立键盘
/********************头文件	********************/
#include"regx52.h"		   
#define uchar unsigned char
#define uint unsigned int

sbit key1=P3^0;			//接到Ka键盘
sbit key2=P3^1;			//接到Kb键盘
sbit key3=P3^2;			//接到Kc键盘
sbit key4=P3^3;			//接到Kd键盘
sbit ledlock=P2^0;

/*******************毫秒级延时函数********************/
void delayms(uint ms)
{
	uchar b;
	while(ms--)
	{
		for(b=0;b<125;b++);
	}
}

/********************键盘扫描处理函数********************/
void keyscan()
{
	key1=1;					//防止I0被干扰,所以判断前再置一次高电平
	if(key1==0)				//如果按下（会将IO口拉为低电平）所以检测低电平
	{
		delayms(10);		//延时10MS  作用为消抖  
		if(key1==0)			//再判断是否按下
		{
			while(key1==0);	//while(key1==0);等效while(!key1);		
							//此处为松手检测,当KEY1=1的时候（松手）  
							//才执行下面的语句,为0则一直停止在此处
			P0_0=~P0_0;		//端口电平取反	（P0口灯亮灭交替）
		}
   
	}
	key2=1;					//防止I0被干扰,所以判断前再置一次高电平
	if(key2==0)				//如果按下（会将IO口拉为低电平）所以检测低电平
	{
		delayms(10);		//延时10MS  作用为消抖  
		if(key2==0)			//再判断是否按下
		{
			while(key2==0);	//while(key2==0);等效while(!key2);		
							//此处为松手检测,当KEY1=1的时候（松手）  
							//才执行下面的语句,为0则一直停止在此处
			P0_2=~P0_2;		//端口电平取反	（P0口灯亮灭交替）
		}
   
	}
	key3=1;					//防止I0被干扰,所以判断前再置一次高电平
	if(key3==0)				//如果按下（会将IO口拉为低电平）所以检测低电平
	{
		delayms(10);		//延时10MS  作用为消抖  
		if(key3==0)			//再判断是否按下
		{
			while(key3==0);	//while(key3==0);等效while(!key3);		
							//此处为松手检测,当KEY1=1的时候（松手）  
							//才执行下面的语句,为0则一直停止在此处
			P0_4=~P0_4;		//端口电平取反	（P0口灯亮灭交替）
		}
   
	}
	key4=1;					//防止I0被干扰,所以判断前再置一次高电平
	if(key4==0)				//如果按下（会将IO口拉为低电平）所以检测低电平
	{
		delayms(10);		//延时10MS  作用为消抖  
		if(key4==0)			//再判断是否按下
		{
			while(key4==0);	//while(key4==0);等效while(!key4);		
							//此处为松手检测,当KEY1=1的时候（松手）  
							//才执行下面的语句,为0则一直停止在此处
			P0_6=~P0_6;		//端口电平取反	（P0口灯亮灭交替）
		}
   
	}
}

/*******************************主函数*******************/
void main()
{
	ledlock=0;					//把LED开关开启
	while(1)
	{	
	 	keyscan();				//调用键盘扫描函数
	}
}