找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2773|回復: 6
打印 上一主題 下一主題
收起左側

請教單片機按鍵時間長短控制程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:634487 發(fā)表于 2019-11-4 01:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
剛開始學習  看到論壇里一個程序。想修改下,折騰一天。沒搞明白,特發(fā)帖請教。原貼地址在http://www.torrancerestoration.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)   //在第三個狀態(tài)這里怎么改成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 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:634487 發(fā)表于 2019-11-4 01:21 | 只看該作者
if(num>120)   //在第三個狀態(tài)這里怎么改成120時間內沒有信號做出KEY3輸出控制呢?
{
key3=0;
key1=1;
key2=1;
i=0;
}  想修改這部分  
回復

使用道具 舉報

板凳
ID:634487 發(fā)表于 2019-11-4 01:22 | 只看該作者
在第三個狀態(tài)這里怎么改成130時間內沒有信號做出KEY3輸出控制呢?
回復

使用道具 舉報

地板
ID:332444 發(fā)表于 2019-11-4 10:26 | 只看該作者
改為 if((50<num)&&(num<=120)){}else {}這樣試看
回復

使用道具 舉報

5#
ID:213173 發(fā)表于 2019-11-4 22:35 | 只看該作者
秋風涼 發(fā)表于 2019-11-4 01:22
在第三個狀態(tài)這里怎么改成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;//計數(shù)變量
  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;//保存計數(shù)值
  38.                 }
  39.                 count=0;//計數(shù)清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 發(fā)表于 2019-11-22 15:23 | 只看該作者
wulin 發(fā)表于 2019-11-4 22:35
給你改了一下,詳細注釋,能夠滿足你的要求。

師傅num在哪里體現(xiàn)自加的,是不是應該是count.void Judge(uint num)
{
        if(num>2 && num<=50)
是不是應該是count
回復

使用道具 舉報

7#
ID:230975 發(fā)表于 2019-11-22 15:26 | 只看該作者
wulin 發(fā)表于 2019-11-4 22:35
給你改了一下,詳細注釋,能夠滿足你的要求。

不意思師傅。上面的沒看完。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表