基础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();
}
}