找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1193|回复: 0
收起左侧

求解读这段单片机按键程序的Nopresstime的作用

[复制链接]
ID:418451 发表于 2019-4-17 17:54 | 显示全部楼层 |阅读模式
#define IO_KEY1                                                P00                                                        //复用LED_SegA        //按键复用
#define IO_KEY2                                                P01                                                        //复用LED_SegB
#define IO_KEY3                                                P02                                                        //复用LED_SegC        
#define IO_KEY4                                                P03                                                 //复用LED_SegD
#define IO_KEY5                                                P04                                                        //复用LED_SegE
//*********************** 按键值 *************************************
#define KEYVALUE_Key1                        0x01                                                //IO_KEY1按键有效的对应值        
#define KEYVALUE_Key2                        0x02                                                //IO_KEY2按键有效的对应值        
#define KEYVALUE_Key3                        0x04                                                //IO_KEY3按键有效的对应值        
#define KEYVALUE_Key4                        0x08                                                //IO_KEY4按键有效的对应值        
#define KEYVALUE_Key5                        0x10                                                //IO_KEY5按键有效的对应值


unsigned  char bdata KEYFlag =0;          //按键状态寄存器
sbit        KEYFlag1                =        KEYFlag^0;                                                //IO_KEY1的按键状态
sbit        KEYFlag2                =        KEYFlag^1;                                                //IO_KEY2的按键状态
sbit        KEYFlag3                =        KEYFlag^2;                                                //IO_KEY3的按键状态
sbit        KEYFlag4                =        KEYFlag^3;                                                //IO_KEY4的按键状态
sbit        KEYFlag5                =        KEYFlag^4;                                                //IO_KEY5的按键状态
unsigned char keydata_temp;                                                                //按键扫描值
unsigned char keydata_old;                                                                //上次的按键值
unsigned int  keypresscount;                                                        //按键按下计时寄存器
unsigned int  NOPressTime;                                                                //按键没有按的计时寄存器???????

void keyscan(void)
{
        unsigned char i;
        
        wei1=0;wei2=0; wei3=0; wei4=0;wei5=0;wei6=0;
        
        P0M = 0xE0;          //0b11100000                //0为输入,1为输出 输入输出控制寄存器,将各个段码改为输入                                                
        P0UR = 0x1F;        //0b00011111                //内置上拉寄存器 1上拉  0无上拉

        for(i=0;i<10;i++)//20us
        {
                _nop_ ();
                _nop_ ();        
        }

        keydata_temp = 0;
        if(IO_KEY1 == 0)
        {
                keydata_temp |= KEYVALUE_Key1;
        }
        if(IO_KEY2== 0)
        {
                keydata_temp |= KEYVALUE_Key2;
        }
        if(IO_KEY3 == 0)
        {
                keydata_temp |= KEYVALUE_Key3;
        }
        if(IO_KEY4 == 0)
        {
                keydata_temp |= KEYVALUE_Key4;
        }
        if(IO_KEY5 == 0)
        {
                keydata_temp |= KEYVALUE_Key5;
  }
        P0M = 0xFF;          //0b11111111                //0为输入,1为输出 输入输出控制寄存器,将各个段码改为输入                                                
        P0UR = 0x00;        //0b00000000
        
}

void KeyService(void)
{        uchar t;
        if(keydata_temp == 0)
        {//按键未按下
                keypresscount = 0;
                keydata_old   = 0;
                NOPressTime++;
                if(NOPressTime>=2500) NOPressTime=2501;                                
        }
        else
        {
               
                if(keydata_temp == keydata_old)
                {
                        NOPressTime = 0;
                        
                        keypresscount++;
                        if(keypresscount>60000) keypresscount =60000;
                        if(keypresscount == 25)
                        {                        
                                if(keydata_temp == KEYVALUE_Key1)
                                {
                                        KEYFlag1 =1;
                                }
                                
                                if(keydata_temp == KEYVALUE_Key2)
                                {
                                        KEYFlag2 =1;                                
                                }                                
                                                        
                                if(keydata_temp == KEYVALUE_Key3)
                                {
                                        KEYFlag3 =1;                                       
                                }
                                
                                if(keydata_temp == KEYVALUE_Key4)
                                {
                                        KEYFlag4 =1;                                
                                }               
                                if(keydata_temp == KEYVALUE_Key5)
                                {
                                        KEYFlag5 =1;                                
                                }
                        }               
                }
                else
                {
                        if(keypresscount < 5)
                        {
                                keypresscount = 0;
                                keydata_old = keydata_temp;                                
                        }
                }
        }

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表