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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2318|回復: 17
收起左側

關于51單片機一個按鍵分別控制兩個LED燈閃爍C程序

[復制鏈接]
ID:384552 發表于 2023-11-23 20:02 | 顯示全部樓層 |閱讀模式
求助51單片機一個按鍵分別控制兩個LED燈閃爍C程序,一個按鍵短按一下LED1燈閃亮,再短按一下LED1滅,長按一下LED2燈閃亮,再短按一下LED2滅,謝謝。
51單片機.PNG
回復

使用道具 舉報

ID:195496 發表于 2023-11-24 08:17 | 顯示全部樓層
難倒了小白,我是沒有時間寫,你加上幾個標志就可以把完整的程序流程寫出來。
回復

使用道具 舉報

ID:275826 發表于 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:161164 發表于 2023-11-24 09:17 | 顯示全部樓層
如果LED1,2都亮的情況下再短按會如何?
回復

使用道具 舉報

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

使用道具 舉報

ID:584814 發表于 2023-11-24 10:18 | 顯示全部樓層
tyrl800 發表于 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)只會出一個結果呢
回復

使用道具 舉報

ID:123289 發表于 2023-11-24 10:33 | 顯示全部樓層
做出以下三個變量:
1、閃動變量FL:在定時器中斷服務程序中,每0.4秒FL求反一次。
2、長按變量CA:界定出長按時,讓CA =1。
3、短按變量DA:界定出短按時,讓DA = !DA。
輸出這樣寫就可以達成目的了:
LED1 = DA * FL
LED2 = CA * FL * DA
回復

使用道具 舉報

ID:275826 發表于 2023-11-24 11:08 | 顯示全部樓層
man1234567 發表于 2023-11-24 10:18
怎么看switch(flag_key_byte&0x03)只會出一個結果呢

3種結果,0,1,2;1短,2長,0 無
回復

使用道具 舉報

ID:384552 發表于 2023-11-24 12:47 | 顯示全部樓層
tyrl800 發表于 2023-11-24 09:06
uchar bdata flag_key_byte=0xff;
  sbit keyflag=flag_key_byte^0;
  sbit keyflag1=flag_key_byte^1;
...

我是個小白,這個程序不完整,麻煩補充一下子唄,謝謝
回復

使用道具 舉報

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

1.gif
回復

使用道具 舉報

ID:275826 發表于 2023-11-24 15:47 | 顯示全部樓層
QDMLIT 發表于 2023-11-24 12:47
我是個小白,這個程序不完整,麻煩補充一下子唄,謝謝

#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:384552 發表于 2023-11-24 19:16 | 顯示全部樓層
tyrl800 發表于 2023-11-24 15:47
#include
  #include
  #define uchar unsigned char

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

使用道具 舉報

ID:275826 發表于 2023-11-24 20:58 | 顯示全部樓層
QDMLIT 發表于 2023-11-24 19:16
您好,您的程序我仿真后是按鍵短按下LED1點亮,再短按LED1滅,LED1并沒有閃爍,我這個實驗是按鍵分別控制 ...

#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:213173 發表于 2023-11-24 21:07 | 顯示全部樓層
QDMLIT 發表于 2023-11-24 19:16
您好,您的程序我仿真后是按鍵短按下LED1點亮,再短按LED1滅,LED1并沒有閃爍,我這個實驗是按鍵分別控制 ...
  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;//閃爍標志

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

  20. void keyscan()
  21. {
  22.         static unsigned int time=0;//計數變量
  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()//顯示函數
  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()//主函數
  67. {
  68.         Timer0Init();//初始化定時器
  69.         while(1)
  70.         {
  71.                 if(TF0)//查詢定時器中斷請求位
  72.                 {
  73.                         TF0=0;
  74.                         TL0 = 0x78;                //設置定時初始值
  75.                         TH0 = 0xEC;                //設置定時初始值
  76.                         keyscan();                //按鍵掃描函數
  77.                         display();                //顯示函數
  78.                 }
  79.         }
  80. }
復制代碼
回復

使用道具 舉報

ID:384552 發表于 2023-11-25 19:00 | 顯示全部樓層
tyrl800 發表于 2023-11-24 20:58
#include
  #include
  #define uchar unsigned char

謝謝您辛苦付出
回復

使用道具 舉報

ID:384552 發表于 2023-11-25 22:09 | 顯示全部樓層

朋友謝謝您的辛苦付出
回復

使用道具 舉報

ID:384552 發表于 2023-11-26 20:23 | 顯示全部樓層

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

使用道具 舉報

ID:213173 發表于 2023-11-27 05:51 | 顯示全部樓層
QDMLIT 發表于 2023-11-26 20:23
您好,在這個程序上改變LED閃爍時間怎么修改程序,如點亮2S,滅2秒,謝謝

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

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91在线综合 | 欧美国产视频一区二区 | 色视频网站| 国产欧美在线观看 | 国产欧美在线 | 久久国产日韩 | 国产一区二区三区视频免费观看 | 81精品国产乱码久久久久久 | www.男人天堂.com| 国产做a爱片久久毛片 | 日韩在线视频播放 | 亚洲国产精品激情在线观看 | 久久九九色 | 黄色电影在线免费观看 | 色婷婷av一区二区三区软件 | 久久精品中文 | 亚洲三区在线观看 | 亚洲美女视频 | 精品视频免费 | 国产二区av | 九色视频网站 | 一级毛片视频 | 久久这里只有精品首页 | 日韩欧美精品 | 久久国产99 | 日韩中文一区 | 色婷婷av一区二区三区软件 | 国产在线视频一区 | www日| 亚洲 精品 综合 精品 自拍 | 国产在线中文 | 亚洲欧美综合精品久久成人 | 亚洲人人 | 亚洲在线一区 | 国产激情精品视频 | 一起操网站 | 日韩av在线不卡 | www.色53色.com | 久久69精品久久久久久久电影好 | 中文字幕欧美一区 | 福利成人|