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

📄 test51.c.bak

📁 单片机键盘输入扫描方式以及防抖处理,此方法为普遍输入方法.
💻 BAK
字号:
#include <test51.h>
/**********************************************************************
函数功能:	定时器中断函数(扫描键盘)(10ms 16位定时)
入口参数:	无
出口参数:	无
***********************************************************************/
void Time0_Func() interrupt 1
{
	TH0=(0xffff-9259)/256;
	TL0=(0xffff-9259)%256;
	Key_Scan();
	Disp_Func();
}
/**********************************************************************
函数功能:	显示刷新函数
入口参数:	无
出口参数:	无
***********************************************************************/
void Disp_Func(void)
{
	P0=0xff;	/*清除显示*/
	P0=g_bpDisp[g_bCurrent_Local];/*显示段码*/
	if (g_bCurrent_Local)/*刷新DS2*/
	{
		Setb_Func(DS1_CS);
		Clr_Func(DS2_CS);
		g_bCurrent_Local=0;
	}
	else/*刷新DS1*/
	{
		Setb_Func(DS2_CS);
		Clr_Func(DS1_CS);
		g_bCurrent_Local=1;
	}
	P2=g_bP2_Io;/*更新P2口状态*/
}
/**********************************************************************
函数功能:	清相应IO口函数(仅限中断服务函数使用)
入口参数:	bPort:相应IO口
出口参数:	无
***********************************************************************/
void Clr_Func(byte bPort)
{
	bit btEa_Bak;

	btEa_Bak=EA;
	EA=0;
	bPort =~ bPort;
	g_bP2_Io &= bPort;
	EA=btEa_Bak;
}
/**********************************************************************
函数功能:	置相应IO口函数(仅限中断服务函数使用)
入口参数:	bPort:相应IO口
出口参数:	无
***********************************************************************/
void Setb_Func(byte bPort)
{
	bit btEa_Bak;

	btEa_Bak=EA;
	EA=0;
	g_bP2_Io |= bPort;
	EA=btEa_Bak;
}
/**********************************************************************
函数功能:	判断行列键是否有键函数
入口参数:	无
出口参数:	0/1	无键/有键
***********************************************************************/
byte Key_Func(void)
{
	byte bI;

	Clr_Func(KEY_OUT1);
	Clr_Func(KEY_OUT2);
	P2 = g_bP2_Io;
	bI=P2;
	if ((bI&KEY_IN1) && (bI&KEY_IN2))
		return 0;
	else
		return 1;
}
/**********************************************************************
函数功能:	行列键盘扫描函数
入口参数:	无
出口参数:	0/1	无键/有键
***********************************************************************/
void Key_Scan(void)
{
	byte bK,bKey,bLine,bRow;

	if (Key_Func())
	{
		if (g_btKey_Press || g_btKey_Flag)
		{	/*键盘未抬起或键值未处理则不扫描键盘*/
			return;
		}
		Setb_Func(KEY_OUT2);
		for (bRow=0; bRow<2; bRow++)
		{
			if (bRow)
			{
				Setb_Func(KEY_OUT1);
				Clr_Func(KEY_OUT2);
			}
			P2=g_bP2_Io;
			bK=P2;
			bK &=(KEY_IN1 | KEY_IN2);
			bK>>=2;
			switch (bK)
			{
				case	1:
						bLine=0;
						break;
				case	2:
						bLine=1;
						break;
				default	:
						bLine=0xff;
						break;
			}
			if (bLine!=0xff)
			{
				bKey=bLine+bRow*2;/*扫描到键值*/
				break;
			}
		}
		if (g_bKey_Bak != bKey)/*为去抖而备份当前按键*/
		{
			g_bKey_Time=0;
			g_bKey_Bak=bKey;
		}
		else
		{
			if (g_bKey_Time==2)/*去抖有效*/
			{
				g_bKey=g_bKey_Bak;
				g_bKey_Bak=0xff;
				g_btKey_Press=1;
				g_btKey_Flag=1;
				Clr_Func(BELL_ON);
			}
			else/*去抖*/
				g_bKey_Time++;
		}
	}
	else/*按键抬起*/
	{
		g_btKey_Press=0;
		Setb_Func(BELL_ON);
	}
}
/**********************************************************************
函数功能:	扫描键盘函数
入口参数:	bFlag:0/1	死等/不死等	
出口参数:	0/1	无键值/有键值
***********************************************************************/
byte Wait_Key(byte bFlag)
{
	if (bFlag)
	{
		if (g_btKey_Flag)
		{
			g_btKey_Flag=0;
			return 1;
		}
		else
			return 0;
	}
	else
	{
		while (!g_btKey_Flag);
		g_btKey_Flag=0;
		return 1;
	}
}
/**********************************************************************
函数功能:	转换显示数据函数
入口参数:	bDisp_Data	显示数据0~99
出口参数:	无
***********************************************************************/
void Hex_To_Disp(byte bDisp_Data)
{
	byte bI,bJ,bpDisp[2];

	if (bDisp_Data<100)
	{
		bI=Bin_Bcd_Func((dword)bDisp_Data,bpDisp);/*二进制转十进制*/
		for (bJ=0; bJ<bI; bJ++)/*查找显示段码*/
		{
			bpDisp[bJ]=g_bpDisp_Seg[bpDisp[bJ]];
		}
		if (bI==1)
		{	/*如果转换十进制结果为一位,则将此位移到个位*/
			Right_Move(bpDisp,1,1,g_bpDisp_Seg[0]);
		}
		while (g_bCurrent_Local);/*等待上次数据显示完*/
		ET0=0;
		Init_Array_Func(2,g_bpDisp,0xff);
		for ( bJ=0; bJ<2; bJ++)/*更新显示数据*/
			g_bpDisp[bJ]=bpDisp[bJ];
		ET0=1;
	}
}
/**********************************************************************
函数功能:	上电初始化函数
入口参数:	无
出口参数:	无
***********************************************************************/
void Power_Up(void)
{
	TMOD = 0x01;/*Time0为16位*/
	TH0=(0xffff-9259)/256;
	TL0=(0xffff-9259)%256;
	IE=0x82;	/*开启定时器中断0*/
	TR0=1;
	g_bP2_Io=0xff;
	g_bKey_Bak=0xff;
}
/**********************************************************************
函数功能:	主函数
入口参数:	无
出口参数:	无
***********************************************************************/
void main()
{
	Power_Up();
	while (1)
	{
		if (Wait_Key(0))
		{
			Hex_To_Disp(g_bKey);/*显示当前键值*/
		}
	}
}

⌨️ 快捷键说明

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