找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请教单片机按键时间长短控制程序

[复制链接]
跳转到指定楼层
楼主
ID:634487 发表于 2019-11-4 01:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚开始学习  看到论坛里一个程序。想修改下,折腾一天。没搞明白,特发帖请教。原贴地址在http://www.51hei.com/bbs/dpj-97912-1.html


#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit keyback=P1^0;
sbit k=P1^4;
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;
static uint i=0;
uchar keystay=0x00;
uchar T0RH;
uchar T0RL;

void configtimer0(uchar ms)
{
ulong tmp;
tmp=11059200/12;
tmp=(ms*tmp)/1000;
tmp=65536-tmp+10;
T0RH=(unsigned char)(tmp>>8);
T0RL=(unsigned char)tmp;
TMOD &=0xF0;
TMOD |=0x01;
TH0=T0RH;
TL0=T0RL;
ET0=1;
TR0=1;
}


void Judge(uint num)
{
if((5<num)&&(num<=50))
{                                          
key1=0;
key2=1;
key3=1;
i=0;
}
if((50<num)&&(num<=120))
{
key2=0;
key1=1;
key3=1;
i=0;
}
if(num>120)   //在第三个状态这里怎么改成120时间内没有信号做出KEY3输出控制呢?
{
key3=0;
key1=1;
key2=1;
i=0;
}
}



main()
{
EA=1;
configtimer0(10);
while(1)
{
  if((keystay&0xFF)==0x00)
{
Judge(i);
          }
         }
}




void keyscan()
{
keystay=(keystay<<1) | (!keyback);
}

void interrupt_timer0()interrupt 1
{
TH0=T0RH;
TL0=T0RL;
keyscan();
if((keystay&0xFF)==0xFF)
{
  i++;

  if(i>400)
  {
   i=0;
         }
      }

  }





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:634487 发表于 2019-11-4 01:21 | 只看该作者
if(num>120)   //在第三个状态这里怎么改成120时间内没有信号做出KEY3输出控制呢?
{
key3=0;
key1=1;
key2=1;
i=0;
}  想修改这部分  
回复

使用道具 举报

板凳
ID:634487 发表于 2019-11-4 01:22 | 只看该作者
在第三个状态这里怎么改成130时间内没有信号做出KEY3输出控制呢?
回复

使用道具 举报

地板
ID:332444 发表于 2019-11-4 10:26 | 只看该作者
改为 if((50<num)&&(num<=120)){}else {}这样试看
回复

使用道具 举报

5#
ID:213173 发表于 2019-11-4 22:35 | 只看该作者
秋风凉 发表于 2019-11-4 01:22
在第三个状态这里怎么改成130时间内没有信号做出KEY3输出控制呢?

给你改了一下,详细注释,能够满足你的要求。
  1. #include<reg52.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit key =P1^0;
  5. sbit LED1=P1^1;
  6. sbit LED2=P1^2;
  7. sbit LED3=P1^3;

  8. uchar count=0;//计数变量
  9. uchar keystay=0;//中间变量
  10. bit sign=0;//按键操作标志

  11. void Timer0Init() //10毫秒@12.000MHz
  12. {
  13.         TMOD= 0x01;                //设置定时器模式
  14.         TL0 = 0xF0;                //设置定时初值
  15.         TH0 = 0xD8;                //设置定时初值
  16.         TR0 = 1;                        //定时器0开始计时
  17.         EA  = 1;                        //开总中断
  18.         ET0 = 1;                        //开T0中断
  19. }

  20. void keyscan()//放在中断里
  21. {
  22.         if(!key)//键按下
  23.         {
  24.                 count++;
  25.                 if(count>=2)//20ms防抖
  26.                 {
  27.                         sign=1;//按键操作标志1
  28.                         if(count>131)
  29.                                 count=131;//防止溢出
  30.                 }
  31.         }
  32.         else//键松手
  33.         {
  34.                 if(sign==1)
  35.                 {
  36.                         sign=0;//按键操作标志清0
  37.                         keystay=count;//保存计数值
  38.                 }
  39.                 count=0;//计数清0
  40.         }
  41. }

  42. void Judge(uint num)
  43. {
  44.         if(num>2 && num<=50)        //20~500ms 短按
  45.         {
  46.                 LED1=0;
  47.                 LED2=1;
  48.                 LED3=1;
  49.                 keystay=0;//中间变量清0
  50.         }
  51.         else if(num>50 && num<=130)//500~1300ms 略长按
  52.         {
  53.                 LED2=0;
  54.                 LED1=1;
  55.                 LED3=1;
  56.                 keystay=0;//中间变量清0
  57.         }
  58.         else if(num>130)//1.3s以上 长按
  59.         {
  60.                 LED3=0;
  61.                 LED1=1;
  62.                 LED2=1;
  63.                 keystay=0;//中间变量清0
  64.         }
  65. }

  66. void main()
  67. {
  68.         Timer0Init();
  69.         while(1)
  70.         {
  71.                 if(keystay!=0)//如果按键有效操作
  72.                 {
  73.                         Judge(keystay);
  74.                 }
  75.         }
  76. }
  77. void interrupt_timer0()interrupt 1
  78. {
  79.         TL0 = 0xF0;                //设置定时初值
  80.         TH0 = 0xD8;                //设置定时初值
  81.         keyscan();
  82. }
复制代码
回复

使用道具 举报

6#
ID:230975 发表于 2019-11-22 15:23 | 只看该作者
wulin 发表于 2019-11-4 22:35
给你改了一下,详细注释,能够满足你的要求。

师傅num在哪里体现自加的,是不是应该是count.void Judge(uint num)
{
        if(num>2 && num<=50)
是不是应该是count
回复

使用道具 举报

7#
ID:230975 发表于 2019-11-22 15:26 | 只看该作者
wulin 发表于 2019-11-4 22:35
给你改了一下,详细注释,能够满足你的要求。

不意思师傅。上面的没看完。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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