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

📄 key_drv.c

📁 由华邦单片机w78e516bc1来控制RC531设计的一款读写器
💻 C
字号:
#include 	<reg51.h>
#include	<absacc.H>
#include	"main.h"
#include 	"globe.h"
#include    "lcd.h"
#include   "menu.h" 

sbit	RL0=P1^4;
sbit	RL1=P1^5;
sbit	RL2=P1^6;
sbit	RL3=P1^7;

sbit	LCD_LED=P1^0;			//液晶背光开关

void Set_Key_Col(void)
{
	RL0= 1;
	RL1= 1;
	RL2= 1;
	RL3= 1;
}

uchar Line_L_Col_H(void)
{
	uchar c;
	
	Key_Scan_CS  = 0x00;			//行输出低电平,列输出高电平
	Set_Key_Col();
	c  = P1;				//读P1口状态
	c &= 0xf0;
	return(c);
}

uchar	Line_Scan(uchar count)
{
	uchar c,c1;
	
	Set_Key_Col();
	switch(count)
	{
		case 0:
			Key_Scan_CS = 0x0e;
			c1 =0x0e;
			break;
		case 1:
			Key_Scan_CS = 0x0d;
			c1 =0x0d;
			break;
		case 2:
			Key_Scan_CS = 0x0b;
			c1 =0x0b;
			break;
		case 3:
			Key_Scan_CS = 0x07;
			c1 =0x07;
			break;
		default:
			break;
	}
	c = P1;
	c &= 0xf0;
	if(c == 0xf0)
		return(0);
	else
		c |= c1;
	return(c);
}

void Key_Scan(void)
{
	uchar c,c1;
	uchar i;
	
	if(Key_Pressed == 0)					//当前状态为没有键盘按下
	{									
		c = Line_L_Col_H();
		if(c != 0xf0)					//有键按下,循环扫描
		{								
			for(i=0;i<4;i++)
			{
				c1 = Line_Scan(i);
				if(c1 != 0)
					break;
			}	
			Cur_KeyCode = c1;			//保存键码
			if(Cur_KeyCode == Pre_KeyCode)		//与上一次保存的键码比较
			{
				KeyCounter ++;
				if(KeyCounter >=5)		//连续检测到5次同一键码,认为有键按下
				{
					KeyCounter  = 0;	//键码检测计数器清零
					Key_Pressed = 1;	//树键盘按下标志
					Key_Waitpro = 1;	//树键盘等待处理标志
				}
			}
			else
			{
				Pre_KeyCode = Cur_KeyCode;	//保存键码
				KeyCounter  = 0;		//键码检测计数器清零
			}
		}
		else
		{
			KeyCounter  = 0;			//键码检测计数器清零
			Pre_KeyCode = 0;			//键码清零
		}
	}
	else							//当前状态为已经有键盘按下,正在处理
	{
		c = Line_L_Col_H();
		if(c == 0xf0)
		{						//无键按下,说明键已经释放,清键盘按下标志
			KeyCounter  = 0;			//键码检测计数器清零
			Pre_KeyCode = 0;			//键码清零
			Key_Pressed = 0;			//清键盘按下标志
		}
		else
		{	
			for(i=0;i<4;i++)
			{
				c1 = Line_Scan(i);
				if(c1 != 0)
					break;
			}	
			Cur_KeyCode = c1;			//保存键码
			if(Cur_KeyCode != Pre_KeyCode)		//与上一次保存的键码比较
			{					//与上一次保存的键码不相等,说明原键已经释放
				KeyCounter  = 0;		//键码检测计数器清零
				Key_Pressed = 0;		//清键盘按下标志
				Pre_KeyCode = Cur_KeyCode;	//放入新的键码
			}
			//与上一次保存的键码不相等,说明原键还未释放,不处理
		}
	}
}

void Key_Process(void)
{	
	LCD_LED=0;
	ledlcd_on=1;
	ledcnt=0;
	Key_Waitpro = 0;
	switch(Cur_KeyCode)
	{
		case KEY1:
			Pro_Num(0);
			break;
		case KEY2:
			Pro_Num(1);
			break;
		case KEY3:
			Pro_Num(2);
			break;
		case KEY4:
			Pro_Num(3);
			break;
		case KEY5:
			Pro_Num(4);
			break;
		case KEY6:
			Pro_Num(5);
			break;
		case KEY7:
			Pro_Num(6);
			break;
		case KEY8:
			Pro_Num(7);
			break;
		case KEY9:
			Pro_Num(8);
			break;
		case KEY10:
			Pro_Num(9);
			break;
		case KEY11:
			Pro_Pos(UP);
			break;
		case KEY12:
			Pro_Ent();
			break;
		case KEY13:
			Pro_Esc();
			break;
		case KEY14:
			Pro_LrPos(LEFT);
			break;
		case KEY15:
			Pro_Pos(DOWN);
			break;
		case KEY16:
			Pro_LrPos(RIGHT);
			break;
		default:
			break;
	}
}

void Key_Init(void)
{
	Key_Pressed = 0;				//无键盘按下标志
	Key_Waitpro = 0;				//无键盘等待处理标志
	Cur_KeyCode = 0;				//键盘编码清零
	Pre_KeyCode = 0;				//键盘编码清零
	KeyCounter = 0;					//键盘去抖动记数
}











⌨️ 快捷键说明

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