变速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();
}
}