搜索
bottom↓
回复: 2

一个多击按键识别程序出现了问题

[复制链接]

出0入44汤圆

发表于 2020-8-9 12:44:51 | 显示全部楼层 |阅读模式
网上获得一个多击按键程序,理论上可以响应任意次多击,烧进单片机后在实验板上运行,一两次多击可以成功识别,可是8次多击就不能识别了,想了好久也想不出问题出在哪里?请各位高人指导迷津!

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit LED0 = P1^0;
sbit LED1 = P1^1;
sbit LED2 = P1^2;

sbit KEY1 = P3^2;

uint count = 0,ClickFlag = 0,ClickFlagCount = 0,LongClickFlag = 0;
uchar i = 0,Click = 0;
uchar keynum = 0;

uchar ucLedMode;

typedef struct{
        uchar bBkpGpio;    //原例程中为:bit bBkpGpio
        uchar ucPushNum;
        uint usPopCnt;
        uchar ucScaleCnt;
      
        uchar ucNum;
      
}Key_Typedef;

Key_Typedef stKey;

bit keyscan(void)
{
        bit bThisGpio = 0;
        bit bRtn = 0;

        if (++stKey.ucScaleCnt >= 10)
        {
                stKey.ucScaleCnt = 0;

                bThisGpio = KEY1;
                if (bThisGpio)
                {
                        if (++stKey.usPopCnt >= 50)
                        {
                                stKey.ucNum = stKey.ucPushNum;
                                stKey.ucPushNum = 0;
                                bRtn  = 1;
                        }
                }

                if (bThisGpio != stKey.bBkpGpio)
                {
                        if (!bThisGpio)
                        {
                                stKey.ucPushNum++;
                                stKey.usPopCnt = 0;
                        }
                        stKey.bBkpGpio = bThisGpio;
                }
        }

        return bRtn;
}

void main()
{
    EA = 1;       //使能总中断
    TMOD = 0x01;  //设置T0为模式1
    TH0  = 0xFC;  //为T0赋初值0xFC67,定时1ms
    TL0  = 0x67;
    ET0  = 1;     //使能T0中断
    TR0  = 1;     //启动T0

    while (1)
    {
        if(ucLedMode==1)
            LED0 = ~LED0;
        if(ucLedMode==2)
            LED1 = ~LED1;
        if(ucLedMode==8)
            LED2 = ~LED2;
    }     
}

/* 定时器0中断服务函数 */
void InterruptTimer0() interrupt 1
{
    TH0 = 0xFC;  //重新加载初值
    TL0 = 0x67;
        if (keyscan())
        {
                ucLedMode = stKey.ucNum;
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入984汤圆

发表于 2020-8-9 18:58:45 | 显示全部楼层
本帖最后由 Himem 于 2020-8-9 19:05 编辑

思路没理清
不过51上的话我大概会这样写

#define CLICK_INTERVAL_MAX 100
void every_10ms() {
    if (!KEY1) {
        while (!KEY1); //until keyup
        ucClickCount++;
        ucTimeOut = CLICK_INTERVAL_MAX;
    }
    if (ucTimeOut) {
        if (--ucTimeOut == 0) {
            ucClickCount = 0;
        }
    }
}

出0入44汤圆

 楼主| 发表于 2020-8-16 11:33:32 | 显示全部楼层
修改了一下代码,这下应该可以看懂了,请各位看看问题出在哪里?为什么按8次不响应?

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit LED0 = P1^0;
sbit LED1 = P1^1;
sbit LED2 = P1^2;

sbit KEY1 = P3^2;

uchar i = 0;

bit bThisGpio = 0;
bit bBkpGpio = 1;

uchar ucPushNum;
uint usPopCnt;
uchar ucScaleCnt;
      
uchar ucNum;
uint count = 0;

void Delay10ms()                //@11.0592MHz
{
        unsigned char i, j;

        i = 18;
        j = 235;
        do
        {
                while (--j);
        } while (--i);
}

uchar keyscan()
{
        bThisGpio = KEY1;

        if (bThisGpio)
        {
                if (++usPopCnt >= 50)
                {
                        ucNum = ucPushNum;
                        ucPushNum = 0;
                }
    }
        if (bThisGpio != bBkpGpio)
        {
                Delay10ms();
                if(bThisGpio == KEY1)
                {
                        ucPushNum++;
                        usPopCnt = 0;
                }
                bBkpGpio = bThisGpio;
        }
        return ucNum;       
}

void main()
{

    while (1)
    {
                i = keyscan();
            if(i==1)
            LED0 = ~LED0;
        if(i==2)
            LED1 = ~LED1;
        if(i==8)
            LED2 = ~LED2;       
        }         
}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 10:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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