彩灯控制(基于定时器)

彩灯控制

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

/*变量声明区域*/
unsigned char Key_val,Key_down,Key_old;
unsigned char LED_mode=1;//LED运行模式
unsigned int LED500ms;//定时器固定流转时间
unsigned char Led_Data = 0x01;//LED初始值
unsigned char system_flag=1;  //  0-停止  1-启动
unsigned char LED_turn[4]={0xe7, 0xdb, 0xbd, 0x7e};//模式3,4储存数据
unsigned char LED_count;//模式3,4索引

/*按键*/
void Key_proc()
{
			Key_val=Key_read();
			Key_down=Key_val&(Key_val^Key_old);
			Key_old=Key_val;
			
			switch(Key_down) //按键扫描
			{
				case 1:
					LED_mode=1;
				break;
				
				case 2:
					system_flag=0;
				break;
				
				case 3:
					LED_mode++;
					if(LED_mode==5)
						LED_mode=1;
				break;
					
				case 4:
					LED_mode--;
					if(LED_mode==0)
						LED_mode=1;
				break;	
			}
}

/*数码管信息显示*/
/*
void Seg_proc()
{
	
}
*/

/*其他函数*/

/*定时器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 Time0_server() interrupt 1
{
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值

		if(system_flag==1)
		{
					if(++LED500ms==500)
					{
						LED500ms=0;
						
								switch (LED_mode)
								{
									case 1:
										P1=Led_Data;
										Led_Data = _crol_(Led_Data,1);
									break;
									
									case 2:
										P1=Led_Data;
										Led_Data = _cror_(Led_Data,1);
									break;
										
									case 3:
										P1=LED_turn[LED_count];	
										LED_count++;
										if(LED_count==4)
										{
											LED_count=0;
										}
									break;
									
									case 4:
										P1=LED_turn[LED_count];	
										if(LED_count==0)
										{
											LED_count=4;
										}
										LED_count--;
									break;	
								}
					}
							
		}	
}

/*主函数区域*/
void main()
{
	Timer0_Init();
	while(1)
	{
			Key_proc();
	}
}