51单片机,按键短按led闪烁,单片机按键长按3秒led长亮,,怎么实现,

查看: 2349|回复: 5
用按键控制LED灯闪亮时间
本帖最后由
13:28 编辑
#include &reg52.h&
typedef unsigned int uint16;
//sbit led = P0^0;//定义LED接口
sbit key = P3^2;//定义按键接口
//延时函数
void delay(uint16 j)
& && && && && & uint16
& && && && && & for(i = 0;i &i++);
void main()
& && &&&{& && &&&
& && && && && & uint16 k = 0;
& && && && && & P0 = 0//P0口初始化
& && && && && & while(1)
& && && && && & {
& && && && && && && && &if(!key)//按键判断
& && && && && && && && &{
& && && && && && && && && && &&&delay(1000);//延时去抖动
& && && && && && && && && && &&&if(!key)//再一次判断按键
& && && && && && && && && && &&&{
& && && && && && && && && && && && && & k+=1000;//每一次加1000
& && && && && && && && && && && && && & if(k==10000)
& && && && && && && && && && && && && & k = 0;
& && && && && && && && && && && && && & while(!key);//判断按键是否弹起
& && && && && && && && && && &&&}
& && && && && && && && &}
& && && && && && && && &delay(k);
& && && && && && && && &P0 = 0x00;
//& && && && && && && && &led = 0;
& && && && && && && && &delay(k);
& && && && && && && && &P0 = 0
//& && && && && && && && &led = 1;
& && && && && & }
共享资料的积分奖励,希望大家多多发
只是分享一下,我想说的是,调用函数中的实参可以是常量,变量或其他表达式
共享资料的积分奖励,希望大家多多发布各种.
本帖最后由 xueyunmicheng 于
15:24 编辑
我想问一下楼主 是否有实物测试
个人愚见哈 你的 键盘扫描时间 远远小于 延时时间 这样的结果就是轻触一下按键是不能达到你需要的效果的 (闪烁速度很慢的情况下)
其实楼主可以用定时器实现这个功能 定时器里面 闪灯 主函数扫描按键就可以咯
如有错误 可以指正 嘿嘿
我想问一下楼主 是否有实物测试
个人愚见哈 你的 键盘扫描时间 远远小于 延时时间 这样的结果就是轻触一 ...
可以定时器的,去抖动时间不要过长,过长的话可能会影响功能(我试过程序了,可以的)
//sbit led = P0^0;&&//后面是注释吗?单片机就会不知道sbit led = P0^0;我是初学,说的不对请指正
//sbit led = P0^0;&&//后面是注释吗?单片机就会不知道sbit led = P0^0;我是初学,说的不对请指正
是注释,只是为了方便我们看的,
Powered by21ic官方微信-->
后使用快捷导航没有帐号?
请完成以下验证码
查看: 12056|回复: 17
一个按键两种功能,短按一个功能,长按一个功能.
&&未结帖(20)
主题帖子积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
刚学51一个月,学生想找个老师点拔一下谢谢了,想写一个按键两种功能,就是短按一下LED灯亮,再按一下灭,长按2秒另一个LED亮,再按一下灭,想了好久写不出来,下面是学生写的不完整程序#include&reg52.h&
#define uint unsigned int
sbit led1=P1^0;
sbit led2=P1^1;
sbit key1=P3^4;
void delay(uint xms)
& & & & uint i,j;
& & & & for(i=i&0;i--)
& & & & for(j=110;j&0;j--);
void main()
& & & & while(1)
& & & & & & & & if(key1==0)
& & & & & & & & {
& & & & & & & & & & & & delay(10);
& & & & & & & & & & & & if(key1==0)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & led1=~led1;
& & & & & & & & & & & & & & & & while(!key1);
& & & & & & & & & & & & }
& & & & & & & & }
& & & & }& & & &
主题帖子积分
资深工程师, 积分 11497, 距离下一级还需 8503 积分
资深工程师, 积分 11497, 距离下一级还需 8503 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:0.10
主题帖子积分
资深工程师, 积分 11497, 距离下一级还需 8503 积分
资深工程师, 积分 11497, 距离下一级还需 8503 积分
监控按下时间,短按是释放执行,长按是到时间执行
主题帖子积分
助理工程师, 积分 1085, 距离下一级还需 915 积分
助理工程师, 积分 1085, 距离下一级还需 915 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
助理工程师, 积分 1085, 距离下一级还需 915 积分
助理工程师, 积分 1085, 距离下一级还需 915 积分
楼主可以参考下这个帖子&&
主题帖子积分
主题帖子积分
专家等级:结帖率:97%
主题帖子积分
写成按键状态机的形式吧。
欢迎进入版块
主题帖子积分
高级技术员, 积分 991, 距离下一级还需 9 积分
高级技术员, 积分 991, 距离下一级还需 9 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
高级技术员, 积分 991, 距离下一级还需 9 积分
高级技术员, 积分 991, 距离下一级还需 9 积分
加我Q,我给你个代码,你看看.或者我给你说说.呵呵
主题帖子积分
高级技术员, 积分 991, 距离下一级还需 9 积分
高级技术员, 积分 991, 距离下一级还需 9 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
高级技术员, 积分 991, 距离下一级还需 9 积分
高级技术员, 积分 991, 距离下一级还需 9 积分
用延时消抖我认为是自欺欺人.哈哈.
主题帖子积分
中级技术员, 积分 150, 距离下一级还需 150 积分
中级技术员, 积分 150, 距离下一级还需 150 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
中级技术员, 积分 150, 距离下一级还需 150 积分
中级技术员, 积分 150, 距离下一级还需 150 积分
我给你来个试试(已调试)
/*******************************************************
|一个按键两种功能,就是短按一下LED灯亮,
|再按一下灭,长按2秒另一个LED亮,再按一下灭
*******************************************************/
#include &reg52.h&
#include &intrins.h&
#define uint unsigned int //宏定义:unit=unsigned int
#define uchar unsigned char
sbit led1=P1^0;
sbit led2=P1^1;
sbit s=P3^5;
uchar flag1,flag2;
void delay(uint);
void keyscan();
void main()
& & & & while(1)
& & & & & & & & keyscan();
void keyscan()
& & & & j=0;
& & & & s=1;
& & & & if(flag1==1||flag2==1)
& & & & {& & & &
& & & & & & & & if(!s)
& & & & & & & & {
& & & & & & & & & & & & delay(5);
& & & & & & & & & & & & if(!s)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & while(!s);
& & & & & & & & & & & & & & & & flag1=0;
& & & & & & & & & & & & & & & & flag2=0;
& & & & & & & & & & & & & & & & led1=1;
& & & & & & & & & & & & & & & & led2=1;
& & & & & & & & & & & & }
& & & & & & & & }
& & & & else
& & & & & & & & if(!s)
& & & & & & & & {
& & & & & & & & & & & & delay(5);
& & & & & & & & & & & & if(!s)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & while(s==0 && j&30000)
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & //& & & & delay(5);
& & & & & & & & & & & & & & & & & & & & j++;
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & & & & & if (j&=30000)
& & & & & & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & & & & & flag2=1;
& & & & & & & & & & & & & & & & & & & & & & & & led2=0;
& & & & & & & & & & & & & & & & & & & & & & & & while(!s);& & & &
& & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & & & & & else
& & & & & & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & & & & & flag1=1;
& & & & & & & & & & & & & & & & & & & & & & & & led1=0;
& & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & }
& & & & & & & & }
& & & & }& & & &
void delay(uint z)
& & & & //1ms延时
& & & & uint i,j;
& & & & for(i=z;i&0;i--)
& & & & & & & & for(j=110;j&0;j--);
主题帖子积分
资深工程师, 积分 15671, 距离下一级还需 4329 积分
资深工程师, 积分 15671, 距离下一级还需 4329 积分
主题帖子积分
专家等级:结帖率:96%
主题帖子积分
资深工程师, 积分 15671, 距离下一级还需 4329 积分
资深工程师, 积分 15671, 距离下一级还需 4329 积分
2#正解,一般这个都是状态机形式的
醒来才发现,一切都是一场梦
主题帖子积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
谢谢sdwflzg,终于看明白怎么写了,太感谢了!以后有不懂的还要劳烦你了,非常感谢,我被这个程序困好几天了,睡都睡不着,现在感觉比中大奖都高兴,现在迷上单片机了,没办法啊.
主题帖子积分
中级技术员, 积分 150, 距离下一级还需 150 积分
中级技术员, 积分 150, 距离下一级还需 150 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
中级技术员, 积分 150, 距离下一级还需 150 积分
中级技术员, 积分 150, 距离下一级还需 150 积分
caixiaojung 发表于
谢谢sdwflzg,终于看明白怎么写了,太感谢了!以后有不懂的还要劳烦你了,非常感谢,我被这个程序困好几天了,睡 ...
我也是刚上手,一起研究。:handshake
主题帖子积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
sdwflzg 发表于
我给你来个试试(已调试)
/*******************************************************
|一个按键两种功能, ...
如果上面的延时全部用定时器来延时那怎么写呢,是不是很麻烦
主题帖子积分
中级工程师, 积分 3332, 距离下一级还需 1668 积分
中级工程师, 积分 3332, 距离下一级还需 1668 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:20.00
主题帖子积分
中级工程师, 积分 3332, 距离下一级还需 1668 积分
中级工程师, 积分 3332, 距离下一级还需 1668 积分
本帖最后由 ZG11211 于
17:46 编辑
定时扫描按键,如果有按键按下,开始计数。否则,判断计数值,少于i 视为抖动或没有按下按键,i&j&K视为短按,&k视为长按,执行相应操作,最后清计数值。
工作不养闲人,团队不养懒人。赚不到钱赚知识,赚不到知识赚经历,赚不到经历赚阅历,让人迷茫的原因只有一个,那就是本该拼搏的年纪,却想得太多,做的太少!
主题帖子积分
资深技术员, 积分 453, 距离下一级还需 47 积分
资深技术员, 积分 453, 距离下一级还需 47 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
资深技术员, 积分 453, 距离下一级还需 47 积分
资深技术员, 积分 453, 距离下一级还需 47 积分
楼主还是看状态机吧,现在可能会麻烦点,以后会很爽,不要为了实现功能而去实现功能。
主题帖子积分
助理工程师, 积分 1027, 距离下一级还需 973 积分
助理工程师, 积分 1027, 距离下一级还需 973 积分
主题帖子积分
专家等级:结帖率:87%
主题帖子积分
助理工程师, 积分 1027, 距离下一级还需 973 积分
助理工程师, 积分 1027, 距离下一级还需 973 积分
说句实话,不是打击7楼,如果按照那种思路写,会害死你自己,毕业后参加工作就知道了。还是先学好定时器中断吧,然后用定时器来实现
主题帖子积分
中级技术员, 积分 150, 距离下一级还需 150 积分
中级技术员, 积分 150, 距离下一级还需 150 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
中级技术员, 积分 150, 距离下一级还需 150 积分
中级技术员, 积分 150, 距离下一级还需 150 积分
sfesdm 发表于
说句实话,不是打击7楼,如果按照那种思路写,会害死你自己,毕业后参加工作就知道了。还是先学好定时器中 ...
谢谢老师指导,用什么方式你要看你用单片机干什么,是吧!
主题帖子积分
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
主题帖子积分
专家等级:结帖率:66%
主题帖子积分
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
监控按下时间,短按是释放执行,长按是到时间执行
非常感谢,用您说的方法我才实现了长按与短按的功能,没有用到延时,用定时器每隔一段时间来判断按键状态,并进行计数或者执行短按操作。一开始按照12楼的思路来写程序,一直写不出来,后来照着您的思路来,终于写出来了。再次感谢,我用的是读取按键扫描程序的值,这样的话就必须要按键扫描程序支持连按才可以。也许直接判断按键状态会更好些。
主题帖子积分
资深工程师, 积分 11497, 距离下一级还需 8503 积分
资深工程师, 积分 11497, 距离下一级还需 8503 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:0.10
主题帖子积分
资深工程师, 积分 11497, 距离下一级还需 8503 积分
资深工程师, 积分 11497, 距离下一级还需 8503 积分
按键是慢速事件,用定时器扫描就很好。
主题帖子积分
中级工程师, 积分 3166, 距离下一级还需 1834 积分
中级工程师, 积分 3166, 距离下一级还需 1834 积分
主题帖子积分
专家等级:结帖率:94%
主题帖子积分
中级工程师, 积分 3166, 距离下一级还需 1834 积分
中级工程师, 积分 3166, 距离下一级还需 1834 积分
void KeyScan()
& & & & static UINT32 u32Debounce=0;
& & & & static UINT32 u32KeyFlag=0;
& & & & UINT32 u32OldKeyR
& & & & static UINT32 u32LastKey=(KEY_IOI_MASK&&14)|(KEY_IOA_MASK&&1)|(0x03&&24)|(0x03&&26);
& & & & UINT32 u32KeyTmp = (~GetAllKeys())&KEY_MASK;
& & & & u32OldKeyRelease = ~DetectOldKeys_New2(g_u32KeyCode);
& & & & //u32OldKeyRelease= ~DetectOldKeys(g_u32KeyCode);
& & & & u32KeyTmp&=u32OldKeyR
& & & & g_u32KeyCode &=& & & & u32OldKeyR
& & & & if(u32KeyTmp !=u32LastKey)
& & & & & & & & /*if(u32KeyFlag ==1)
& & & & & & & & {
& & & & & & & & & & & & g_u32KeyCode =u32LastK
& & & & & & & & }*/
& & & & & & & & u32KeyFlag =1;
& & & & & & & & u32Debounce=0;
& & & & & & & & u32LastKey = u32KeyT
& & & & & & & &
& & & & else if(u32KeyFlag==1)
& & & & & & & & u32Debounce++;
& & & & & & & & if(C_DEBOUNCE &=u32Debounce)
& & & & & & & & {
& & & & & & & & & & & & u32Debounce = C_DEBOUNCE+1;
& & & & & & & & & & & & u32KeyFlag=2;
& & & & & & & & & & & & g_u32KeyCode = u32KeyT
& & & & & & & & }
& & & & }& & & &
简单的示例,长按,短按,你再联想一下就知道了
精英会员奖章
等级类勋章
奔腾之江水
发帖类勋章
技术领袖奖章
人才类勋章
时间类勋章
技术奇才奖章
人才类勋章
欢快之小溪
发帖类勋章
社区建设奖章
等级类勋章
沉静之湖泊
发帖类勋章
突出贡献奖章
等级类勋章
时间类勋章
甘甜之泉水
发帖类勋章
希望之星奖章
等级类勋章
技术新星奖章
人才类勋章
坚毅之洋流
发帖类勋章
时间类勋章
核心会员奖章
等级类勋章
湍急之河流
发帖类勋章
精华达人奖章
等级类勋章
技术高手奖章
人才类勋章
时间类勋章
时间类勋章
技术导师奖章
人才类勋章
热门推荐 /3

我要回帖

更多关于 单片机按键长按短按 的文章

 

随机推荐