找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索

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

查看數(shù): 2552 | 評(píng)論數(shù): 17 | 收藏 1
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請(qǐng)稍候......
發(fā)布時(shí)間: 2023-11-23 20:02

正文摘要:

求助51單片機(jī)一個(gè)按鍵分別控制兩個(gè)LED燈閃爍C程序,一個(gè)按鍵短按一下LED1燈閃亮,再短按一下LED1滅,長(zhǎng)按一下LED2燈閃亮,再短按一下LED2滅,謝謝。

回復(fù)

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

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

       if(++i>=400)
        {
                i=0;
                flashing=~flashing;
        }
ID:384552 發(fā)表于 2023-11-26 20:23

您好,在這個(gè)程序上改變LED閃爍時(shí)間怎么修改程序,如點(diǎn)亮2S,滅2秒,謝謝
ID:384552 發(fā)表于 2023-11-25 22:09

朋友謝謝您的辛苦付出
ID:384552 發(fā)表于 2023-11-25 19:00
tyrl800 發(fā)表于 2023-11-24 20:58
#include
  #include
  #define uchar unsigned char

謝謝您辛苦付出
ID:213173 發(fā)表于 2023-11-24 21:07
QDMLIT 發(fā)表于 2023-11-24 19:16
您好,您的程序我仿真后是按鍵短按下LED1點(diǎn)亮,再短按LED1滅,LED1并沒有閃爍,我這個(gè)實(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                        //宏定義長(zhǎng)按(約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. //定時(shí)器初始化程序
  12. void Timer0Init(void)//5毫秒@12.000MHz
  13. {
  14.         TMOD |= 0x01;        //設(shè)置定時(shí)器模式
  15.         TL0 = 0x78;                //設(shè)置定時(shí)初始值
  16.         TH0 = 0xEC;                //設(shè)置定時(shí)初始值
  17.         TF0 = 0;                //清除TF0標(biāo)志
  18.         TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
  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)//長(zhǎng)按
  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();//初始化定時(shí)器
  69.         while(1)
  70.         {
  71.                 if(TF0)//查詢定時(shí)器中斷請(qǐng)求位
  72.                 {
  73.                         TF0=0;
  74.                         TL0 = 0x78;                //設(shè)置定時(shí)初始值
  75.                         TH0 = 0xEC;                //設(shè)置定時(shí)初始值
  76.                         keyscan();                //按鍵掃描函數(shù)
  77.                         display();                //顯示函數(shù)
  78.                 }
  79.         }
  80. }
復(fù)制代碼
ID:275826 發(fā)表于 2023-11-24 20:58
QDMLIT 發(fā)表于 2023-11-24 19:16
您好,您的程序我仿真后是按鍵短按下LED1點(diǎn)亮,再短按LED1滅,LED1并沒有閃爍,我這個(gè)實(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;
   }
  /**********************************************************/
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并沒有閃爍,我這個(gè)實(shí)驗(yàn)是按鍵分別控制兩個(gè)LED燈閃爍C程序,一個(gè)按鍵短按一下LED1燈閃亮,再短按一下LED1滅,長(zhǎng)按一下LED2燈閃亮,再短按一下LED2滅,謝謝。
ID:275826 發(fā)表于 2023-11-24 15:47
QDMLIT 發(fā)表于 2023-11-24 12:47
我是個(gè)小白,這個(gè)程序不完整,麻煩補(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;
   }
  /**********************************************************/
ID:332444 發(fā)表于 2023-11-24 14:27
今天回復(fù)了一個(gè)類似短按和長(zhǎng)按的荔枝
[按鍵控制數(shù)碼管加減顯示
編寫程序,在數(shù)碼管上顯示000-255范圍內(nèi)的任意整數(shù)。具體要求是:K1按下后加1計(jì)數(shù),K2按下后減1計(jì)數(shù),K3按下后清零,而且,在不松開按鍵時(shí),數(shù)字會(huì)按一定時(shí)間間隔持續(xù)遞增或遞減。(1)畫出電路圖;(2)寫出源程序代碼并進(jìn)行仿真。求幫]

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

1.gif
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;
...

我是個(gè)小白,這個(gè)程序不完整,麻煩補(bǔ)充一下子唄,謝謝
ID:275826 發(fā)表于 2023-11-24 11:08
man1234567 發(fā)表于 2023-11-24 10:18
怎么看switch(flag_key_byte&0x03)只會(huì)出一個(gè)結(jié)果呢

3種結(jié)果,0,1,2;1短,2長(zhǎng),0 無
ID:123289 發(fā)表于 2023-11-24 10:33
做出以下三個(gè)變量:
1、閃動(dòng)變量FL:在定時(shí)器中斷服務(wù)程序中,每0.4秒FL求反一次。
2、長(zhǎng)按變量CA:界定出長(zhǎng)按時(shí),讓CA =1。
3、短按變量DA:界定出短按時(shí),讓DA = !DA。
輸出這樣寫就可以達(dá)成目的了:
LED1 = DA * FL
LED2 = CA * FL * DA
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)只會(huì)出一個(gè)結(jié)果呢
ID:123289 發(fā)表于 2023-11-24 09:59
先做出:彈動(dòng)、長(zhǎng)按、短按 的識(shí)別方法!
要點(diǎn):做一個(gè)計(jì)數(shù)器CJ來判定彈動(dòng)、長(zhǎng)按與短按,CJ的規(guī)則如下:
1、CJ計(jì)數(shù)只發(fā)生于定時(shí)器的中斷服務(wù)程序中,每次中斷+1,計(jì)滿不再計(jì),即不回0。
2、CJ計(jì)數(shù)只發(fā)生于鍵按下的時(shí)候,未按下不計(jì)。
3、做一個(gè)鍵狀態(tài)判定觸發(fā)標(biāo)記:B_OK,如果鍵未按下,但CJ<>0【彈起】,則置B_OK=1,表示是判斷鍵狀態(tài)的時(shí)候了。【彈起起效】
4、當(dāng)B_OK=1,判斷鍵狀態(tài)的界定法則是:CJ<某個(gè)值為彈動(dòng);CJ<某個(gè)值為短按;CJ>某個(gè)值為長(zhǎng)按,某個(gè)值是多少由你決定。建議事先將長(zhǎng)短兩個(gè)界定值放置在某個(gè)寄存器中,這樣可以隨意變更界定值。
5、狀態(tài)界定完成后將:B_OK清0、CJ清0以備下次再界定。
ID:161164 發(fā)表于 2023-11-24 09:17
如果LED1,2都亮的情況下再短按會(huì)如何?
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;
          }
          
         }
  /**********************************************************/
ID:195496 發(fā)表于 2023-11-24 08:17
難倒了小白,我是沒有時(shí)間寫,你加上幾個(gè)標(biāo)志就可以把完整的程序流程寫出來。

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

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

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