第二周 Led彩灯控制系统

/*头文件区域*/
#include <REGX52.H>
#include "intrins.h"
​
/*变量声明区域*/
unsigned char Key_Down,Key_Up,Key_Val,Key_OLd;//按键扫描专用变量
unsigned char Led_Mode;//Led运行模式专用变量
unsigned char ucLed = 0xfe;//Led存储变量
unsigned char Led_Dat[4] = {0x7e,0xbd,0xdb,0xe7};//Led显示存放数组
unsigned char Led_Dat_Index;//Led显示存放数组索引
bit System_Flag = 1;//系统使能标志位 0-关闭 1-启动
​
/*按键读取函数*/
unsigned char Key_Read()
{
  unsigned char temp = 0;
  if(P3_4 == 0) temp = 1;
  if(P3_5 == 0) temp = 2;
  if(P3_6 == 0) temp = 3;
  if(P3_7 == 0) temp = 4;
    
  return temp;
}
​
/*延时函数*/
void Delay(unsigned char xms)   //@12.000MHz
 {
     unsigned char data i, j;
     while(xms--)
     {
         i = 2;
         j = 239;
         do
         {
             while (--j);
         } while (--i);
 
     }
 }
​
/*Main*/
void main()
{
    while(1)
    {
        Key_Val =  Key_Read();//读取键码值
        Key_Down = Key_Val & (Key_Val ^ Key_OLd);//检测下降沿
        Key_Up = ~Key_Val & (Key_Val ^ Key_OLd);//检测上升沿
        Key_OLd = Key_Val;//辅助扫描
        
        switch(Key_Down)
        {
            case 1://启动按键
                System_Flag = 1;
            break;
            case 2://暂停按键
                System_Flag = 0;
            break;
            case 3://运行模式+1
                if(++Led_Mode == 4) Led_Mode = 0;
            break;
            case 4://运行模式-1
                if(--Led_Mode == 255)   Led_Mode = 3;
            break;
        }
        
        switch(Led_Mode)
        {
            case 0://模式1
                if(System_Flag == 1)
                {
                    ucLed = _crol_(ucLed,1);
                    P1 = ucLed;
                    Delay(500);
                }
            break;
            case 1://模式2
                if(System_Flag == 1)
                {
                    ucLed = _cror_(ucLed,1);
                    P1 = ucLed;
                    Delay(500);
                }
            break;
            case 2://模式3
                if(System_Flag == 1)
                {
                    P1 = Led_Dat[Led_Dat_Index];
                    Led_Dat_Index++;
                    Delay(500);
                    if(Led_Dat_Index == 4)  Led_Dat_Index = 0;
                }
            break;
            case 3://模式4
                if(System_Flag == 1)
                {
                    P1 = Led_Dat[Led_Dat_Index];
                    Led_Dat_Index--;
                    Delay(500);
                    if(Led_Dat_Index == 255)    Led_Dat_Index = 3;
                }
            break;
        }
    }
}
  • 用 if(System_Flag = 1) 错当条件判断;

  • 模式34未用Delay()延时;