久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主
ID:738970 發表于 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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:435708 發表于 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;  // 記得標為靜態變量
        
        if(k1==0)
        {
            if(++key_press_time <=0 )
             --key_press_time;                //計量按鍵時間,并避免數據溢出
            if(key_press_time==100)            //以10ms為時基 計數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;            
}

評分

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

查看全部評分

回復

使用道具 舉報

板凳
ID:213173 發表于 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();
        }
}
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

6#
ID:161164 發表于 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. }
復制代碼


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线观看中文字幕视频 | 久久av.com| 一级欧美 | 综合久久一区 | 中文字幕亚洲一区二区三区 | 国产高清在线精品一区二区三区 | 日韩不卡视频在线 | 99国产精品一区二区三区 | 亚洲第1页 | 亚洲精品电影网在线观看 | 国产资源在线观看 | 91亚洲国产 | 中文字幕在线免费观看 | 亚洲一区二区三区在线播放 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 国产亚洲一区二区三区在线 | av影音资源| 国产日韩av一区二区 | 成人精品免费 | 亚洲小视频在线观看 | 自拍中文字幕 | 国产二区在线播放 | 精品欧美一区二区三区久久久 | 久久久精品一区二区三区 | 精国产品一区二区三区 | 99热这里都是精品 | aaaa一级毛片 | 欧美日本一区 | 欧美亚洲国产日韩 | 精品一区久久 | 国产午夜高清 | 日本精品一区二区三区视频 | 亚洲综合热 | 天天干精品 | 7777奇米影视 | 国产一级在线观看 | 精品1区 | 亚洲免费精品 | 色偷偷噜噜噜亚洲男人 | 精品久久精品 | 精品国产视频 |