找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 2125|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)6按鍵控制16位心形流水燈Proteus仿真程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
6個按鍵,每一個按鍵代表一個花型,附帶Proteus仿真
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. /*
  2.    名稱:LED流水燈實(shí)驗(yàn)
  3.          LED接口:LED0-7--------P2
  4.                   LED8-16-------P3
  5.                                                 KEY1--------P1.0
  6.                                                 KEY2--------P1.1
  7.                                                 KEY3--------P1.2
  8.                                                 KEY4--------P1.3
  9.                                                 KEY5--------P1.4
  10.          用按鍵掃描和查表法實(shí)現(xiàn)花式流水燈,一次只能閉合一個按鍵
  11. */

  12. # include <reg52.h>
  13. # define uchar unsigned char
  14. # define uint unsigned int

  15. uchar i,flag1,flag2,flag3,flag4,flag5,flag6;
  16. /******************* 定義按鍵 *****************************/
  17. sbit k1=P1^0;
  18. sbit k2=P1^1;
  19. sbit k3=P1^2;
  20. sbit k4=P1^3;
  21. sbit k5=P1^4;
  22. sbit k6=P1^7;
  23. /************************ 流水燈花樣設(shè)計(jì) ********************/

  24. /***********外圈依次亮********/
  25. uchar table1_1[]={0xef,0xfe,0xfd,0xfb,0xf7,0x7f};
  26. uchar table1_2[]={0xf7,0x7f,0xbf,0xdf,0xef,0xfe};

  27. /*****內(nèi)圈依次點(diǎn)亮 */
  28. uchar table2_1[]={0xdf,0xbf};
  29. uchar table2_2[]={0xfb,0xfd};


  30. /******* 間隔一個循環(huán)點(diǎn)亮 ********/
  31. uchar table3_1[]={0xfe,0xfb,0xef,0xbf};
  32. uchar table3_2[]={0xfd,0xf7,0xdf,0x7f};

  33. /*********第一行到第四行閃爍*************/
  34. uchar table4_1[]={0xf0,0xff,0xf0,0xff,0xf0,0xff};
  35. uchar table4_2[]={0x0f,0xff,0x0f,0xff};
  36. uchar table4_3[]={0xf0,0xff,0xf0,0xff,0xf0,0xff,0xf0,0xff};
  37. uchar table4_4[]={0x0f,0xff};

  38. /*********16位流水燈**********/
  39. uchar table5_1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

  40. /**********全亮全滅交替*******/
  41. uchar table6_1[]={0x00};
  42. uchar table6_2[]={0xff};
  43. /********************* 延時(shí)程序 ****************************/
  44. void delay(uint x)
  45. {
  46. uint i;
  47. while(x--)
  48. for(i=50;i>0;i--);
  49. }

  50. //delay(1000)為1s

  51. /****************** 判斷按鍵 ***********************/
  52. void keyscan()
  53. { if(k1==0) //K1按下
  54. {delay(10);
  55. if(k1==0)
  56. {
  57. flag6=0;
  58. flag2=0;
  59. flag3=0;
  60. flag4=0;
  61. flag1=1;
  62. flag5=0;       
  63. }
  64. }
  65. if(k2==0){ //K2按下
  66. delay(10);
  67. if(k2==0){
  68. flag3=0;
  69. flag1=0;
  70. flag4=0;
  71. flag5=0;
  72. flag6=0;       
  73. flag2=1;
  74. }
  75. }
  76. if(k3==0){ //K3按下
  77. delay(10);
  78. if(k3==0){
  79. flag1=0;
  80. flag2=0;
  81. flag4=0;
  82. flag5=0;
  83. flag6=0;       
  84. flag3=1;
  85. }
  86. }
  87. if(k4==0){ //K4按下
  88. delay(10);
  89. if(k4==0){
  90. flag5=0;
  91. flag6=0;
  92. flag1=0;       
  93. flag2=0;
  94. flag3=0;
  95. flag4=1;
  96. }
  97. }
  98. if(k5==0){ //K5按下
  99. delay(10);
  100. if(k5==0){
  101. flag1=0;
  102. flag2=0;
  103. flag3=0;
  104. flag4=0;
  105. flag6=0;
  106. flag5=1;        
  107. }
  108. }
  109. if(k6==0){ //K6按下
  110. delay(10);
  111. if(k6==0){
  112. flag1=0;
  113. flag2=0;
  114. flag3=0;
  115. flag4=0;
  116. flag5=0;
  117. flag6=1;       
  118. }
  119. }
  120. }
  121. /************** 主程序 ************************/
  122. void main()
  123. {
  124.        
  125.         P3=0xff;
  126. P2=0xff;       
  127. while(1)

  128. {keyscan();
  129.         //按下按鍵1
  130. if(flag1==1)
  131. {
  132.                  P3=0xff;
  133. for(i=0;i<6;i++)
  134.         {
  135.                 P2=table1_1[i];
  136.                 delay(1000);
  137.                 keyscan();
  138.    }
  139.         P2=0xff;
  140.        
  141. for(i=0;i<6;i++)
  142.         {
  143.                 P3=table1_2[i];;
  144.                 delay(1000);
  145.                 keyscan();
  146.    }

  147.         P3=0xff;

  148. }
  149. //按下按鍵2
  150. if(flag2==1)
  151. {
  152.     P3=0xff;         
  153. for(i=0;i<2;i++)
  154.         {
  155.          
  156.         P2=table2_1[i];        
  157.         delay(2000);
  158.         keyscan();
  159.   }
  160.         P2=0xff;       
  161. for(i=0;i<2;i++)
  162.         {  
  163.         P3=table2_2[i];        
  164.         delay(2000);
  165.         keyscan();
  166.   }

  167. }

  168. //*****當(dāng)按下第三個按鍵****
  169. if(flag3==1)
  170. { P3=0xff;
  171.   for(i=0;i<4;i++)
  172. {
  173.         P2=table3_1[i];
  174.         delay(1000);
  175.         keyscan();
  176.         } P2=0xff;
  177.          for(i=0;i<4;i++)
  178.          {
  179.                  
  180.                 P3=table3_1[i];       
  181.                 delay(1000);
  182.                 keyscan();
  183.    }
  184.          P2=0xff;
  185.          P3=0xff;
  186.          for(i=0;i<4;i++)
  187.          {
  188.                  P2=table3_2[i];
  189.         delay(1000);
  190.         keyscan();
  191.          }
  192.          P2=0xff;
  193.          for(i=0;i<4;i++)
  194.          {
  195.                  P3=table3_2[i];
  196.         delay(1000);
  197.         keyscan();
  198.          }
  199. }
  200. //按下第四個按鍵
  201. if(flag4==1)
  202. {
  203.          P3=0xff;
  204.          P2=0xff;
  205. for(i=0;i<6;i++)
  206.          {
  207.                 P2=table4_1[i];
  208.                 delay(1000);
  209.                 keyscan();
  210.     }
  211.          for(i=0;i<4;i++)
  212.          {
  213.                 P2=table4_2[i];
  214.                 delay(1000);
  215.                 keyscan();
  216.     }
  217.                   for(i=0;i<10;i++)
  218.          {
  219.         P3=table4_3[i];
  220.                 delay(1000);
  221.                 keyscan();
  222.     }
  223.                        
  224.         P3=table4_4[0];
  225.        
  226.     }
  227. //按下第五個按鍵
  228. if(flag5==1)
  229.    {
  230.                         P3=0xff;
  231.                  for(i=0;i<8;i++)
  232.                  {
  233.                          P2=table5_1[i];
  234.                          delay(1000);
  235.                          keyscan();
  236.                  }
  237.                  P2=0xff;
  238.                  for(i=0;i<8;i++)
  239.                  {
  240.                          P3=table5_1[i];
  241.                          delay(1000);
  242.                          keyscan();
  243.                  }
  244.                  P3=0xff;
  245.    }
  246. //按下第六個按鍵
  247. if(flag6==1)
  248.         {
  249.                 P2=0xff;
  250.                 P3=0xff;
  251.                 for(i=0;i<1;i++)
  252.                 {
  253.                         P2=table6_1[i];
  254.                         P3=table6_1[i];
  255.                         delay(1000);
  256.                         keyscan();
  257.                 }
  258.                 for(i=0;i<1;i++)
  259.                 {
  260.                         P2=table6_2[i];
  261.                         P3=table6_2[i];
  262.                         delay(1000);
  263.                         keyscan();
  264.                 }
  265.         }
  266.   }
  267. }
復(fù)制代碼

Keil代碼與Proteus仿真下載:
4按鍵控制16LED流水燈.zip (127.5 KB, 下載次數(shù): 45)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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