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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機單按鍵多擊程序修改

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:91521 發(fā)表于 2020-7-5 09:33 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 daiya 于 2020-7-5 17:06 編輯

寫了一個響應(yīng)單按鍵多擊的程序,按鍵彈起大于0.5S后返回鍵值,有問題,無法運行。可是我才疏學(xué)淺,找不到問題出在哪里。請各位高人幫忙看看問題出在哪?

#include <reg52.h>

sbit LED0 = P1^0;
sbit LED1 = P1^1;
sbit LED2 = P1^2;

sbit KEY1 = P3^2;

unsigned int count = 0,ClickFlag = 0,ClickFlagCount = 0,LongClickFlag = 0;
unsigned char i = 0,Click = 0;
unsigned char keynum = 0;

unsigned char keyscan(void)
{
    if(KEY1)
    {                                                
        if(count > 30 && count < 3000)
        {        
                ClickFlag = 1;
                keynum++;
        }
        count = 0;
        if(ClickFlag == 1)
        {               
            if(ClickFlagCount++ > 500)
            {
                ClickFlag = 0;
                ClickFlagCount = 0;
                return keynum;
                keynum = 0;
            }
            else
            {
                ClickFlag = 0;
                ClickFlagCount = 0;
            }        
        }
        else
        {
            ClickFlagCount = 0;
        }
    }   
    else   
    {
        count++;
        if(count > 3000)
            count = 3001;   
    }
    return 0;
}

void main()
{
    EA = 1;       //使能總中斷
    TMOD = 0x01;  //設(shè)置T0為模式1
    TH0  = 0xFC;  //為T0賦初值0xFC67,定時1ms
    TL0  = 0x67;
    ET0  = 1;     //使能T0中斷
    TR0  = 1;     //啟動T0

    while (1)
    {
        if(i==1)
            LED0 = ~LED0;
        if(i==2)
            LED1 = ~LED1;
        if(i==3)
            LED2 = ~LED2;
    }     
}

/* 定時器0中斷服務(wù)函數(shù) */
void InterruptTimer0() interrupt 1
{
    TH0 = 0xFC;  //重新加載初值
    TL0 = 0x67;
    i = keyscan();
}


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

使用道具 舉報

沙發(fā)
ID:452950 發(fā)表于 2020-7-5 12:09 | 只看該作者
本帖最后由 xxpp2011 于 2020-7-6 10:13 編輯

while(Key==0)//如果有按鍵按下
{    count=0;
  while(Key==1)//等待按鍵彈起
  {
    if(Key==0)//如果按鍵再次按下
    {
    執(zhí)行雙擊操作;
    break;//結(jié)束循環(huán)
    }
  count++;//計數(shù)
  if(count==100)//如果100個周期內(nèi)無第二次按鍵則執(zhí)行單擊操作
    {
    執(zhí)行單擊操作;
    break;//結(jié)束循環(huán)
    }
  }
if(count!=0)break;
}



回復(fù)

使用道具 舉報

板凳
ID:91521 發(fā)表于 2020-7-6 08:30 | 只看該作者
你給的程序只是雙擊按鍵,和我的程序的要求不同
回復(fù)

使用道具 舉報

地板
ID:401564 發(fā)表于 2020-7-6 08:51 | 只看該作者
哥們,你另一個帖子已經(jīng)有幾個人幫你了,有C,有匯編,有代碼,有算法,有偽代碼,就差幫你把所有代碼寫出來了
單擊,雙擊,長按.短按,這是一個單片機按鍵應(yīng)用非常入門的,相對簡單的知識
這只是按鍵問題,用不到定時器的
按鍵按下之后是一定要去抖動的,可以是5mS的延時,然后,一邊延時一邊檢測按鍵有沒有松開,順便記錄松開的時間,用來判斷是長按,短按,還是雙擊
你還要檢測一下超過長按的時間,比如是一直按下那要怎么做...........
回復(fù)

使用道具 舉報

5#
ID:213173 發(fā)表于 2020-7-6 08:51 | 只看該作者
按鍵初次按下開始計時,0.5s后輸出鍵值1~3有效,超過3此按3次計。
  1. #include <reg52.h>

  2. sbit LED0 = P1^0;
  3. sbit LED1 = P1^1;
  4. sbit LED2 = P1^2;

  5. sbit KEY1 = P3^2;

  6. unsigned char  count=0;
  7. bit ClickFlag=0,Click=0;
  8. unsigned char i = 0;
  9. unsigned char keynum = 0;
  10. unsigned int  num;

  11. void keyscan(void)
  12. {
  13.         if(!KEY1)
  14.         {                                                
  15.                 if(++count>10 && ClickFlag==0)
  16.                 {        
  17.                         ClickFlag=1;
  18.                         Click=1;
  19.                         if(keynum<3)
  20.                                 keynum++;
  21.                 }
  22.         }   
  23.         else   
  24.         {
  25.                 count=0;
  26.                 ClickFlag=0;   
  27.         }
  28. }

  29. void main()
  30. {
  31.         TMOD= 0x01;
  32.         TL0 = 0x18;         //1毫秒@12.000MHz
  33.         TH0 = 0xFC;
  34.         TR0 = 1;                 //定時器0開始計時
  35.         ET0 = 1;     //使能T0中斷
  36.         EA  = 1;     //使能總中斷
  37.         while (1)
  38.         {
  39.                 if(i>0)
  40.                 {
  41.                         if(i==1)
  42.                                 LED0 = ~LED0;
  43.                         if(i==2)
  44.                                 LED1 = ~LED1;
  45.                         if(i>=3)
  46.                                 LED2 = ~LED2;
  47.                         i=0;//清0
  48.                 }
  49.         }     
  50. }

  51. /* 定時器0中斷服務(wù)函數(shù) */
  52. void InterruptTimer0() interrupt 1
  53. {
  54.         TL0 = 0x18;
  55.         TH0 = 0xFC;
  56.         keyscan();
  57.         if(Click)//開始計時
  58.         {
  59.                 num++;
  60.                 if(num>=500)//0.5s
  61.                 {
  62.                         num=0;   //清0
  63.                         i=keynum;//取鍵值
  64.                         keynum=0;//鍵值清0
  65.                         Click=0; //停止計時
  66.                 }
  67.         }
  68. }
復(fù)制代碼
回復(fù)

使用道具 舉報

6#
ID:158375 發(fā)表于 2020-7-6 09:03 | 只看該作者
unsigned char keyscan(void)
只是看到邏輯混亂啊。。。。。。
回復(fù)

使用道具 舉報

7#
ID:91521 發(fā)表于 2020-7-6 11:16 | 只看該作者
我添加了注釋,不知道可不可以看清楚邏輯了?

unsigned char keyscan(void)
{
    if(KEY1)
    {                                                
        if(count > 30 && count < 3000)    //如果按下時間30ms~3s,認為是單擊
        {        
                ClickFlag = 1;    //按鍵抬起標(biāo)志置1
                keynum++;    //鍵號加1
        }
        count = 0;    // 鍵按下時間計數(shù)器清0
        if(ClickFlag == 1)    //如果按鍵抬起標(biāo)志為1
        {               
            if(ClickFlagCount++ > 500)    //按鍵抬起時間大于0.5s
            {
                ClickFlag = 0;    //按鍵抬起標(biāo)志清0
                return keynum;    //返回鍵號
                keynum = 0;    //鍵號清0
            }
            else    //按鍵抬起時間小于0.5s
            {
                ClickFlag = 0;
            }        
        }
        else    //如果按鍵抬起標(biāo)志為0
        {
            ClickFlagCount = 0;    //清0按鍵抬起時間計數(shù)器
        }
    }   
    else   
    {
        count++;    //按鍵按下時間計數(shù)器加1
        if(count > 3000)    //防止數(shù)據(jù)溢出
            count = 3001;   
    }
    return 0;
}
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩中文字幕免费在线观看 | 亚洲精品欧美 | 日韩精品一区二区三区中文字幕 | 亚洲精品免费在线 | 久久久精品一区二区三区 | 最新国产视频 | 成人二区 | 超黄视频网站 | 日批免费看 | 在线婷婷 | 国产精品一区二区欧美 | 97精品久久 | 日韩三级 | 成人影院在线观看 | 日韩一区二区三区在线观看 | a在线视频 | 黄网站免费在线 | 91视频在线观看免费 | 91精品国产综合久久久久蜜臀 | 国产精品视频999 | 成人av一区二区亚洲精 | 日韩精品一区二区三区在线观看 | 久久久久久久香蕉 | 久久成人免费 | 国产午夜三级一区二区三 | 精品福利av导航 | 99久久精品免费看国产高清 | 国产精品久久久久一区二区三区 | 国产成人小视频 | 91中文字幕在线 | 中文字幕一区在线观看视频 | 一区二区免费 | 日本精品裸体写真集在线观看 | 超碰97免费观看 | 国产精品久久久久久婷婷天堂 | 日本成人片在线观看 | 免费一区二区三区 | 日日夜夜视频 | 超碰在线免费av | 色噜噜亚洲男人的天堂 | 日韩午夜在线观看 |