找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 320|回复: 1
收起左侧

为什么我完全照抄的这段单片机按键长按短按代码会不能用呢?

[复制链接]
ID:1112147 发表于 2024-3-17 21:46 | 显示全部楼层 |阅读模式
void KeyScan(void) //此函数放在定时中断里每 1ms 扫描一次
{
static unsigned char Su8KeyLock1;
static unsigned int Su16KeyCnt1;
static unsigned char Su8KeyShortFlag=0; //按键“短按”触发的标志
if(0!=KEY_INPUT1)//单个 K1 按键没有按下,及时清零一些标志。
{
Su8KeyLock1=0; //按键解锁
Su16KeyCnt1=0; //去抖动延时计数器清零,此行非常巧妙,是全场的亮点。
if(1==Su8KeyShortFlag) //松手的时候,如果“短按”标志有效就触发一次“短按”
{
Su8KeyShortFlag=0;
//先清零“短按”标志避免一直触发。
vGu8SingleKeySec=1;
//触发 K1 的“短按”
}
}
else if(0==Su8KeyLock1)//单个按键 K1 被按下
{
Su16KeyCnt1++; //累加定时中断次数
if(Su16KeyCnt1>=KEY_SHORT_TIME) //“短按”兼“滤波”的“稳定时间”KEY_SHORT_TIME
{
//注意,这里不能“自锁”。后面“长按”触发的时候才“自锁”。
Su8KeyShortFlag=1;
//K1 的“短按”标志有效,待松手时触发。
}if(Su16KeyCnt1>=KEY_LONG_TIME) //“长按”兼“滤波”的“稳定时间”KEY_LONG_TIME
{
Su8KeyLock1=1;
//此时“长按”触发才“自锁”
Su8KeyShortFlag=0; //既然此时“长按”有效,那么就要废除潜在的“短按”。
vGu8SingleKeySec=2; //触发 K1 的“长按”
}
}
}
不知道为什么,按键完全没用啊,有没有好用的按键长按短按程序推荐一下
回复

使用道具 举报

ID:213173 发表于 2024-3-18 10:01 | 显示全部楼层
这段代码本身没有什么问题,关键是要在特定环境中运行。第一行明确注释:此函数放在定时中断里每 1ms 扫描一次。
还有一个关键点是变量Su8KeyShortFlag的使用。Su8KeyShortFlag的初值=0,短按值=1,长按值=2。当按键服务函数响
应了Su8KeyShortFlag后必须清0。例如:
//按键服务函数
void key_service()
{
        if(Su8KeyShortFlag==1)
        {
                //......执行任务1
                Su8KeyShortFlag=0;
        }
        if(Su8KeyShortFlag==2)
        {
                //......执行任务2
                Su8KeyShortFlag=0;
        }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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