找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2714|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

如何把的程序加一個長按按鍵功能?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:738970 發(fā)表于 2020-6-28 00:56 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
要求在原程序上增加 k1 按鍵的 長按功能。 長按一秒 led 和 led1  燈一起亮。

單片機源程序如下:
#include <AT89X52.H>
unsigned char n = 0;
sbit k1 = P1^0;
sbit led = P0^0;
sbit led1 = P0^1;
void delay()
{
    unsigned int  i, j;
    for(i = 0; i < 100; i++)   for(j = 0; j < 100; j++);
}
void readkey(void)
{
    unsigned char  i, j;
    if(!k1)  {
      for(i = 0; i < 10; i++)
        for(j = 0; j < 120; j++);  
      if(!k1)  {
        while(!k1);  
        n++;
        n %= 2;       //n = 0~0
      }
    }
}
main()
{
    while(1)  {
      switch(n)    {
      case 0: led = 1;led1 = 1; readkey(); break;      
      case 1: led1 = 0;  delay(); readkey(); led=~led;
      }
    }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:435708 發(fā)表于 2020-6-28 06:23 | 只看該作者
需要使用定時器,按鍵掃描程序可以拓展

#include <reg51.h>
unsigned char n = 0;
unsigned char flag1ms,flag10ms;
sbit k1 = P1^0;
sbit led = P0^0;
sbit led1 = P0^1;
void key_led(void);
void Timer0Init(void);     //初始化定時器


void main()
{   
    Timer0Init();
    while (1)
        {                  

        if(flag1ms)         //以1ms為時基
        {
            flag1ms=0;
            flag10ms++;
            switch(n)    {
        case 0: led = 1;led1 = 1;break;      
         case 1: led1 = 0;  led=~led;
      }
            if(flag10ms>=10) //每10ms進行一次按鍵掃描
            {
                flag10ms=0;
                key_led();
            }

        }
        }
}

void Timer0() interrupt 1
{
                    //重裝載
    flag1ms=1;   
    TH0=0XFC;   
    TL0=0X18;

}

void key_led(void)
{
        static unsigned int key_press_time = 0;  // 記得標為靜態(tài)變量
        
        if(k1==0)
        {
            if(++key_press_time <=0 )
             --key_press_time;                //計量按鍵時間,并避免數(shù)據(jù)溢出
            if(key_press_time==100)            //以10ms為時基 計數(shù)100相當于1s,為長按
                {
                     led=0;                    //添加事件
                  led1=0;
                }
        }
            else      //短按
        {
            if(2<=key_press_time && key_press_time <100) //按鍵時長大于20ms,小于1s
            {
                    n++;
                    n%=2;
            }
  key_press_time=0;


        }

}

void Timer0Init(void)   
{
    TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。

    TH0=0XFC;    //給定時器賦初值,定時1ms
    TL0=0X18;   
    ET0=1;//打開定時器0中斷允許
    EA=1;//打開總中斷
    TR0=1;//打開定時器
    IT0=1;            
}

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

板凳
ID:213173 發(fā)表于 2020-6-28 09:36 | 只看該作者
#include <REG51.H>

unsigned int n = 0;

sbit k1 = P1^0;
sbit led = P0^0;
sbit led1 = P0^1;

void readkey(void)
{
        if(!k1)  
        {
                if(n<25001)  
                        n++;
                if(n==25000)       //長按
                        led1=~led1;
        }       
        else       
          {
                if(n>2500&&n<25000)//短按
                        led=~led;       
                n=0;
        }
}
void main()
{
        while(1)  
        {
                readkey();
        }
}
回復(fù)

使用道具 舉報

地板
ID:496636 發(fā)表于 2022-10-19 07:34 | 只看該作者
if(++key_press_time <=0 )
             --key_press_time;                //計量按鍵時間,并避免數(shù)據(jù)溢出
這里key_press_time被定義成unsigned int了,不會出現(xiàn)小于的情況吧,如果unsigned int是二字節(jié)的,那么當它等于0xffff時,再加1就會變成0,并溢出位on,產(chǎn)生溢出。這也沒避免數(shù)據(jù)溢出吧。
是否要寫成:
if(++key_press_time==0xffff)
          --key_press_time;
回復(fù)

使用道具 舉報

5#
ID:491577 發(fā)表于 2022-10-19 10:13 | 只看該作者
樓主的程序是開發(fā)板上的程序只適合了解按鍵的原理,實際按鍵程序是用定時器來實現(xiàn)的。給你一個參考程序:http://www.torrancerestoration.com/bbs/dpj-208253-1.html
回復(fù)

使用道具 舉報

6#
ID:161164 發(fā)表于 2022-10-19 15:02 | 只看該作者
  1. #include <REG52.H>

  2. unsigned char n = 0;
  3. sbit k1 = P1^0;
  4. sbit led = P0^0;
  5. sbit led1 = P0^1;
  6. void Delay1ms()                //@11.0592MHz
  7. {
  8.         unsigned char i, j;

  9.         i = 2;
  10.         j = 199;
  11.         do
  12.         {
  13.                 while (--j);
  14.         } while (--i);
  15. }

  16. void readkey(void)
  17. {
  18.         static unsigned int i=0;
  19.         if(!k1)
  20.         {
  21.                 if(i<0xFFFF)i++;
  22.                 if(i==1000)
  23.                 {
  24.                         n = 2;       //n = 0~0
  25.                 }
  26.         }else{
  27.                 if(i>20 && i<1000)n=++n%2;
  28.                 i=0;
  29.         }
  30. }
  31. main()
  32. {
  33.         while(1)
  34.         {
  35.                 readkey();
  36.                 switch(n)
  37.                 {
  38.                 case 0:
  39.                         led = 1;
  40.                         led1 = 1;
  41.                         break;
  42.                 case 1:
  43.                         led1 = 0;
  44.                         led=~led;
  45.                         break;
  46.                 case 2:
  47.                         led = 0;
  48.                         led1 = 0;
  49.                         break;
  50.                 }
  51.                 Delay1ms();
  52.         }
  53. }
復(fù)制代碼


回復(fù)

使用道具 舉報

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

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

快速回復(fù) 返回頂部 返回列表