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

📄 key.c

📁 在单片机控制的液晶屏上显示汉字
💻 C
字号:
/************************************************************************************
*  Copyright (c) 2004,西安铭朗电子科技有限责任公司
*            All rights reserved.
*
* 文件名称: key.C
* 文件标识: none
* 适用器件: C8051F120
* 
* 摘 要: 本文件是键盘子程序;使用外部22.1184MHz晶振.
* 
* 当前版本:1.2
* 作 者:李林利
* 完成日期:2005年6月19日
* 
* 当前版本:1.0
* 作 者:卢 阳
* 完成日期:2004年11月14日
*
* 历史版本:0.9 
* 原作者 : 李林利
* 完成日期:2004年1月1日
*************************************************************************************/

/************************************************************************************/
// 引用外部头文件

#include "c8051F120.h"
#include <INTRINS.H>
#include "key.h"
#include "Delay.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;
sbit LED=P3^5;

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

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

void Key_Init(void)
{          
	bKeyUp_Flag=1;//标志位置1
}

/***********************************************************************************
* 函数名称:GetScanKey;
*
* 函数功能描述:键盘扫描函数,得到键的行列位置;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

unsigned char GetScanKey(void)
{
	unsigned char key, i, temp;
   char data SFRPAGE_SAVE = SFRPAGE;    // Save Current SFR page   
   SFRPAGE = SFR_PAGE_F;          	 	// set SFR page F

	key=0xff;

	for (i=1; i<0x10; i<<=1)//i的低4位为行数位
	{
        Key_Scan |= 0x0f;//保留高4位,低4位置1
		Delay_us(1);
		Key_Scan &= ~i;  //取行数位
		Delay_us(1);
     	
		temp = Key_Scan; //取高4位列数位
		temp = ~temp;    //取反
		temp>>=4;		 //右移4位

		if (temp!=0x00)  //有键值
		{                
            key = i<<4;  //左移4位
			key|=temp;   //取键值
			break;
		}
	}
	SFRPAGE = SFRPAGE_SAVE;          // Restore SFR page
	return key;          //返回行位(高四)和列位(低四)
}

/***********************************************************************************
* 函数名称:GetKey;
*
* 函数功能描述:取键值,长按无效;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

unsigned char GetKey(void)
{
	unsigned char key, temp;

	if (!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];
		  if (temp==0xff)
		  {
	    	key=0xff;
			return key;
		  }
		  
		  temp=Key_Value_Table[key&0x0f];
		  if (temp==0xff)
		  {
	    	key=0xff;
			return key;
		  }
		  
		  key=Key_Value_Table[key>>4]*4+Key_Value_Table[key&0x0f];
		  if (key>15)
		  {
	    	key=0xff;
			return key;
		  }

		  bKeyUp_Flag=0;
		  return key;
	} 
}

/***********************************************************************************
* 函数名称:Key_SPI;
*
* 函数功能描述:键值到LED显示码转换;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

unsigned char Key_SPI(unsigned char key)
{
	switch(key)
	{
		case 0x00: 		return 0x3f;//0
		case 0x01: 		return 0x06;//1
		case 0x02: 		return 0x5b;//2
		case 0x03: 		return 0x4f;//3
		case 0x04: 		return 0x66;//4
		case 0x05: 		return 0x6d;//5
		case 0x06: 		return 0x7d;//6	
		case 0x07: 		return 0x07;//7
		case 0x08: 		return 0x7f;//8
		case 0x09: 		return 0x6f;//9
		case 0x0a: 		return 0x77;//a
		case 0x0b: 		return 0x7c;//b
		case 0x0c: 		return 0x39;//c
		case 0x0d: 		return 0x5e;//d
		case 0x0e: 		return 0x79;//e
		case 0x0f: 		return 0x71;//f
		default: 		return 0x00;
	}
}

/***********************************************************************************
* 函数名称:Alarm;
*
* 函数功能描述:蜂鸣器开关控制  0:关闭,其他:开启;
*              
* 输入参数:0:关闭,其他:开启;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void Alarm(unsigned char flag)
{
 	char data SFRPAGE_SAVE = SFRPAGE;    // Save Current SFR page   
    SFRPAGE = SFR_PAGE_F;          	 	// set SFR page F

	if(flag)
		P4|=0x10;
	else
		P4&=0xef;
	
	SFRPAGE = SFRPAGE_SAVE;          // Restore SFR page
}

/***********************************************************************************
* 函数名称:LED_state;
*
* 函数功能描述:LED开关控制  0:关闭,其他:开启;
*              
* 输入参数:0:关闭,其他:开启;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void LED_state(unsigned char flag)
{
 	if(flag)
		LED=1;
	else
		LED=0;
}

/*
SPI0DAT=0x3f;   //显示0
SPI0DAT=0x06;   //显示1
SPI0DAT=0x5b;   //显示2
SPI0DAT=0x4f;   //显示3
SPI0DAT=0x66;   //显示4
SPI0DAT=0x6d;   //显示5
SPI0DAT=0x7d;   //显示6
SPI0DAT=0x07;   //显示7
SPI0DAT=0x7f;   //显示8
SPI0DAT=0x6f;   //显示9
SPI0DAT=0x77;   //显示a
SPI0DAT=0x7c;   //显示b
SPI0DAT=0x39;   //显示c
SPI0DAT=0x5e;   //显示d
SPI0DAT=0x79;   //显示e
SPI0DAT=0x71;   //显示f
SPI0DAT=0x80;   //显示.	
*/	
						  
/***********************************************************************************/
// 文件结束
/***********************************************************************************/

⌨️ 快捷键说明

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