標(biāo)題: 請(qǐng)教單片機(jī)按鍵時(shí)間長(zhǎng)短控制程序 [打印本頁]

作者: 秋風(fēng)涼    時(shí)間: 2019-11-4 01:20
標(biāo)題: 請(qǐng)教單片機(jī)按鍵時(shí)間長(zhǎng)短控制程序
剛開始學(xué)習(xí)  看到論壇里一個(gè)程序。想修改下,折騰一天。沒搞明白,特發(fā)帖請(qǐng)教。原貼地址在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)   //在第三個(gè)狀態(tài)這里怎么改成120時(shí)間內(nèi)沒有信號(hào)做出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;
         }
      }

  }






作者: 秋風(fēng)涼    時(shí)間: 2019-11-4 01:21
if(num>120)   //在第三個(gè)狀態(tài)這里怎么改成120時(shí)間內(nèi)沒有信號(hào)做出KEY3輸出控制呢?
{
key3=0;
key1=1;
key2=1;
i=0;
}  想修改這部分  
作者: 秋風(fēng)涼    時(shí)間: 2019-11-4 01:22
在第三個(gè)狀態(tài)這里怎么改成130時(shí)間內(nèi)沒有信號(hào)做出KEY3輸出控制呢?
作者: xianfajushi    時(shí)間: 2019-11-4 10:26
改為 if((50<num)&&(num<=120)){}else {}這樣試看
作者: wulin    時(shí)間: 2019-11-4 22:35
秋風(fēng)涼 發(fā)表于 2019-11-4 01:22
在第三個(gè)狀態(tài)這里怎么改成130時(shí)間內(nèi)沒有信號(hào)做出KEY3輸出控制呢?

給你改了一下,詳細(xì)注釋,能夠滿足你的要求。
  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;//計(jì)數(shù)變量
  9. uchar keystay=0;//中間變量
  10. bit sign=0;//按鍵操作標(biāo)志

  11. void Timer0Init() //10毫秒@12.000MHz
  12. {
  13.         TMOD= 0x01;                //設(shè)置定時(shí)器模式
  14.         TL0 = 0xF0;                //設(shè)置定時(shí)初值
  15.         TH0 = 0xD8;                //設(shè)置定時(shí)初值
  16.         TR0 = 1;                        //定時(shí)器0開始計(jì)時(shí)
  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;//按鍵操作標(biāo)志1
  28.                         if(count>131)
  29.                                 count=131;//防止溢出
  30.                 }
  31.         }
  32.         else//鍵松手
  33.         {
  34.                 if(sign==1)
  35.                 {
  36.                         sign=0;//按鍵操作標(biāo)志清0
  37.                         keystay=count;//保存計(jì)數(shù)值
  38.                 }
  39.                 count=0;//計(jì)數(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 略長(zhǎng)按
  52.         {
  53.                 LED2=0;
  54.                 LED1=1;
  55.                 LED3=1;
  56.                 keystay=0;//中間變量清0
  57.         }
  58.         else if(num>130)//1.3s以上 長(zhǎng)按
  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;                //設(shè)置定時(shí)初值
  80.         TH0 = 0xD8;                //設(shè)置定時(shí)初值
  81.         keyscan();
  82. }
復(fù)制代碼

作者: hmgqljz111    時(shí)間: 2019-11-22 15:23
wulin 發(fā)表于 2019-11-4 22:35
給你改了一下,詳細(xì)注釋,能夠滿足你的要求。

師傅num在哪里體現(xiàn)自加的,是不是應(yīng)該是count.void Judge(uint num)
{
        if(num>2 && num<=50)
是不是應(yīng)該是count
作者: hmgqljz111    時(shí)間: 2019-11-22 15:26
wulin 發(fā)表于 2019-11-4 22:35
給你改了一下,詳細(xì)注釋,能夠滿足你的要求。

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




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1