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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2196|回復: 8
打印 上一主題 下一主題
收起左側(cè)

單片機LED磁控開關跑馬,長按切換模式,短按開關,求大佬指正,程序看視頻學的

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1002664 發(fā)表于 2022-1-19 16:46 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <reg51.h> // <reg51.h>電腦程序?qū)嶒?nbsp; <STC8G.h>

sbit key1=P3^0;

unsigned char dat1[4]={0xf1,0xf2,0xf4,0xf8};
unsigned char dat2[4]={0xfc,0xf9,0xf3,0xf6};
unsigned char dat3[4]={0xfe,0xfd,0xfb,0xf7};


unsigned char MODE=0;
void delay (unsigned int x);
void mode1(void);
void mode2(void);
void mode3(void);
void keyscan(void);

void main(void)
{
        while(1)
        {
                keyscan();
                switch(MODE)
                {
                        case 0: mode1();break;
                  case 1: mode2();break;
                  case 2: mode3();break;
                }
        }
}

void delay(unsigned int x)
{
        unsigned int i,j;
        for(i=0;i<x;i++)
        {
                for(j=0;j<333;j++);
        }
}

void mode1(void)
{
        unsigned char i;
        for(i=0;i<4;i++)
        {
                  P0=dat1[ i];delay(100);
               
         }
}
void mode2(void)
{
        unsigned char i;
        for(i=0;i<4;i++)
        {
                  P0=dat2[ i];delay(100);
               
         }
}
void mode3(void)
{
        unsigned char i;
        for(i=0;i<4;i++)
        {
                  P0=dat3[ i];delay(100);
               
         }
}

void keyscan(void)
{
          if(key1==0);
        {
                delay(1000);
                if(key1==0)
                {
                        MODE++;
                        MODE%=3;
                        while(key1==0);
                   }
           }   
                  if(key1==0);
        {
                delay(10);
                if(key1==0);P0=1,P0=0;
        
                        
           }   
}


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

使用道具 舉報

沙發(fā)
ID:161164 發(fā)表于 2022-1-19 17:57 | 只看該作者
本帖最后由 lkc8210 于 2022-1-19 21:46 編輯

重申一次:不要用delay!不要用delay!不要用delay!

如果一定要用,可以這樣改
  1. void keyscan(void)
  2. {
  3.         unsigned char Count= 0;
  4.         if(key1==0)
  5.         {
  6.                 while(key1==0)
  7.                 {
  8.                         delay(10);
  9.                         Count++;
  10.                 }
  11.                 if(Count > 30)
  12.                   if(Count >= 100)
  13.                   {
  14.                           MODE++;
  15.                           MODE%=3;
  16.                   }
  17.                   else
  18.                   {
  19.                           P0=1,P0=0;
  20.                   }
  21.         }
  22. }
復制代碼
回復

使用道具 舉報

板凳
ID:1002664 發(fā)表于 2022-1-19 18:33 來自手機 | 只看該作者
自學中,我理解長按短按就是用delay來判斷按的時長不用delay怎么按1秒切換流水模式,按一下開關
回復

使用道具 舉報

地板
ID:1002664 發(fā)表于 2022-1-19 18:34 來自手機 | 只看該作者
lkc8210 發(fā)表于 2022-1-19 17:57
重申一次:不要用delay!不要用delay!不要用delay!

如果一定要用,可以這樣改

自學中,我理解長按短按就是用delay來判斷按的時長,不用delay怎么按1秒切換流水模式,按一下開關。先謝謝大佬教,不用delay怎么寫呢
回復

使用道具 舉報

5#
ID:57657 發(fā)表于 2022-1-19 21:28 | 只看該作者
菜鳥一個622 發(fā)表于 2022-1-19 18:34
自學中,我理解長按短按就是用delay來判斷按的時長,不用delay怎么按1秒切換流水模式,按一下開關。先謝 ...

用1ms定時器中斷,從來沒像你這么寫過。
回復

使用道具 舉報

6#
ID:213173 發(fā)表于 2022-1-19 21:31 | 只看該作者
改為長按開關,短按切換模式更好。
  1. #include <reg51.h> // <reg51.h>電腦程序?qū)嶒?nbsp; <STC8G.h>

  2. sbit key1=P3^0;

  3. unsigned char dat1[4]={0xf1,0xf2,0xf4,0xf8};
  4. unsigned char dat2[4]={0xfc,0xf9,0xf3,0xf6};
  5. unsigned char dat3[4]={0xfe,0xfd,0xfb,0xf7};

  6. unsigned char MODE;
  7. unsigned int  count;
  8. unsigned char slow;
  9. bit sign;

  10. void delay (unsigned int x);
  11. void mode1(void);
  12. void mode2(void);
  13. void mode3(void);
  14. void keyscan(void);

  15. void main(void)
  16. {
  17.         while(1)
  18.         {
  19.                 keyscan();
  20.                 switch(MODE)
  21.                 {
  22.                         case 0: P0=0xff;break;
  23.                         case 1: mode1();break;
  24.                         case 2: mode2();break;
  25.                         case 3: mode3();break;
  26.                 }
  27.                 delay(1);
  28.         }
  29. }

  30. void delay(unsigned int x)
  31. {
  32.         unsigned int i,j;
  33.         for(i=0;i<x;i++)
  34.         {
  35.                 for(j=0;j<120;j++);//12T
  36. //                for(j=0;j<1200;j++);//1T STC8G
  37.         }
  38. }

  39. void mode1(void)
  40. {
  41.         static unsigned char i;
  42.         static unsigned int j;
  43.         P0=dat1[i];
  44.         if(++j>=500)
  45.         {
  46.                 j=0;
  47.                 i=++i%4;
  48.         }
  49. }
  50. void mode2(void)
  51. {
  52.         static unsigned char i;
  53.         static unsigned int j;
  54.         P0=dat2[i];
  55.         if(++j>=500)
  56.         {
  57.                 j=0;
  58.                 i=++i%4;
  59.         }
  60. }

  61. void mode3(void)
  62. {
  63.         static unsigned char i;
  64.         static unsigned int j;
  65.         P0=dat3[i];
  66.         if(++j>=500)
  67.         {
  68.                 j=0;
  69.                 i=++i%4;
  70.         }
  71. }

  72. void keyscan(void)
  73. {
  74.         if(key1==0)
  75.         {
  76.                 if(count<501)count++;

  77.                 if(count==500)//長按
  78.                 {
  79.                         sign=~sign;
  80.                         if(sign)
  81.                         {
  82.                                 slow=MODE;//保存鍵值
  83.                                 MODE=0;//關閉流水
  84.                         }
  85.                         else MODE=slow;//還原鍵值
  86.                 }
  87.         }   
  88.         else
  89.         {
  90.                 if(count>20 && count<500)//短按
  91.                 {
  92.                         ++MODE;
  93.                         if(MODE>3)
  94.                                 MODE=1;
  95.                 }
  96.                 count=0;
  97.         }   
  98. }
復制代碼
回復

使用道具 舉報

7#
ID:625730 發(fā)表于 2022-1-19 22:51 | 只看該作者
菜鳥一個622 發(fā)表于 2022-1-19 18:34
自學中,我理解長按短按就是用delay來判斷按的時長,不用delay怎么按1秒切換流水模式,按一下開關。先謝 ...

這個按鍵短按/長按的判斷方法可以改為:
  1. if(key1==0)
  2. {
  3.     delay(10);//消除干擾
  4.     if(key1==0)//確認按鍵按下
  5.    {
  6.     while(key1==0)  //等待按鍵釋放
  7.      {
  8.         delay(100);
  9.         count++;//通過count的值來判斷按鍵大概按了多久
  10.        }  
  11.       if((count>10)&&(count<20)
  12.         {
  13.             count=0;//判斷完之后將count值清0,以便下次按鍵掃描計數(shù)。
  14.             mode=1;
  15.          }
  16. }
  17. }
  18. ...
復制代碼

核心就是在等待按鍵釋放的時候,增加一個count計數(shù),通過count大小來判斷按鍵長短。
回復

使用道具 舉報

8#
ID:624769 發(fā)表于 2022-1-20 00:00 | 只看該作者
如果,你的單片機除了按鍵,就是跑馬燈,跑馬燈在按鍵的時候,停下不動也沒有所謂,那么可以用Delay來判斷,反之則不可以。
按單片機的運行速度來講,任何情況下,停下所有的工作,專門等待人為動作的完成,都是不合理的。
回復

使用道具 舉報

9#
ID:1002664 發(fā)表于 2022-1-21 14:26 | 只看該作者
wulin 發(fā)表于 2022-1-19 21:31
改為長按開關,短按切換模式更好。

謝謝,如果開流水速度慢到快,關閉時快到慢怎么修改
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕日韩一区 | 成人午夜激情 | 欧美午夜一区二区三区免费大片 | 国产精品成人在线 | 国产精品成人一区二区三区夜夜夜 | 国产aa | 91av在线免费播放 | 色综合天天天天做夜夜夜夜做 | 亚洲喷水 | 色综合天天综合网国产成人网 | 色偷偷噜噜噜亚洲男人 | 九九热精品视频 | 一区二区三区国产精品 | 久久精品久久综合 | 成人中文字幕在线 | 一级看片免费视频 | 毛片网站在线观看视频 | 免费激情av | 99色综合 | 亚洲精品久久久一区二区三区 | 九九色综合| 午夜视频一区二区三区 | 91 久久| 狠狠色狠狠色综合日日92 | 99精品视频免费在线观看 | 国产精品国产三级国产aⅴ中文 | 国产日韩在线观看一区 | 成人美女免费网站视频 | 日韩免费av一区二区 | 久久com| 久久国产精品-久久精品 | 亚洲人成网站777色婷婷 | 久久国产精品首页 | 琪琪午夜伦伦电影福利片 | 天堂国产 | 日韩午夜网站 | 久久国产秒 | 一二三四在线视频观看社区 | 精品一区二区三区入口 | 国产精品成人在线观看 | 另类二区 |