0
点赞
收藏
分享

微信扫一扫

CT107D单片机按键状态机实战

文风起武 2022-03-12 阅读 49

CT107D单片机按键状态机实战

#include <STC15F2K60S2.H>
#include <main.h>
#define XBYTE(address,data) P2 = ((P2&0x1f)|address);P0 = data;P2 = P2&0x1f; //关闭外设
                 


unsigned char flag = 0;
unsigned char Key_Num;
unsigned char i;
bit GN = 0;
void key();
void time0();
void main()
{
	XBYTE(0xA0,0x00);
	XBYTE(0x80,0xff);
	time0();
	while(1)
	{
		key();
//		XBYTE(0x80,P0&(~0x40));
		if(Key_Num == '7')
		{
			XBYTE(0x80,P0&(~0x40));			//控制一个灯亮
		} else
		{								    
			XBYTE(0x80,P0|0x40);			//控制一个灯灭
		}
		if(Key_Num == '6')
		{
			XBYTE(0x80,P0&(~0x20));	
		}else
		{
			XBYTE(0x80,P0|0x20);	
		}
		if(Key_Num == '5')
		{
			XBYTE(0x80,P0&(~0x10));	
		}else
		{
			XBYTE(0x80,P0|0x10);
		}
//		if(Key_Num == '4')
//		{
//			XBYTE(0x80,P0&(~0x08));	
//		}else
//		{
//			XBYTE(0x80,P0|0x08);
//		}
		if(Key_Num == '4')				    //长按--短按对应的状态
		{
			if(GN == 1)
			{
				XBYTE(0x80,0x00);	
			}
			if(GN == 0)
			{
			   XBYTE(0x80,0xff);
			}
				
		}
		
	}	
	
	
	 
}
void key()
{
	static unsigned char temp,state=0;
	if(!flag)return;
	else flag = 0;
	if(!P30) temp = 1;
	else if(!P31)  temp = 2;	
	else if(!P32)  temp = 3;
	else if(!P33)  temp = 4;
	else temp = 0;
	switch(state)
		{
			case 0:   //状态1 判断是否有键按下
			{
			 	if(temp != 0) state = 1;
			}
			break;
			case 1:   //状态2 有键按下并读取数据
			{
				if(temp == 0) state = 0;	  //10ms的消抖
				else
				{
					if(temp == 1)  //按键S7	  //短S7按键处理down
					{
						Key_Num = '7';
						state = 2;
					}
					if(temp == 2)  //按键S6	   //短S6按键处理down
					{
						Key_Num = '6';
						state = 2;
					}
					if(temp == 3)  //按键S5	   //短S5按键处理down
					{
						Key_Num = '5';
						state = 2;
					}
					if(temp == 4)  //按键S4	   //短S4按键处理down
					{
						
						Key_Num = '4';
						state = 2;
					}	
				}	
			}
			break;
			case 2:			 //状态3 松开检测
			{
						i++;					 //长按1秒
						if(i > 100)
						{
							i = 0;
							if(GN == 1)		     //标志位
							{
								GN = 0;
							}else
							{
								GN = 1;
							}	 
						}
				if(temp == 0)
				{
					state = 0;		
				}
			} break;

		}
		
}
   

void time0()					 //1ms
{
	TMOD = 0x01;
	TL0	= (65536-1000)%256;
	TH0 = (65536-1000)/256;
	TF0 = 0;
	TR0 = 1;
	ET0 = 1;
	EA = 1;
}
void time_0() interrupt 1
{
	static unsigned char num;
	TL0	= (65536-1000)%256;
	TH0 = (65536-1000)/256;
	if(num<=1000)
	{
		num++;
	}else
	{
		num = 0;
	}
	if(num%10==0) flag = 1;

//
//	if(num++ >= 10)
//	{
//			
//		num = 0;
//		flag = 1;
//	}




}

举报

相关推荐

0 条评论