彩灯控制系统主程序

#include <REGX52.H>
#include <seg.h>
#include <key.h>
#include <intrins.h>

/*变量*/
unsigned char key_slow_down;	//按键等待变量
unsigned char key_val,key_old,key_down;	//按键消抖变量
unsigned int seg_slow_down;		//数码管等待变量
unsigned char seg_buf[]={10,10,10,10,10,10};
unsigned char seg_pos;//数码管扫描变量
unsigned char system_mode = 1;
unsigned char ucled_1 = 0xfe;
unsigned char ucled_2 = 0x7f;
unsigned int led_slow_down;
unsigned char flag = 0;
unsigned char ucled_3[]={0x7e,0xbd,0xdb,0xe7};
unsigned char ucled_4[]={0xe7,0xdb,0xbd,0x7e};
unsigned char ucled_3_index;
unsigned char ucled_4_index;

/*按键函数*/
void key_proc()
{
	if(key_slow_down) return; 
		key_slow_down = 1;//键盘减速程序

	
			key_val = key_read();  
			key_down = key_val & (key_old ^ key_val);  
			key_old = key_val; 
	
	
	switch(key_down)
{
	case 1:
			flag = 0;
		break;
	case 2:
			flag = 1;
		break;
	case 3:
			if(++system_mode == 5) system_mode = 1;
		break;
	case 4:
				if(--system_mode == 0) system_mode = 4;
		break;
}

}

/*数码管函数*/
void seg_proc()
{
	if(seg_slow_down) return;
	seg_slow_down = 1;

}

/*其他函数*/
void led_proc()
{
	if(led_slow_down) return;
	led_slow_down = 1;
	if(flag == 0)
	{
		if(system_mode == 1) 
			{
				P1 = ucled_1;
				ucled_1 = _crol_(ucled_1,1);
				ucled_4_index = 0;
			}
			
		if(system_mode == 2) 
			{
				P1 = ucled_2;
				ucled_2 = _cror_(ucled_2,1);
				ucled_1 = 0xfe;
			}
		if(system_mode == 3) 
		{
			P1 = ucled_3[ucled_3_index];
			if(++ucled_3_index == 4) ucled_3_index = 0;
			ucled_2 = 0x7f;
		}
		if(system_mode == 4) 
		{
			P1 = ucled_4[ucled_4_index];
			if(++ucled_4_index == 4) ucled_4_index = 0;
			ucled_3_index = 0;
		}

	}
}

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


/*定时器0中断服务函数*/
void timer0server() interrupt 1
{
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	
	if(++key_slow_down == 10) key_slow_down = 0;
	if(++seg_slow_down == 500) seg_slow_down = 0;
	
	if(++seg_pos == 6) seg_pos = 0;
		seg_disp(seg_pos,seg_buf[seg_pos]);
	
	if(++led_slow_down == 500) led_slow_down = 0;
	
}

void main()
{
	Timer0Init();
	while(1)
		{
			key_proc();
			seg_proc();
			led_proc();
		}

}