找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1984|回復: 0
打印 上一主題 下一主題
收起左側(cè)

單片機四模式運行流水燈源程序

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:707451 發(fā)表于 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;                            //調(diào)速變量
  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)                                   //延時函數(shù)
  13. {
  14.         uchar i;
  15.         while (x--)
  16.         for(i=0;i<120;i++);
  17. }
  18. uchar GetKey()                                                //按鍵函數(shù)
  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;                                //其他狀態(tài),k=0
  30.         }
  31.         while(P2!=0xFF);                                //按鍵釋放
  32.         return K;                                                //返回按鍵信息
  33. }
  34. void Led_Demo(uint Led16)                        //LED狀態(tài)右移
  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,最右側(cè)的燈亮,然后向左移
  46.                 case 1: Led_Demo(0x8000 >> mb_Count);break;                                   //模式1,最左側(cè)的燈亮,然后向右移
  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()                                           //主函數(shù)
  77. {
  78.         uchar Key;
  79.         P0=P1=P2=P3=0xFF;                   //IO口都復位
  80.         ModeNo=0;                                   //變量清零
  81.         Idx=4;                                           //速度默認開機4
  82.         Speed=sTable[Idx];                    //4檔速度對應的延時數(shù)
  83.         P3=DSY_CODE[ModeNo];           //P3口賦值初始狀態(tài)
  84.         IE=0x82;                                   //定義寄存器
  85.         TMOD=0x00;                                   //定時器工作狀態(tài)
  86.         TR0=1;                                           //開啟定時器0
  87.         while(1)                                   //進入while循環(huán)
  88.         {
  89.                 Key=GetKey();                    //讀取按鍵狀態(tài)
  90.                 if(Key!=0)                           //如果有按鍵按下
  91.                 KeyProcess(Key);           //根據(jù)按鍵狀態(tài)切換速度
  92.         }
  93. }
復制代碼


改過的四模式運行流水燈.zip

32.99 KB, 下載次數(shù): 10, 下載積分: 黑幣 -5

四模式流水燈

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表