找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机CPU控制的按键扫描改变LED流水方式的实验源码

[复制链接]
跳转到指定楼层
楼主
ID:318620 发表于 2018-5-24 17:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
按K5按键 P0口LED正向流水
按K6按键 P0口LED反向流水
按K7按键 P0口LED停止流水
按K8按键 P0口LED闪烁

  1. //CPU控制的独立式键盘扫描实验
  2. #include<reg52.h>    //包含51单片机寄存器定义的头文件
  3. sbit S1=P1^4;        //将S1位定义为P1.4引脚
  4. sbit S2=P1^5;        //将S2位定义为P1.5引脚
  5. sbit S3=P1^6;        //将S3位定义为P1.6引脚
  6. sbit S4=P1^7;        //将S4位定义为P1.7引脚
  7. unsigned char keyval;  //储存按键值
  8. /*************************************************
  9. 函数功能:流水灯延时
  10. **************************************************/
  11. void led_delay(void)
  12. {
  13.    unsigned char i,j;
  14.         for(i=0;i<250;i++)
  15.           for(j=0;j<250;j++)
  16.             ;
  17. }

  18. /*************************************************
  19. 函数功能:软件消抖延时
  20. **************************************************/
  21. void delay30ms(void)
  22. {
  23.    unsigned char i,j;
  24.         for(i=0;i<100;i++)
  25.           for(j=0;j<100;j++)
  26.             ;
  27. }
  28. /*************************************************
  29. 函数功能:正向流水点亮LED
  30. **************************************************/
  31. void forward(void)
  32. {
  33.               P0=0xfe;         //第一个灯亮
  34.                          led_delay();
  35.                           P0=0xfd;         //第二个灯亮
  36.                          led_delay();
  37.                          P0=0xfb;          //第三个灯亮
  38.                          led_delay();
  39.                          P0=0xf7;          //第四个灯亮
  40.                          led_delay();
  41.                         P0=0xef;          //第五个灯亮
  42.                    led_delay();
  43.                         P0=0xdf;          //第六个灯亮
  44.                     led_delay();
  45.                         P0=0xbf;          //第七个灯亮
  46.                    led_delay();
  47.                         P0=0x7f;          //第八个灯亮
  48.                    led_delay();  
  49.                         P0=0xff;
  50.                         P0=0xfe;         //第一个灯亮
  51.                          led_delay();
  52. }
  53. /*************************************************
  54. 函数功能:反向流水点亮LED
  55. **************************************************/
  56.   void backward(void)
  57.   {
  58.                P0=0x7f;          //第八个灯亮
  59.                    led_delay();  
  60.                         P0=0xbf;          //第七个灯亮
  61.                    led_delay();
  62.                         P0=0xdf;          //第六个灯亮
  63.                     led_delay();
  64.                         P0=0xef;          //第五个灯亮
  65.                    led_delay();
  66.                          P0=0xf7;          //第四个灯亮
  67.                          led_delay();
  68.                         P0=0xfb;          //第三个灯亮
  69.                          led_delay();
  70.                    P0=0xfd;         //第二个灯亮
  71.                          led_delay();
  72.                         P0=0xfe;         //第一个灯亮
  73.                          led_delay();

  74.   }
  75. /*************************************************
  76. 函数功能:关闭所有LED
  77. **************************************************/
  78. void stop(void)
  79. {
  80. P0=0xff;
  81. }
  82. /*************************************************
  83. 函数功能:闪烁点亮LED
  84. **************************************************/
  85. void flash(void)
  86. {
  87.   P0=0xff;
  88.   led_delay();
  89.   P0=0x00;
  90.   led_delay();
  91. }
  92. /*************************************************
  93. 函数功能:键盘扫描子程序
  94. **************************************************/
  95. void key_scan(void)
  96. {
  97. if((P1&0xf0)!=0xf0)         //第一次检测到有键按下
  98.                      {
  99.                               delay30ms();   //延时20ms再去检测
  100.                                         if(S1==0)      //按键S1被按下
  101.                                          keyval=1;
  102.                                         if(S2==0)      //按键S2被按下
  103.                                          keyval=2;
  104.                                         if(S3==0)      //按键S3被按下
  105.                                          keyval=3;
  106.                                           if(S4==0)      //按键S4被按下
  107.                                          keyval=4;
  108.                                  }                 
  109. }

  110. /*************************************************
  111. 函数功能:主函数
  112. **************************************************/
  113. void main(void)  //主函数
  114. {
  115.           keyval=0;              //按键值初始化为0,什么也不做
  116.    while(1)
  117.            {
  118.                    key_scan();  
  119.                         switch(keyval)
  120.                                   {
  121.                                      case 1:forward();
  122.                                                  break;
  123.                                           case 2:backward();
  124.                                                  break;
  125.                                           case 3:stop();
  126.                                                  break;
  127.                                           case 4: flash();
  128.                                                  break;
  129.                                          }
  130.                         
  131.          }
  132. }
复制代码

全部资料51hei下载地址:
CPU控制的按键扫描实验.rar (12.44 KB, 下载次数: 16)





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

使用道具 举报

沙发
ID:337484 发表于 2018-5-24 18:13 | 只看该作者
谢谢分享。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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