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

📄 anjian0202.c

📁 基于MCS—51系列单片机的按键程序
💻 C
字号:
/*******************************************************************************************
*
*    扫键程序,扫键及消抖时间均为50ms,确认键值后200ms不再扫键
*
*    创建日期:2007.1.30                      创建人:赵焱
*    修改日期:2007.2.1                        修改人:赵焱
*    修改内容:修改了定时时间间隔,扫键时间和消抖时间统一为50ms,
*                           优化扫键函数。
*******************************************************************************************/
#include <reg51.h>
#include <absacc.h>

#define dataPort XBYTE[0xb000]          /*数据总线地址定义*/


#define key_quit 0x38                         /*四按键相应键值定义*/
#define key_up 0x34
#define key_down 0x2c
#define key_confirm 0x1c

sbit elight1=P1^7;                                /*缓冲器使能管脚*/
sbit elight2=P1^6;

unsigned char bdata key_flag;                /*扫键标志*/
sbit key_able=key_flag^0;
sbit key_ok=key_flag^1;
sbit key_press=key_flag^2;

unsigned char xdata key,key1,key2,key_counter;

 /*********************************************************************************
 定时中断
 定时器0,时间间隔50ms
 **********************************************************************************/
void timer0(void) interrupt 1 using 1             
{
    TR0=0;
    TL0=0x00;                                                      /*定时50ms*/
    TH0=0x4c;
    TR0=1;
    key_counter--;
    if(key_counter==0)                    
    {
        key_able=1;
        key_counter=1;
    }
}

/************************************************************************************
按键扫描
扫键间隔50ms,消抖50ms,确认后200ms 不再扫键
*************************************************************************************/
void keyscan(void)
{
    if(key_able==1)                                    /*扫键时间到*/
    {     
        key_able=0;
        key1=P1&0x3c;
        if(key1!=0x3c)                                    /*有键按下*/
        {
            if(key_press&&key2==key1)                   /*消抖后确认有键按下*/
            {
                key=key2;                                             /*赋键值*/
                key_press=0;                                         /*有键按下标志复位*/
                key_ok=1;                                             /*确认标志*/
                key2=0;
                key_counter=4;                                 /*后200ms不再扫键*/     
            }
              
            else
	     {                                                        /*抖动或第一次扫到按键*/
                key_press=1;
                key_counter=1;                              /*50ms后再扫*/
                key2=key1;                                    /*赋第一次键值*/    
                key_ok=0;                                      /*不能确认按键*/
            
             }
	 }
        else                                                   /*无键按下*/
        {
            key2=0;
            key=0;
            key_ok=0;
            key_press=0;
        
        }       
    }
}
  

/*************************************************************************************
指示灯点亮程序
根据当前键值点亮对应的指示灯,提示按键被响应
**************************************************************************************/
void elight(void)                          /*根据键值点亮LED指示灯*/
{
    elight1=0;                                /*开缓冲器*/
    elight2=0;
    switch(key)                             /*点亮键值对应的指示灯*/
    {
        case 0:break;
  	  
        case key_quit:{
        dataPort=0xfe;
        break;}
  
     case key_up:{
        dataPort=0xfd;
        break;}
  
     case key_down:{
        dataPort=0xfb;
        break;}
  
     case key_confirm:{
        dataPort=0xf7;
        break;}
    }
    elight1=1;                           /*关缓冲器*/
    elight2=1;
}
  
void main(void)
{
    EA=1;
    ET0=1;
    TMOD=0x01;                 /*定时器0,模式1,定时时间50ms*/
    TL0=0x00;
    TH0=0x4c;
    TR0=1;
    key_able=0;            
    key_counter=1;
    P1=0xff;
    while(1)
    {
    keyscan();
    elight();
    }
}

⌨️ 快捷键说明

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