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

📄 key.c

📁 51edn开发板程序
💻 C
字号:
/******************************************************************
   本程序只供学习使用,未经作者许可,不得用于其它任何用途

        欢迎访问我的USB专区:http://group.ednchina.com/93/
        欢迎访问我的blog:   http://www.ednchina.com/blog/computer00
                             http://computer00.21ic.org

KEY.C  file

作者:Computer-lov
建立日期: 2007.03.20
修改日期: 2007.11.18
版本:V1.2
版权所有,盗版必究。
Copyright(C) Computer-lov 2007-2017
All rights reserved
*******************************************************************/

#include "Key.h"
#include "MyType.h"
#include "config.h"

volatile uint8 idata KeyCurrent,KeyOld,KeyNoChangedTime;
volatile uint8 idata KeyPress;
volatile uint8 idata KeyDown,KeyUp,KeyLast;

volatile uint8 KeyCanChange;

volatile uint16 SystemTick=0;

/********************************************************************
函数功能:定时器0初始化,用来做键盘扫描,定时时间大约为5ms。
入口参数:无。
返    回:无。
备    注:无。
********************************************************************/
void InitTimer0(void)
{
 TMOD&=0xF0;
 TMOD|=0x01;
 TH0=0xDC;
 ET0=1;
 TR0=1;
}
/*******************************************************************/


/********************************************************************
函数功能:键盘初始化
入口参数:无。
返    回:无。
备    注:无。
********************************************************************/
void InitKeyboard(void)
{
 KeyIO=0xFF;	  //键盘对应的口设置为输入状态
 KeyPress=0;	      //无按键按下
 KeyNoChangedTime=0;
 KeyOld=0;
 KeyCurrent=0;
 KeyLast=0;
 KeyDown=0;
 KeyUp=0;
 InitTimer0();		  //初始化定时器
 KeyCanChange=1;	  //允许键值改变
}
/*******************************************************************/

sbit LED_0=P1^0;
sbit LED_1=P1^1;
sbit LED_2=P1^2;
sbit LED_3=P1^3;

#define LED_SEG P0

#ifndef LCD
/*=====0-9=====A-F-OFF=====*/
code uint8 Table[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                     0x80,0x90,0x88,0x83,0xc6,0x86,0x8e,0x82,0xFF};

uint8 LedBuffer[4];

#endif
             
/********************************************************************
函数功能:定时器0中断处理。
入口参数:约5ms中断一次。
返    回:无。
备    注:无。
********************************************************************/
void Timer0Isr(void) interrupt 1
{
 uint8 temp;
 
#ifndef LCD
 static uint8 LedDigit=0;
#endif
 
 TH0=(65536-Fclk/1000/12*5+22)/256;	 //定时器0重装
 TL0=(65536-Fclk/1000/12*5+22)%256;
 
 SystemTick++;
 
#ifndef LCD  //没有定义LCD,则使用数码管显示
 switch(LedDigit)
 {
  case 0:
   LED_3=1;
   LED_SEG=Table[LedBuffer[0]];
   LED_0=0;
   LedDigit=1;
  break;
  case 1:
   LED_0=1;
   LED_SEG=Table[LedBuffer[1]];
   LED_1=0;
   LedDigit=2;
  break;
  case 2:
   LED_1=1;
   LED_SEG=Table[LedBuffer[2]];
   LED_2=0;
   LedDigit=3;
  break;
  case 3:
   LED_2=1;
   LED_SEG=Table[LedBuffer[3]];
   LED_3=0;
   LedDigit=0;
  break;
  default:
   LedDigit=0;
  break;
 }
#endif

 if(!KeyCanChange)return;     //如果正在处理按键,则不再扫描键盘 

 //开始键盘扫描
 //保存按键状态到当前按键情况
 //KeyCurrent总共有8个bit
 //当某个开关按下时,对应的bit为1
 
 P2_4=0; //扫描第一列
 temp=~KeyIO;
 P2_4=1;
 temp&=0x0F;
 P2_5=0; //扫描第二列
 KeyCurrent=~KeyIO;    
 P2_5=1;
 
 KeyCurrent<<=4;
 KeyCurrent|=temp;
 
 if(KeyCurrent!=KeyOld)  //说明按键情况发生了改变
  {
   KeyNoChangedTime=0;       //键盘按下时间为0
   KeyOld=KeyCurrent;        //保存当前按键情况
   return;
  }
 else
  {
   KeyNoChangedTime++;	     //按下时间累计
   if(KeyNoChangedTime>=1)	 //如果按下时间足够
    {
	    KeyNoChangedTime=1;
	    KeyPress=KeyOld;      //保存按键
	    KeyDown|=(~KeyLast)&(KeyPress); //求出新按下的键
	    KeyUp|=KeyLast&(~KeyPress);     //求出新释放的键
	    KeyLast=KeyPress;		         //保存当前按键情况
					if(KeyDown)BeepOn(); //按键按下,蜂鸣器响
					else if(KeyUp)BeepOff();
	   }
  }
}
/*******************************************************************/

⌨️ 快捷键说明

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