找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机四模式运行流水灯源程序

[复制链接]
跳转到指定楼层
楼主
ID:707451 发表于 2020-3-13 09:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg51.h>                                    //包含头文件
  2. #define uchar unsigned char
  3. #define uint unsigned int                    //宏定义
  4. uchar ModeNo;                        //灯闪烁的模式
  5. uint Speed;                           //闪烁的速度
  6. uchar tCount=0;             //进入定时器控制速度
  7. uchar Idx;                            //调速变量
  8. uchar mb_Count=0;
  9. bit Dirtect=1;
  10. uchar code DSY_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
  11. uint code sTable[]={0,1,3,5,7,9,15,30,50,100,200,230,280,300,350};

  12. void Delay(uint x)                                   //延时函数
  13. {
  14.         uchar i;
  15.         while (x--)
  16.         for(i=0;i<120;i++);
  17. }
  18. uchar GetKey()                                                //按键函数
  19. {
  20.         uchar K;
  21.         if(P2==0xFF)                                        //没有按键按下
  22.         return 0;                                                //返回0
  23.         Delay(10);                                                //延时
  24.         switch(P2)                                                //有按键按下
  25.         {
  26.                 case 0xFE: K=1; break;                //k1按下
  27.                 case 0xFD: K=2; break;
  28.                 case 0xFB: K=3; break;
  29.                 default: K=0;                                //其他状态,k=0
  30.         }
  31.         while(P2!=0xFF);                                //按键释放
  32.         return K;                                                //返回按键信息
  33. }
  34. void Led_Demo(uint Led16)                        //LED状态右移
  35. {
  36.         P1=(uchar)(Led16 & 0x00FF);
  37.         P0=(uchar)(Led16 >>8);
  38. }
  39. void T0_TNT() interrupt 1                                 //定时器工作
  40. {
  41.         if (++tCount < Speed) return;                  //对应不同的速度
  42.         tCount=0;
  43.         switch (ModeNo)
  44.         {
  45.                 case 0: Led_Demo(0x0001 << mb_Count);break;                                //模式0,最右侧的灯亮,然后向左移
  46.                 case 1: Led_Demo(0x8000 >> mb_Count);break;                                   //模式1,最左侧的灯亮,然后向右移
  47.                 case 2: if(Dirtect)                        Led_Demo(0x000F << mb_Count);   //模式2,四个灭灯左右移
  48.                                 else                                Led_Demo(0xF000 >> mb_Count);        
  49.                                 if(mb_Count==15)        Dirtect =!Dirtect;
  50.                 break;
  51.                 case 3: if(Dirtect)                        Led_Demo(~(0x000F << mb_Count)); //模式3,四个亮灯左右移  
  52.                                 else                                Led_Demo(~(0xF000 >> mb_Count));
  53.                                 if(mb_Count==15)        Dirtect =!Dirtect;
  54.                                 break;   
  55.                                 if(mb_Count==15)        Dirtect =!Dirtect;
  56.                                 break;
  57.         }
  58.         mb_Count=(mb_Count+1)%16;
  59. }
  60. void KeyProcess(uchar Key)                          //切换速度
  61. {
  62.         switch(Key)                                                  //按键按下
  63.         {
  64.                 case 1: Dirtect=1;                          //切换模式
  65.                                 mb_Count=0;
  66.                                 ModeNo=(ModeNo+1)%8;
  67.                                 P3=DSY_CODE[ModeNo];
  68.                                 break;
  69.                 case 2: if(Idx>1)                           //速度减
  70.                                 Speed=sTable[--Idx];
  71.                                 break;
  72.                 case 3: if(Idx<15)
  73.                                 Speed=sTable[++Idx];   //速度加
  74.         }
  75. }
  76. void main()                                           //主函数
  77. {
  78.         uchar Key;
  79.         P0=P1=P2=P3=0xFF;                   //IO口都复位
  80.         ModeNo=0;                                   //变量清零
  81.         Idx=4;                                           //速度默认开机4
  82.         Speed=sTable[Idx];                    //4档速度对应的延时数
  83.         P3=DSY_CODE[ModeNo];           //P3口赋值初始状态
  84.         IE=0x82;                                   //定义寄存器
  85.         TMOD=0x00;                                   //定时器工作状态
  86.         TR0=1;                                           //开启定时器0
  87.         while(1)                                   //进入while循环
  88.         {
  89.                 Key=GetKey();                    //读取按键状态
  90.                 if(Key!=0)                           //如果有按键按下
  91.                 KeyProcess(Key);           //根据按键状态切换速度
  92.         }
  93. }
复制代码


改过的四模式运行流水灯.zip

32.99 KB, 下载次数: 10, 下载积分: 黑币 -5

四模式流水灯

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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