找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1300|回复: 0
打印 上一主题 下一主题
收起左侧

单片机6按键控制16位心形流水灯Proteus仿真程序

[复制链接]
跳转到指定楼层
楼主
6个按键,每一个按键代表一个花型,附带Proteus仿真
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. /*
  2.    名称:LED流水灯实验
  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.          用按键扫描和查表法实现花式流水灯,一次只能闭合一个按键
  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. /************************ 流水灯花样设计 ********************/

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

  27. /*****内圈依次点亮 */
  28. uchar table2_1[]={0xdf,0xbf};
  29. uchar table2_2[]={0xfb,0xfd};


  30. /******* 间隔一个循环点亮 ********/
  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. /********************* 延时程序 ****************************/
  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. //*****当按下第三个按键****
  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. }
复制代码

Keil代码与Proteus仿真下载:
4按键控制16LED流水灯.zip (127.5 KB, 下载次数: 41)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表