STC8H1K28单片机课程设计流水LED技术记录

基础RGB流转灯

    在RGB-LED上实现三种颜色轮流变化,变化间隔时间为1S。(较为简单,改变电平加延时即可,不作演示)

1.2 手动RGB流转灯

    通过按键KEY1控制流转灯按B-R-G顺序变化颜色,每次按键流转灯颜色变化一次,可循环实现。(通过外部中断来改变引脚的输出电平即可)

1.3 变速RGB流转灯

    流转灯初始间隔为200mS,通过按键KEY2改变流转灯的间隔,每次按键间隔时间增加200mS;当间隔时间增加到1S后再次按键间隔时间恢复为初始值200mS。(其实就是1.1+1.2)

综合流转灯

    通过按键KEY2实现基础流转灯和手动流转灯两种模式的切换。初始模式为基础流转灯模式。当处于基础流转灯模式时,KEY1用于改变流转灯的间隔时间,如上题中所述。当处于手动流转灯模式时,KEY1用于控制流转灯变换颜色(这里包含了部分前面的代码)

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

typedef unsigned char uchar;
bit mod_flag=0;//模式标志,1为基础流转灯模式,0为手动流转灯模式
bit key_flag=0;//手动模式下转换标准模式
uchar led_bit=0;//LED等流转标志位
uchar time_bit=0;//延时计数标志位
uchar time_num=0;//延时设置标志位

void Delay200ms(void)		//@11.0592MH延时函数
{                       
	unsigned char 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;//外部中断1触发
	EX0=1;//允许外部中断0中断
	EX1=1;//允许外部中断1中断
	EA=1;//总中断开关
	P0M0 |=0x07;P0M1 &=~0x07;//推挽模式
	P3M0 = 0x00;P3M1 = 0x00;//双向
	mod_flag=1;//初始化模式
	
}

void KEY2(void) interrupt 2
	
{
	mod_flag=!mod_flag;//模式转换
	//led_bit=0;
	time_bit=0;
	time_num=0;//初始化标志位
	while(!key2);//抬起按键
	
}
void KEY1(void) interrupt 0
{
	if(mod_flag==1)
	{
		time_bit=0;
		time_num++;
		if(time_num>4)
		{
			time_num=0;
		}
	}
	if(mod_flag==0)
	{
		key_flag=1;
		while(!key1);
		
	}
	while(!key1);
}

void turn_mod1()//基础流转灯模式
{
	
	if(mod_flag==1)
	{
		
		P0=~(1<<led_bit);
		led_bit++;
		if(led_bit>2)
		{
			led_bit=0;
		}
	}
}

void time_turn_mod1()//基础流转灯模式下的延时
{
	
	if(mod_flag==1)
	{
		Delay200ms();
		if(time_bit==time_num)
		{
			turn_mod1();
			time_bit=0;
		}
		else
		{
			time_bit++;
		}
		
	}
	
}

void butt_turn_mod0()   //手动流转灯模式
{
	if(mod_flag==0)
	{
			
			if(key_flag)
			{
				Delay200ms();
				key_flag=0;
				P0=~(1<<led_bit);
				led_bit++;
				if(led_bit>2)
				{
					led_bit=0;
				}
			}
			
		}
	
	}
			
void main()//主函数
{
	
	setup();
	while(1)
	{
		
		time_turn_mod1();
		butt_turn_mod0();
		
	}
}	

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值