51单片机独立按键程序处理,我单击发送A,再次单击发送B,再次单击发送C,长按则发送F,请问这个程序如何实现?

Frankfu001 2011-11-04 09:14:17
51单片机独立按键程序处理,我单击发送A,再次单击发送B,再次单击发送C,长按则发送F,请问这个程序如何实现?
...全文
299 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Frankfu001 2011-11-07
  • 打赏
  • 举报
回复
感谢分享@
bjtea 2011-11-04
  • 打赏
  • 举报
回复
设置两个变量:
SUM累积有键时的扫描次数;NUMB代表键号;
利用定时中断,每10毫秒扫描一次按键;
当有按键压下时,每次扫描,SUM加1;
当按键抬起后,SUM停止加1,然后:
(1)判断SUM,是大数值,为长键,发送F;
(2)否则是短键,键号NUMB加1,大于2清0;根据NUMB是0,1,2,相应发送A,B,C
dsoyy 2011-11-04
  • 打赏
  • 举报
回复
现成的代码没有,《按键漫谈》可以帮助你
Frankfu001 2011-11-04
  • 打赏
  • 举报
回复
就没有贡献个源代码的
woshi_ziyu 2011-11-04
  • 打赏
  • 举报
回复
记录按键按下的时间 记录按键抬起的时间
liangboone 2011-11-04
  • 打赏
  • 举报
回复
请参考下面程序的框架。

//#include "*.h"

const unsigned char U8SENDSTATUS_INIT = 0;
const unsigned char U8SENDSTATUS_SEND_A = 1;
const unsigned char U8SENDSTATUS_SEND_B = 2;
const unsigned char U8SENDSTATUS_SEND_C = 3;
const unsigned char U8SENDSTATUS_SEND_F = 4;
unsigned char u8SendStatus = U8SENDSTATUS_INIT; //用来表示当前是要发哪个按键

unsigned char bSwitchShortPressFlag = 0;
unsigned char bSwitchLongPressFlag = 0;
unsigned char b10msFlag = 0; //启动一个定时器,产生10ms中断,在中断里将该标志设为1

void SendDataTask()
{
switch(u8SendStatus)
{
case U8SENDSTATUS_INIT:
{
if(bSwitchShortPressFlag)
{
bSwitchShortPressFlag = 0; //清除标志
sendData('A');
u8SendStatus = U8SENDSTATUS_SEND_A;
}
if(bSwitchLongPressFlag)
{
bSwitchLongPressFlag = 0; //清除标志
sendData('F');
u8SendStatus = U8SENDSTATUS_SEND_F;
}
break;
}
case U8SENDSTATUS_SEND_A:
{
if(bSwitchShortPressFlag)
{
bSwitchShortPressFlag = 0; //清除标志
sendData('B');
u8SendStatus = U8SENDSTATUS_SEND_B;
}
if(bSwitchLongPressFlag)
{
bSwitchLongPressFlag = 0; //清除标志
sendData('F');
u8SendStatus = U8SENDSTATUS_SEND_F;
}
break;
}
case U8SENDSTATUS_SEND_B:
{
//....
break;
}
case U8SENDSTATUS_SEND_C:
{
//....
break;
}
case U8SENDSTATUS_SEND_F:
{
if(bSwitchShortPressFlag)
{
bSwitchShortPressFlag = 0; //清除标志
sendData('A');
u8SendStatus = U8SENDSTATUS_SEND_A;
}
if(bSwitchLongPressFlag)
{
bSwitchLongPressFlag = 0; //清除标志
sendData('F');
}
break;
}
default:
{
break;
}
}
}


void sendData(char ch)
{
//发送A,B,C出去的函数
}

void ReadSwitchStatus()
{
//读取要采集按键的状态
}

void JudgeLongOrShortPress()
{
//判断按键是长按还是短按,设置标志 bSwitchShortPressFlag = 1或者bSwitchLongPressFlag = 1;
}

void main(void)
{
for(;;)
{
if(b10msFlag)
{
b10msFlag = 0;
ReadSwitchStatus()
JudgeLongOrShortPress()
SendDataTask();
}
}
}

27,509

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧