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

📄 key.c

📁 C8051F020的LCD的驱动程序
💻 C
字号:
/************************************************************************************
*  Copyright (c) 2004,西安铭朗电子科技有限责任公司
*            All rights reserved.
*
* 文件名称: Key.C
* 文件标识: none
* 适用器件: C8051F020
* 
* 摘 要: 本文件是键盘子程序;使用外部22.1184MHz晶振.
* 
* 当前版本:1.1
* 作 者:刘大伟
* 完成日期:2007年3月2日
*
* 历史版本:1.0
* 作 者:卢 阳
* 完成日期:2004年11月14日
*
* 历史版本:0.9 
* 原作者 : 李林利
* 完成日期:2004年1月1日
*************************************************************************************/

/************************************************************************************/
// 引用外部头文件
#include "c8051F020.h"
#include "key.h"
#include "Delay.h"
#include <INTRINS.H>

/************************************************************************************/

/************************************************************************************
// 常量及全局变量定义
*************************************************************************************/
unsigned char code Key_Value_Table[16]=
         {0xff,0x00,0x01,0xff,0x02,0xff,0xff,0xff,
		  0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff
		 };
bit  bKeyUp_Flag;

/************************************************************************************
*  key功能子程序
*************************************************************************************/

/***********************************************************************************
* 函数名称:Key_Init;
*
* 函数功能描述:键盘初始化,将标志位置1;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void Key_Init(void)
{          
	bKeyUp_Flag=1;//标志位置1
}

/***********************************************************************************
* 函数名称:GetScanKey;
*
* 函数功能描述:键盘扫描函数,得到键的行列位置;
*              
* 输入参数:none;
*
* 返回数据:unsigned char类型数据,是按键所在行列号值 高4位是键盘IO口低4位(SELn) 低4位
* 			是键盘IO口高4位(RLn) 1有效;
*
* 注意:    请参考电路图;
*
* 注释:	将键盘IO低4位(SEL)置高电平,循环逐一置低电平.检测键盘IO口高4位(RL),如有低电平
*			则判断有按键按下,跳出循环.返回相应键值。否则待循环完毕后,返回预定值oxff,
*			相关逻辑关系等请参考电路图。
************************************************************************************/
unsigned char GetScanKey(void)
{
	unsigned char key, i, temp;
	key=0xff;
	for (i=1; i<0x10; i<<=1)	//i的低4位为行数位,行依次检测 循环4次
	{
        Key_Scan |= 0x0f;		//保留高4位(列RL),低4位置1
		Key_Scan &= ~i;  		//取带5检测行数位
     	
		temp = Key_Scan; 		//取键盘IO口的值
		temp = ~temp;    		//按键有效后为0,要求有效按键为1无效为0,取反
		temp>>=4;		 		//取高4位列数位的值并将其放入低4位

		if (temp!=0x00)  		//是否有有效键值
		{                
            key = i<<4;  		//取低4位行数位的值并将其放入返回值高4位
			key|=temp;   		//列数位的值放入返回值低4位
			break;
		}				 
	}
	return key;          		//返回行位(高四)和列位(低四)
}

/***********************************************************************************
* 函数名称:GetKey;
*
* 函数功能描述:取键值,长按无效;
*              
* 输入参数:none;
*
* 返回数据:unsigned char类型数据 
*
* 注意:    none;
************************************************************************************/
unsigned char GetKey(void)
{
	unsigned char key, temp;

	if (!bKeyUp_Flag)		//判断标志,是0执行
	/*按键程序执行一次后会将bKeyUp_Flag标志位清零,执行此段程序,长按键无效返回无效值
	  直至按键无效返回无效按键值,置"1"标志位。按键输入恢复有效*/
	{
		key=GetScanKey();
		if (key==0xff)		//没有按键,置标志位
			bKeyUp_Flag=1;
		else				//保持按键
			return 0xff;	
	}
		
	key=GetScanKey();
	if (key==0xff)			//没有按键
		return key;
	else					//有按键有效
 		temp=key;			//取键值	
	Delay_ms(20);			//延时20ms 消抖
	key=GetScanKey();		//键盘扫描 	
	if(key!=temp)			//判断两次键值是否相同,排除干扰信号影响 确认有效信号
	{
	    key=0xff;
		return key;
	}
	else					//取键值
	{
		  temp=Key_Value_Table[key>>4];	
		  /*行值有效位(键盘的4个行SEL返回的值含有的有效位"1")有且只有一位 键值才有效 否则返回无效键值*/
		  if (temp==0xff)
		  {
	    	key=0xff;
			return key;
		  }		  
		  temp=Key_Value_Table[key&0x0f];
		  /*列值有效位(键盘的4个列RL返回的值含有的有效位"1")有且只有一位 键值才有效 否则返回无效键值*/
		  if (temp==0xff)
		  {
	    	key=0xff;
			return key;
		  }		  
		  key=Key_Value_Table[key>>4]*4+Key_Value_Table[key&0x0f];
		  /*行列组合后的值大于15无效*/
		  if (key>15)
		  {
	    	key=0xff;
			return key;
		  }
		  bKeyUp_Flag=0;
		  return key;
	} 
}

/***********************************************************************************
* 函数名称:Alarm;
*
* 函数功能描述:蜂鸣器开关控制  0:关闭,其他:开启;
*              
* 输入参数:0:关闭,其他:开启;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void Alarm(unsigned char flag)
{
 	if(flag)
		Alarm_On;
	else
		Alarm_Off;
}

/***********************************************************************************
* 函数名称:LED_state;
*
* 函数功能描述:LED开关控制  0:关闭,其他:开启;
*              
* 输入参数:0:关闭,其他:开启;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************
void LED_state(unsigned char flag)
{
 	if(flag)
	{
		LED1 = 1;
		LED2 = 1;
		LED3 = 1;
	}
	else
	{
		LED1 = 0;
		LED2 = 0;
		LED3 = 0;
	}
}

/************************************************************************************
* 文件结束
************************************************************************************/

⌨️ 快捷键说明

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