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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關(guān)于51單片機(jī)一個按鍵分別控制兩個LED燈閃爍C程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:384552 發(fā)表于 2023-11-23 20:02 | 只看該作者 |只看大圖 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
求助51單片機(jī)一個按鍵分別控制兩個LED燈閃爍C程序,一個按鍵短按一下LED1燈閃亮,再短按一下LED1滅,長按一下LED2燈閃亮,再短按一下LED2滅,謝謝。

51單片機(jī).PNG (61.67 KB, 下載次數(shù): 74)

51單片機(jī).PNG
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:195496 發(fā)表于 2023-11-24 08:17 | 只看該作者
難倒了小白,我是沒有時間寫,你加上幾個標(biāo)志就可以把完整的程序流程寫出來。
回復(fù)

使用道具 舉報

板凳
ID:275826 發(fā)表于 2023-11-24 09:06 | 只看該作者
uchar bdata flag_key_byte=0xff;
  sbit keyflag=flag_key_byte^0;
  sbit keyflag1=flag_key_byte^1;
  /**********************************************************/
void keyscan(void)
   {
    keyflag1=keyflag;
        keyflag=Key;

        switch(flag_key_byte&0x03)
          {
           case 0:cnt++;break;
           case 2:cnt++;break;
           case 1:if(cnt>30)kv=2;
                     else if(cnt>5)kv=1;
                  else kv=0;
                  cnt=0;
                  flag_key_byte=0xff; break;
          }
          
         }
  /**********************************************************/
回復(fù)

使用道具 舉報

地板
ID:161164 發(fā)表于 2023-11-24 09:17 | 只看該作者
如果LED1,2都亮的情況下再短按會如何?
回復(fù)

使用道具 舉報

5#
ID:123289 發(fā)表于 2023-11-24 09:59 | 只看該作者
先做出:彈動、長按、短按 的識別方法!
要點(diǎn):做一個計(jì)數(shù)器CJ來判定彈動、長按與短按,CJ的規(guī)則如下:
1、CJ計(jì)數(shù)只發(fā)生于定時器的中斷服務(wù)程序中,每次中斷+1,計(jì)滿不再計(jì),即不回0。
2、CJ計(jì)數(shù)只發(fā)生于鍵按下的時候,未按下不計(jì)。
3、做一個鍵狀態(tài)判定觸發(fā)標(biāo)記:B_OK,如果鍵未按下,但CJ<>0【彈起】,則置B_OK=1,表示是判斷鍵狀態(tài)的時候了。【彈起起效】
4、當(dāng)B_OK=1,判斷鍵狀態(tài)的界定法則是:CJ<某個值為彈動;CJ<某個值為短按;CJ>某個值為長按,某個值是多少由你決定。建議事先將長短兩個界定值放置在某個寄存器中,這樣可以隨意變更界定值。
5、狀態(tài)界定完成后將:B_OK清0、CJ清0以備下次再界定。
回復(fù)

使用道具 舉報

6#
ID:584814 發(fā)表于 2023-11-24 10:18 | 只看該作者
tyrl800 發(fā)表于 2023-11-24 09:06
uchar bdata flag_key_byte=0xff;
  sbit keyflag=flag_key_byte^0;
  sbit keyflag1=flag_key_byte^1;
...

怎么看switch(flag_key_byte&0x03)只會出一個結(jié)果呢
回復(fù)

使用道具 舉報

7#
ID:123289 發(fā)表于 2023-11-24 10:33 | 只看該作者
做出以下三個變量:
1、閃動變量FL:在定時器中斷服務(wù)程序中,每0.4秒FL求反一次。
2、長按變量CA:界定出長按時,讓CA =1。
3、短按變量DA:界定出短按時,讓DA = !DA。
輸出這樣寫就可以達(dá)成目的了:
LED1 = DA * FL
LED2 = CA * FL * DA
回復(fù)

使用道具 舉報

8#
ID:275826 發(fā)表于 2023-11-24 11:08 | 只看該作者
man1234567 發(fā)表于 2023-11-24 10:18
怎么看switch(flag_key_byte&0x03)只會出一個結(jié)果呢

3種結(jié)果,0,1,2;1短,2長,0 無
回復(fù)

使用道具 舉報

9#
ID:384552 發(fā)表于 2023-11-24 12:47 | 只看該作者
tyrl800 發(fā)表于 2023-11-24 09:06
uchar bdata flag_key_byte=0xff;
  sbit keyflag=flag_key_byte^0;
  sbit keyflag1=flag_key_byte^1;
...

我是個小白,這個程序不完整,麻煩補(bǔ)充一下子唄,謝謝
回復(fù)

使用道具 舉報

10#
ID:332444 發(fā)表于 2023-11-24 14:27 | 只看該作者
今天回復(fù)了一個類似短按和長按的荔枝
[按鍵控制數(shù)碼管加減顯示
編寫程序,在數(shù)碼管上顯示000-255范圍內(nèi)的任意整數(shù)。具體要求是:K1按下后加1計(jì)數(shù),K2按下后減1計(jì)數(shù),K3按下后清零,而且,在不松開按鍵時,數(shù)字會按一定時間間隔持續(xù)遞增或遞減。(1)畫出電路圖;(2)寫出源程序代碼并進(jìn)行仿真。求幫]

1.gif (379.09 KB, 下載次數(shù): 99)

1.gif
回復(fù)

使用道具 舉報

11#
ID:275826 發(fā)表于 2023-11-24 15:47 | 只看該作者
QDMLIT 發(fā)表于 2023-11-24 12:47
我是個小白,這個程序不完整,麻煩補(bǔ)充一下子唄,謝謝

#include <reg51.h>
  #include <intrins.h>
  #define uchar unsigned char
  #define uint  unsigned int
  sbit Key =P3^7;
  uchar cnt,kv;
  sbit led1=P1^0;
  sbit led2=P1^1;
  bit bit_10ms=0;
  uchar bdata flag_key_byte=0xff;
  sbit keyflag=flag_key_byte^0;
  sbit keyflag1=flag_key_byte^1;
  /**********************************************************/
void keyscan(void)
   {
    keyflag1=keyflag;
        keyflag=Key;

        switch(flag_key_byte&0x03)
          {
           case 0:cnt++;break;
           case 2:cnt++;break;
           case 1:if(cnt>30)kv=2;
                     else if(cnt>5)kv=1;
                  else kv=0;
                  cnt=0;
                  flag_key_byte=0xff; break;
          }
       
         }
  /**********************************************************/
void main()
   {
         
         TH0=(65536-20000)/256;
     TL0=(65536-20000)%256;
         TMOD=0X01;
         ET0=EA=TR0=1;
          while(1)
            {
                 if(bit_10ms)
                   {keyscan();
                    bit_10ms=0;
                   }
                 if(kv==1) {led1=!led1;kv=0;}
                 if(kv==2) {led2=!led2;kv=0;}
                }
         }
  /**********************************************************/

   void DelayInt() interrupt 1
   {TH0=(65536-20000)/256;
    TL0=(65536-20000)%256;
        bit_10ms=1;
   }
  /**********************************************************/
回復(fù)

使用道具 舉報

12#
ID:384552 發(fā)表于 2023-11-24 19:16 | 只看該作者
tyrl800 發(fā)表于 2023-11-24 15:47
#include
  #include
  #define uchar unsigned char

您好,您的程序我仿真后是按鍵短按下LED1點(diǎn)亮,再短按LED1滅,LED1并沒有閃爍,我這個實(shí)驗(yàn)是按鍵分別控制兩個LED燈閃爍C程序,一個按鍵短按一下LED1燈閃亮,再短按一下LED1滅,長按一下LED2燈閃亮,再短按一下LED2滅,謝謝。
回復(fù)

使用道具 舉報

13#
ID:275826 發(fā)表于 2023-11-24 20:58 | 只看該作者
QDMLIT 發(fā)表于 2023-11-24 19:16
您好,您的程序我仿真后是按鍵短按下LED1點(diǎn)亮,再短按LED1滅,LED1并沒有閃爍,我這個實(shí)驗(yàn)是按鍵分別控制 ...

#include <reg51.h>
  #include <intrins.h>
  #define uchar unsigned char
  #define uint  unsigned int
  sbit Key =P3^7;
  uchar cnt,flashcnt;
  sbit led1=P1^0;
  sbit led2=P1^1;
  bit bit_10ms=0,flag1,flag2;
  uchar bdata flag_key_byte=0xff;
  sbit keyflag=flag_key_byte^0;
  sbit keyflag1=flag_key_byte^1;
  /**********************************************************/
uchar keyscan(void)
   {uchar kv=0;
    keyflag1=keyflag;
        keyflag=Key;

        switch(flag_key_byte&0x03)
          {
           case 0:cnt++;break;
           case 2:cnt++;break;
           case 1:if(cnt>30)kv=2;
                     else if(cnt>5)kv=1;
                  else kv=0;
                  cnt=0;
                  flag_key_byte=0xff; break;
          }
          return kv;
         }
  /**********************************************************/
void main()
   {
         uchar kv=0;
         TH0=(65536-20000)/256;
     TL0=(65536-20000)%256;
         TMOD=0X01;
         ET0=EA=TR0=1;
          while(1)
            {
                 if(bit_10ms)
                   {kv=keyscan();
                    bit_10ms=0;
                    if(kv==1) {flag1=!flag1;}
                    if(kv==2) {flag2=!flag2;}
                        if(!flag1)  led1=1;
                    if(!flag2)  led2=1;
                        flashcnt++;
                        if(flashcnt==10)
                          {
                           flashcnt=0;
                           if(flag1) led1=!led1;
                       if(flag2) led2=!led2;
                          }
                   }

                }
         }
  /**********************************************************/

   void DelayInt() interrupt 1
   {TH0=(65536-20000)/256;
    TL0=(65536-20000)%256;
        bit_10ms=1;
   }
  /**********************************************************/
回復(fù)

使用道具 舉報

14#
ID:213173 發(fā)表于 2023-11-24 21:07 | 只看該作者
QDMLIT 發(fā)表于 2023-11-24 19:16
您好,您的程序我仿真后是按鍵短按下LED1點(diǎn)亮,再短按LED1滅,LED1并沒有閃爍,我這個實(shí)驗(yàn)是按鍵分別控制 ...
  1. #include <REG51.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define key_S 3                                        //宏定義短按(約15ms)
  5. #define key_L key_S*40                        //宏定義長按(約600ms)

  6. sbit key =P3^5;
  7. sbit LED1=P1^0;
  8. sbit LED2=P1^1;

  9. uchar KeySec;//鍵值
  10. bit flashing=0;//閃爍標(biāo)志

  11. //定時器初始化程序
  12. void Timer0Init(void)//5毫秒@12.000MHz
  13. {
  14.         TMOD |= 0x01;        //設(shè)置定時器模式
  15.         TL0 = 0x78;                //設(shè)置定時初始值
  16.         TH0 = 0xEC;                //設(shè)置定時初始值
  17.         TF0 = 0;                //清除TF0標(biāo)志
  18.         TR0 = 1;                //定時器0開始計(jì)時
  19. }

  20. void keyscan()
  21. {
  22.         static unsigned int time=0;//計(jì)數(shù)變量
  23.         if(!key)//按鍵按下
  24.         {
  25.                 time++;
  26.                 if(time>=key_L && KeySec==0)//長按
  27.                 {
  28.                         KeySec=2;
  29.                 }
  30.         }
  31.         else                                //松手
  32.         {
  33.                 if(time>key_S && time<key_L)//短按
  34.                 {
  35.                         if(KeySec==0)KeySec=1;
  36.                         else if(KeySec==1)KeySec=0;
  37.                         else if(KeySec==2)KeySec=0;
  38.                 }
  39.                 time=0;
  40.         }
  41. }

  42. void display()//顯示函數(shù)
  43. {
  44.         static uchar i=0;

  45.         if(++i>=50)
  46.         {
  47.                 i=0;
  48.                 flashing=~flashing;
  49.         }
  50.         if(KeySec==0)
  51.         {
  52.                 LED1=1;
  53.                 LED2=1;
  54.         }
  55.         if(KeySec==1)
  56.         {
  57.                 LED1=flashing;
  58.                 LED2=1;
  59.         }
  60.         if(KeySec==2)
  61.         {
  62.                 LED1=1;
  63.                 LED2=flashing;
  64.         }
  65. }

  66. void main()//主函數(shù)
  67. {
  68.         Timer0Init();//初始化定時器
  69.         while(1)
  70.         {
  71.                 if(TF0)//查詢定時器中斷請求位
  72.                 {
  73.                         TF0=0;
  74.                         TL0 = 0x78;                //設(shè)置定時初始值
  75.                         TH0 = 0xEC;                //設(shè)置定時初始值
  76.                         keyscan();                //按鍵掃描函數(shù)
  77.                         display();                //顯示函數(shù)
  78.                 }
  79.         }
  80. }
復(fù)制代碼
回復(fù)

使用道具 舉報

15#
ID:384552 發(fā)表于 2023-11-25 19:00 | 只看該作者
tyrl800 發(fā)表于 2023-11-24 20:58
#include
  #include
  #define uchar unsigned char

謝謝您辛苦付出
回復(fù)

使用道具 舉報

16#
ID:384552 發(fā)表于 2023-11-25 22:09 | 只看該作者

朋友謝謝您的辛苦付出
回復(fù)

使用道具 舉報

17#
ID:384552 發(fā)表于 2023-11-26 20:23 | 只看該作者

您好,在這個程序上改變LED閃爍時間怎么修改程序,如點(diǎn)亮2S,滅2秒,謝謝
回復(fù)

使用道具 舉報

18#
ID:213173 發(fā)表于 2023-11-27 05:51 | 只看該作者
QDMLIT 發(fā)表于 2023-11-26 20:23
您好,在這個程序上改變LED閃爍時間怎么修改程序,如點(diǎn)亮2S,滅2秒,謝謝

void display()//顯示函數(shù)
{
        static uint i=0;

       if(++i>=400)
        {
                i=0;
                flashing=~flashing;
        }
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 9191成人精品久久 | 亚洲精品三级 | 欧美精品一区二区免费 | av在线播放网 | 久久一区二区三区四区 | 99精品欧美一区二区三区综合在线 | 久久久久久综合 | 日本中出视频 | 夜夜草视频 | 国产美女永久免费无遮挡 | 国产精品久久久久久久久久久久久久 | 男女羞羞免费网站 | 亚洲国产在 | 国产aⅴ爽av久久久久久久 | 亚洲一区国产 | 久久国产欧美日韩精品 | 狠狠亚洲 | 日韩欧美一级片 | 国产高清在线精品一区二区三区 | 免费污视频 | 久久久这里只有17精品 | 日韩一区二区在线视频 | 少妇av片| 久久久一区二区 | av手机在线免费观看 | 欧美自拍另类 | 午夜久久久久 | 久久久久久毛片免费观看 | 日本欧美在线视频 | 亚洲成人在线视频播放 | 欧美精品一区二区在线观看 | 午夜欧美 | 亚洲不卡在线观看 | 99视频免费看 | 欧美一级欧美一级在线播放 | 久久精品欧美一区二区三区不卡 | 久久中文字幕一区 | 日本一二三区在线观看 | 亚洲风情在线观看 | 国产精品欧美一区二区三区不卡 | 国产一区二区在线视频 |