变速RGB流转灯

变速RGB流转灯

任务:

        流转灯初始间隔为200mS,通过按键KEY2改变流转灯的间隔,每次按键间隔时间增加200mS;当间隔时间增加到1S后再次按键间隔时间恢复为初始值200mS

主要编程思路:

初始化设置:

在初始化函数中进行硬件设置。将外部中断1(KEY2)的触发方式设置为上升沿触发。启用外部中断。全局中断使能。

中断处理函数:

使用外部中断1(KEY2)的中断处理函数来实现长延时的控制。每次按下KEY2按钮,将一个循环计数变量 time_bit 清零,同时增加一个循环上限计数变量 time_num 的值。注意,当 time_num 超过一定值,需要将其重置为0,以防止溢出。

延时函数:

编写一个延时函数,可以是一个循环,每次循环都包含200ms的延时。

在每次循环中,检查 time_bit 是否达到了 time_num 的值。如果还没有达到,继续循环等待。一旦 time_bit 达到了 time_num,表示延时完成,可以退出循环。

主函数:

在主函数的无限循环中,调用上述延时函数,这样就可以执行长延时后的操作。主函数中的操作将在长延时完成后执行。通过按下KEY2按钮,可以控制长延时的次数,然后在主函数中执行相应的操作。

//STC8H1K28

#include<stc8h.h>
#include<intrins.h>
#define key1 P32
#define key2 P33

typedef unsigned char uchar;
bit key_flag=0;
uchar led_bit=0;
uchar time_bit=0;
uchar time_num=0;


void Delay200ms(void)	//@24.000MHz,Y6内核
{
	unsigned char data i, j, k;

	_nop_();
	_nop_();
	i = 25;
	j = 90;
	k = 176;
	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; 
	key_flag=1;

}

void KEY1(void) interrupt 0 
{
	
	key_flag=!key_flag;
	while(!key1);
	
}

void KEY2(void) interrupt 2 
{
	time_bit=0;
	time_num++;
	if(time_num>4)
	{
		time_num=0;
	}
	
}

void turn()
{
	
	if(key_flag)
	{
		
		P0=~(1<<led_bit);
		//Delay200ms();
		led_bit++;
		if(led_bit>2)
		{
			led_bit=0;
		}
	}
}

void time_turn()
{

	Delay200ms();
	if(time_bit==time_num)
	{
	turn();
	time_bit=0;
	}
	else
	{
	time_bit++;
  }
		

}


void main()
{
	
	setup();
	while(1)
	{

		time_turn();
		
	}
	
}



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值