⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key2.c

📁 key多种按键方式(单机和连击 短击和长击 单击和双击)
💻 C
字号:
//////////////////////////////////////////////////////


///注意分时调度机制

//矩阵第一列4个键:单机和连击 P3^4接地
//独立键盘第2个键:短击和长击
//独立键盘第3个键:单击和双击

///////////////////////////////


#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit dula=P2^6;
sbit wela=P2^7;

uchar flag8ms;
bit a;
uchar keyzhi;
uchar key0;
uchar beifenkey;
uchar shumaguan=0;
uchar yanshi=20;
uchar changjiyanshi=30;
uchar shuangjiyanshi=30;
bit shuangjiflag,shuangjiflag1;
uchar aa=0;
uchar count=0;

uchar code table[]={	   //数码管 
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}

void fun1();
void fun2();
void funduanji();
void funchangji();
uchar getkey()	;
void key();
void display(uchar shi,uchar ge);


void init()
{	
	P1=0xff;
	P3=0xef;
	TMOD=0x11;
	TH0=(65536-8000)/256;
	TL0=(65536-8000)%256;

	EA=1;
	ET0=1;
	TR1=1;
	TR0=1;
}

void main()
{
	init();
	while(1)
	{
		display(shumaguan/16,shumaguan%16);		  //不能写在key()里面 
		key();
		
	}
}

uchar getkey()	                   //取键值
{
	key0=P3;

	switch(~key0)           //取反了
	{
		case 0x11:
			keyzhi=1;
			break;
		case 0x12:
			keyzhi=2;
			break;
		case 0x14:
			keyzhi=3;
			break;
		case 0x18:
			keyzhi=4;
			break;
		case 0x30:
			keyzhi=5;
			break;
		case 0x50:
			keyzhi=6;
			break;
		default:
			keyzhi=0;	
			break;
	}
	return keyzhi ;
}

void key()
{
	if(flag8ms==1) //分时调度机制
	{
		flag8ms=0;
		if(getkey())
		{
			if(beifenkey==getkey()) //通过备份值检验来完成消抖
			{
				 switch(beifenkey)
				 {
				 	case 5:		  //短击与长击
						if(changjiyanshi!=0)	//为了完成长击后使changjiyanshi保持0
				  		{
					   		changjiyanshi--;
				 	   		if(changjiyanshi==0)
							{
						    	funchangji();
							}
						}
						break;
					case 6:					   //单击与双击	   注意 shuangjiflag shuangjiflag1 aa count 的重置
						
						if(shuangjiflag1==1)		 //shuangjiflag1第一次按下抬起后标志
						{
							shuangjiflag=0;
							aa=1;
						}
						else  shuangjiflag=1;
										


					default:
						yanshi-- ;              //连击的延时计时 
				 		if(!yanshi)
				 		{
				 			fun1();
							fun2();
							yanshi=20;
				 		}
						break;
				 }
				
			}
			else
			{								//勿忘更新备份
				beifenkey=getkey();
			}
				
		}		
		else
		{
			if(beifenkey==5)
			{							  //确定短击
				beifenkey=0;
				if(1<changjiyanshi<24)
				{	
					changjiyanshi=25;
					funduanji();
				}
			}
			if(beifenkey==6)
			{
				if(shuangjiflag==1)		      //第一次按下后标志
				{
					shuangjiflag=0;
					shuangjiflag1=1;
					aa=0;
					TH1=(65536-10000)/256;
					TL1=(65536-10000)%256;
					ET1=1;
				}			
			}

		}

	}
}

void funchangji()
{
	P1=0x00;
	shumaguan=-1;
}
void funduanji()
{
	P1--;
	shumaguan++;
}

void fun1()
{
	switch(beifenkey)
	{
		case 1:
			P1--;
			break;
		case 2:
			P1++;
			break;
		case 3:
			P1=~P1;
			break;
		case 4:
			if(P1==0xff)
			{
				P1=0;
			}
			else P1=0xff;
			break;
	}
}

void fun2()
{
	 switch(beifenkey)
	{
		case 1:
			shumaguan++;
			break;
		case 2:
			shumaguan--;
			break;
		case 3:
			shumaguan=256-shumaguan;
			break;
		case 4:
			if(shumaguan==0)
			{
				shumaguan=0xff;
			}
			else shumaguan=0;
			break;
	}
	
}
void display(uchar shi,uchar ge)
{
	dula=1;
	P0=table[shi];
	dula=0;
	P0=0xff;
	wela=1;		
	P0=0xfe;
	wela=0;
	delay(1);
	
	dula=1;
	P0=table[ge];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfd;
	wela=0;
	delay(1);	
}

void timer0() interrupt 1
{
	TH0=(65536-8000)/256;
	TL0=(65536-8000)%256;
	flag8ms=1;
}
void timer1() interrupt 3
{
	TH1=(65536-10000)/256;
	TL1=(65536-10000)%256;
	count++;
	if(count==80)
	{
		count=0;
		shuangjiflag1=0;		//否则不能进行下一次按键动作
		ET1=0;
		if(aa==1)
		{
			P1--;
		}
		else if(aa==0)
		{
			P1++;
		}
		aa=0;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -