单片机课程 STC8H1K28综合流转灯

实现基础流转灯和手动流转灯两种模式的切换,按键KEY1在基础模式下用于改变间隔时间,在手动模式下用于控制颜色变化


#include<STC8h.h>
#include<intrins.h>
#define KEY1 P32
#define KEY2 P33
 

bit Mod_flag=0;       //模式标志,1为基础流转灯模式,0为手动流转灯模式
bit Key_flag=0;       //按键1标志位
unsigned char i=0;
unsigned char Time_bit=0;     //延时计数标志位
unsigned char Key_Num=0;      //记录按键按下次数
 
void Delay500ms(void)	//@12.000MHz
{
	unsigned char data i, j, k;

	_nop_();
	i = 31;
	j = 113;
	k = 29;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

 
void setup()//定义数据和函数
{
	IT0=1;         
	IT1=1;        
	EX0=1;         
	EX1=1;         
	EA=1;         
	P0M0 |=  0x07;
	P0M1 &= ~0x07;//推挽模式
	P3M0 = 0x00;
	P3M1 = 0x00;//双向
	Mod_flag=1;    //初始化模式
	
}
 
void PressKey2(void) interrupt 2
	
{
	Mod_flag = !Mod_flag;//模式转换

	
	Time_bit = 0;
	Key_Num = 0;//初始化标志位
	while(!KEY2);//抬起按键
	
}

void PressKey1(void) interrupt 0
{
	if(Mod_flag == 1)
	{
		Time_bit = 0;
		Key_Num++;
		if(Key_Num > 4)
		{
			Key_Num = 0;
		}
	}
	if(Mod_flag == 0)
	{
		Key_flag = 1;
		while(!KEY1);
		
	}
	while(!KEY1);
}
  
void turn()     //基础流转灯模式
{
	if(Mod_flag == 1)
	{
		P0 = ~(1<<i);
		i++;
		if(i > 2)
		{
			i = 0;
		}
	}
}
 
void time_change()  //基础流转灯模式下的延时改变
{
	
	if(Mod_flag == 1)
	{
		Delay500ms();
		if(Time_bit == Key_Num)
		{
			turn();
			Time_bit = 0;
		}
		else
		{
			Time_bit++;
		}
		
	}
	
}
 
void hand_turn_mod0()   //手动流转灯模式
{
	if(Mod_flag == 0)
	{
			
			if(Key_flag)
			{
				Delay500ms();
				Key_flag = 0;
				P0 = ~(1<<i);
				i++;
				if(i>2)
				{
					i = 0;
				}
			}	
	 }
}
			
void main()//主函数
{
	
	setup();
	while(1)
	{
		
		time_change();
		hand_turn_mod0();
		
	}
}	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值