找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2582|回复: 6
打印 上一主题 下一主题
收起左侧

利用按键控制PWM调节LED亮度,持续按按键能够连续变化 求帮助

[复制链接]
跳转到指定楼层
楼主
ID:495949 发表于 2019-9-9 18:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我已经做到了单独按遥控或者是按按键的时候可以调节亮度,但是持续按遥控或者是按键的话我实现不了,希望大佬们帮帮忙,给我一点点思路。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2019-9-9 22:44 | 只看该作者
单独按能实现,持续按不能实现,这就要看你的电路和程序了,按键是否中断实现?若是中断的话是边沿触发还是电平触发?判断按键是否要弹起才有效?这些问题不清楚不好回答你的问题。一般若要连续按实现调节的话,用一个计数器计数,计数至最大值对应最大亮度,最小值对应最小亮度,只要保证按键能对计数值增减就可实现了
回复

使用道具 举报

板凳
ID:332444 发表于 2019-9-9 23:02 | 只看该作者
循环延时你的按钮变量自增
回复

使用道具 举报

地板
ID:213173 发表于 2019-9-10 07:49 | 只看该作者
短按+-,长按连+-,给你一个示例程序参考。
  1. #include <REG51.H>
  2. #define uint unsigned int        
  3. #define uchar unsigned char
  4. #define key_S 1000                                        //宏定义短按(约20ms)
  5. #define key_L 30000                                        //宏定义长按(约2/3s)
  6. #define key_M 20000                                        //宏定义长按(约1/3s)
  7. sbit key1=P3^6;                                                //加键
  8. sbit key2=P3^7;                                                //减键
  9. uchar num=1;

  10. void keyscan()                                                        //按键扫描
  11. {
  12.         static uint count1=0,count2=0;//计数变量
  13.         if(!key1)   
  14.         {  
  15.                 count1++;  
  16.                 if(count1>=key_L)                                //长按
  17.                 {
  18.                         if(num<255)
  19.                                 num++;        
  20.                         count1=key_M;
  21.                 }
  22.         }  
  23.         else                                                                        //按键抬起
  24.         {  
  25.                 if(count1>key_S && count1<key_L)//短按
  26.                 {
  27.                         if(num<255)
  28.                                 num++;
  29.                 }
  30.                 count1=0;                                                        //count清0
  31.         }   
  32.         if(!key2)   
  33.         {  
  34.                 count2++;  
  35.                 if(count2>=key_L)                                //长按
  36.                 {
  37.                         if(num>0)
  38.                                 num--;        
  39.                         count2=key_M;
  40.                 }
  41.         }  
  42.         else                                                                        //按键抬起
  43.         {  
  44.                 if(count2>key_S && count2<key_L)//短按
  45.                 {
  46.                         if(num>0)
  47.                                 num--;
  48.                 }
  49.                 count2=0;                                                        //count清0
  50.         }
  51. }

  52. void main()
  53. {
  54.         while(1)
  55.         {
  56.                 keyscan();                                //按键扫描
  57.                 P1=~num;                                        //LED低电平显示
  58.         }
  59. }
复制代码
回复

使用道具 举报

5#
ID:495949 发表于 2019-9-10 08:49 | 只看该作者
csmyldl 发表于 2019-9-9 22:44
单独按能实现,持续按不能实现,这就要看你的电路和程序了,按键是否中断实现?若是中断的话是边沿触发还是 ...

谢谢 我再试试
回复

使用道具 举报

6#
ID:609970 发表于 2019-9-10 15:08 | 只看该作者
本帖最后由 bsbshi 于 2019-9-10 16:07 编辑

按键不用中断,在计时器里循环查询按键接口电平,加个延迟计数器,if判断,在延迟时间内高电平回零,为单次按按键,+1;超过延迟还是高电平则为持续按压,++,直到按键变低电平
回复

使用道具 举报

7#
ID:230975 发表于 2019-11-22 15:34 | 只看该作者
能看看你的按键检测代码吗。有没有加松手检测。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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