欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 簡單的單片機按鍵控制流水燈 [打印本頁]

作者: Danny1710    時間: 2018-4-24 22:27
標題: 簡單的單片機按鍵控制流水燈
按鍵控制流水燈仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

功能:
1. 用8盞LED小燈,實現至少4種彩燈燈光效果(不含全部點亮,全部熄滅);
2. 可以用輸入按鈕在幾種燈光效果間切換;
3. 可以通過按鈕暫停彩燈效果,使小燈全亮,再次按下相同按鈕后繼續之前的效果;
4. 增加自動在幾種效果間切換的功能,并設置一個按鈕可以在自動模式和手動模式間切換;
5. 使用定時中斷延時
(由于仿真圖略大,不能上傳)
源代碼:
  1. #include<reg51.h>   
  2. #include<intrins.h>
  3. #define  GPIO_LED P0 //led使用P0口
  4. #define  GPIO_KEY P1 //獨立鍵盤用P1口
  5. sbitK1=P1^0;
  6. sbitK2=P1^1;
  7. sbitK3=P1^2;
  8. sbitK4=P1^3;
  9. sbitK5=P1^4;
  10. char  KeyNum;
  11. unsignedchar  state;
  12. unsignedchar  change_state;
  13. voidDelay10ms(unsigned int c);   //延時10ms
  14. voidLED1();
  15. voidLED2();
  16. voidLED3();
  17. voidLED4();
  18. voidauto_LED();
  19. voidPause();
  20. unsignedchar Key_Scan();            //掃描鍵盤//
  21. voidmain(void)
  22. {  
  23.    IT0=1;
  24.    IT1=1;
  25.    EX1=1;
  26.    EX0=1;
  27.    EA=1;
  28.     auto_LED();
  29.   while(1)
  30.   {
  31.       if(1 == state)
  32.      {
  33.         LED1();
  34.         change_state = 0;
  35.      }
  36.      else if(2 == state)
  37.      {
  38.         LED2();
  39.         change_state = 0;
  40.      }
  41.      else if(3 == state)
  42.      {
  43.         LED3();
  44.         change_state = 0;
  45.      }
  46.      else if(4 == state)
  47.      {
  48.         LED4();
  49.         change_state = 0;
  50.      }
  51. }  
  52. }         
  53. voidChange() interrupt 0
  54. {     
  55.    KeyNum=Key_Scan();
  56.    switch(KeyNum)
  57.    {
  58.         case(0xFe) :    //返回按鍵K1的數據
  59.         state=1;
  60.         change_state=1;
  61.         break;
  62.         case(0xFD) :    //返回按鍵K2的數據
  63.         state=2;
  64.         change_state=2;
  65.         break;
  66.         case(0xFB) :    //返回按鍵K3的數據
  67.         state=3;
  68.         change_state=3;
  69.         break;
  70.         case(0xF7) :    //返回按鍵K4的數據
  71.         state=4;
  72.         change_state=4;
  73.         break;
  74.         default:
  75.         break;
  76.     }
  77. }
  78. voidPause() interrupt 1
  79. {
  80.      auto_LED();
  81. }
  82. voidDelay10ms(unsigned int c)   //誤差 0us
  83. {
  84.   unsigned char a, b;
  85.    for (;c>0;c--)
  86.    {for (b=30;b>0;b--)
  87.      {
  88.         for (a=100;a>0;a--);         
  89.    }      
  90.      
  91. }
  92. unsignedchar Key_Scan()
  93. {
  94.    unsigned char keyValue = 0 , i; //保存鍵值
  95. //--檢測按鍵1--//
  96.    if (GPIO_KEY != 0xFF)    /檢測按鍵K1是否按下
  97.    {
  98.      Delay10ms(1); //消除抖動
  99.      if (GPIO_KEY != 0xFF) //再次檢測按鍵
  100.      {
  101.         keyValue = GPIO_KEY;
  102.         i = 0;
  103.        while ((i<50) && (GPIO_KEY !=0xFF))  //檢測按鍵是否松開
  104.         {
  105.            Delay10ms(1);
  106.            i++;
  107.         }
  108.      }
  109.    }
  110.    return keyValue;   //將讀取到鍵值的值返回
  111. }
  112. voidLED1()
  113. {
  114.     unsigned char i;
  115.    GPIO_LED = 0x01;
  116.    for (i=0; i<16; i++)
  117.    {
  118.      GPIO_LED = _crol_(GPIO_LED, 1);
  119.       Delay10ms(100);
  120.    if(change_state==2)
  121.         break;
  122.    if(change_state==3)   
  123.         break;
  124.    if(change_state==4)      
  125.         break;
  126.    if(change_state==5)      
  127.         break;
  128.    }
  129. }
  130. voidLED2()
  131. {
  132. unsignedchar i;
  133.    GPIO_LED = 0x80;
  134.    for (i=0; i<16; i++)
  135.    {
  136.      GPIO_LED = _cror_(GPIO_LED, 1);
  137.      Delay10ms(100);
  138.    if(change_state==1)
  139.         break;
  140.    if(change_state==3)   
  141.         break;
  142.    if(change_state==4)      
  143.         break;
  144.    if(change_state==5)      
  145.         break;
  146.    }
  147. }
  148. voidLED3()
  149. {
  150. unsigned char i;
  151.    GPIO_LED = 0x81;
  152.    for (i=0; i<8; i++)
  153.    {
  154.      GPIO_LED = _cror_(GPIO_LED, 4);
  155.      Delay10ms(100);
  156.    if(change_state==1)
  157.         break;
  158.    if(change_state==2)   
  159.         break;
  160.    if(change_state==4)      
  161.         break;
  162.    if(change_state==5)      
  163.         break;
  164.    }
  165. }
  166. voidLED4()
  167. {
  168.    unsigned char i;
  169.    GPIO_LED = 0x18;
  170.    for (i=0; i<8; i++)
  171.    {
  172.      GPIO_LED = _cror_(GPIO_LED, 3);
  173.      Delay10ms(100);
  174.    if(change_state==1)
  175.         break;
  176.    if(change_state==2)   
  177.         break;
  178.    if(change_state==3)      
  179.         break;
  180.    if(change_state==5)      
  181.         break;
  182.    }
  183. }
  184. void auto_LED()  
  185. {  
  186.     LED1();
  187.    Delay10ms(100);
  188.    LED2();
  189.    Delay10ms(100);
  190.    LED3();
  191.    Delay10ms(100);
  192.    LED4();
  193.    Delay10ms(100);  
  194. }
復制代碼






作者: 發了個哥    時間: 2018-11-13 13:29
請問附件在哪啊?
作者: bhjyqjs    時間: 2018-11-14 08:58
程序寫的很好!
個人認為,類似
if(1 == state)
     {
        LED1();
        change_state = 0;
     }
     else if(2 == state)
改成switch語句,更加一目了然。
作者: 產檢簿    時間: 2018-12-2 21:22
請問附件在哪啊?
作者: 玖吟璽    時間: 2019-4-22 21:12
為什么沒有晶振
作者: MisterM    時間: 2019-10-14 21:58
樓主你這個是自動的 跟按鍵沒關系啊auto_LED就直接運行了啊
作者: flynn13    時間: 2020-6-16 20:52
87行的大括號少了




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1