?? key.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 <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;
/*************************************************************************************
* key功能子程序
*************************************************************************************/
/*************************************************************************************
* 函數(shù)名稱:Key_Init;
*
* 函數(shù)功能描述:鍵盤初始化,將標志位置1;
*
* 輸入?yún)?shù):none;
*
* 返回數(shù)據(jù):none;
*
* 注意: none;
************************************************************************************/
void Key_Init(void)
{
bKeyUp_Flag=1;//標志位置1
Key_Scan = 0xFF;
}
/***********************************************************************************
* 函數(shù)名稱:GetScanKey;
*
* 函數(shù)功能描述:鍵盤掃描函數(shù),得到鍵的行列位置;
*
* 輸入?yún)?shù):none;
*
* 返回數(shù)據(jù):unsigned char類型數(shù)據(jù),是按鍵所在行列號值 高4位是鍵盤IO口低4位(SELn) 低4位
* 是鍵盤IO口高4位(RLn) 1有效;
*
* 注意: 請參考電路圖;
*
* 注釋: 將鍵盤IO低4位(SEL)置高電平,循環(huán)逐一置低電平.檢測鍵盤IO口高4位(RL),如有低電平
* 則判斷有按鍵按下,跳出循環(huán).返回相應(yīng)鍵值。否則待循環(huán)完畢后,返回預定值oxff,
* 相關(guān)邏輯關(guān)系等請參考電路圖。
************************************************************************************/
unsigned char GetScanKey(void)
{
unsigned char key, i, temp;
key=0xff;
for (i=1; i<0x10; i<<=1) //i的低4位為行數(shù)位,行依次檢測 循環(huán)4次
{
Key_Scan |= 0x0f; //保留高4位(列RL),低4位置1
Key_Scan &= ~i; //取帶5檢測行數(shù)位
temp = Key_Scan; //取鍵盤IO口的值
temp = ~temp; //按鍵有效后為0,要求有效按鍵為1無效為0,取反
temp>>=4; //取高4位列數(shù)位的值并將其放入低4位
if (temp!=0x00) //是否有有效鍵值
{
key = i<<4; //取低4位行數(shù)位的值并將其放入返回值高4位
key|=temp; //列數(shù)位的值放入返回值低4位
break;
}
}
return key; //返回行位(高四)和列位(低四)
}
/***********************************************************************************
* 函數(shù)名稱:GetKey;
*
* 函數(shù)功能描述:取鍵值,長按無效;
*
* 輸入?yún)?shù):none;
*
* 返回數(shù)據(jù):unsigned char類型數(shù)據(jù)
*
* 注意: none;
************************************************************************************/
unsigned char GetKey(void)
{
unsigned char key, temp;
if (!bKeyUp_Flag) //判斷標志,是0執(zhí)行
/*按鍵程序執(zhí)行一次后會將bKeyUp_Flag標志位清零,執(zhí)行此段程序,長按鍵無效返回無效值
直至按鍵無效返回無效按鍵值,置"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;
}
}
/***********************************************************************************
* 函數(shù)名稱:Alarm;
*
* 函數(shù)功能描述:蜂鳴器開關(guān)控制 0:關(guān)閉,其他:開啟;
*
* 輸入?yún)?shù):0:關(guān)閉,其他:開啟;
*
* 返回數(shù)據(jù):none;
*
* 注意: none;
************************************************************************************/
void Alarm(unsigned char flag)
{
if(flag)
Alarm_On;
else
Alarm_Off;
}
/***********************************************************************************
* 函數(shù)名稱:LED_state;
*
* 函數(shù)功能描述:LED開關(guān)控制 0:關(guān)閉,其他:開啟;
*
* 輸入?yún)?shù):0:關(guān)閉,其他:開啟;
*
* 返回數(shù)據(jù):none;
*
* 注意: none;
************************************************************************************
void LED_state(unsigned char flag)
{
if(flag)
{
LED1=1;
LED2=1;
LED3=1;
}
else
{
LED1=0;
LED2=0;
LED3=0;
}
}
/************************************************************************************
* 文件結(jié)束
************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -