第二周作业彩灯控制系统

/*头文件区域*/
#include <REGX52.H>
#include <intrins.h>

/*变量声明区域*/
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;//按键控制变量
unsigned char Seg_Dula[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6f,0x00};//数码管段码储存函数数组
unsigned char Seg_Wela[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//数码管位码储存组
unsigned char Seg_Pos = 0;//定时器扫描变量
unsigned char Seg_Buf[] = {10,10,10,10,10,10};
unsigned char Led_Mode = 0;//彩灯模式 
unsigned char ucLed = 0xfe;//Led状态
unsigned char ucLed_Double[4]= {0x7e,0xbd,0xdb,0xe7};//
unsigned char ucLed_Index;
bit System_Flag = 1;//系统标志位

/*延时函数*/
void Delay(unsigned int xms)	//@12.000MHz
{
	unsigned char data i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);

	}
}

/*按键读取函数*/
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 Seg_Disp(unsigned char Wela,Dula)
{
	/*消隐*/
	P0 = 0x00;
	P2_6 = 1;
	P2_6 = 0;
	/*位选*/
	P0 = Seg_Wela[Wela];
	P2_7 = 1;
	P2_7 = 0;
	/*段选*/
	P0 = Seg_Dula[Dula];
	P2_6 = 1;
	P2_6 = 0;

}

/*定时器初始化函数*/
void Timer0_Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0 = 1;                //打开闹钟模式 
	EA = 1;                 //开始计时
}

/*定时器0中断服务函数*/
void Timer0Sever() interrupt 1
{
	/*闹钟响之后,闹钟赋初始值*/
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
	if(++Seg_Pos == 6)Seg_Pos = 0;
	Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos]);
}


/*Main*/
void main()
{
	Timer0_Init();
	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:
				if(++Led_Mode == 4)Led_Mode = 0;
			break;
			case 4:
				if(--Led_Mode == 255)Led_Mode = 3;
			break;
		}
		if(System_Flag == 1)
		{
			switch(Led_Mode)
			{
				case 0:
					P1 = ucLed;
					Delay(500);
					ucLed = _cror_(ucLed,1);
				break;
				case 1:
					P1 = ucLed;
					Delay(500);
					ucLed = _crol_(ucLed,1);
				break;
				case 2:
					P1 = ucLed_Double[ucLed_Index];
					Delay(500);
					if(++ucLed_Index == 4)ucLed_Index = 0;
				break;
				case 3:
					P1 = ucLed_Double[ucLed_Index];
					Delay(500);
					if(--ucLed_Index == 255)ucLed_Index = 3;
				break;
			
			}
			Seg_Buf[0] = Led_Mode + 1;
		}
	}
}