/*此程序是一款一般的彩灯,它的功用主要有四种形式:
第一种形式:开机四种色彩以0.5秒速度循环1次,然后
在白色彩上中止循环,即显现白光第二种形式:按下功
能键后,它以1秒速度四种色彩不断的循环第三种形式:
当按键按下后,它会记住第二种形式的色彩,比方第二种
形式现在亮得是绿色,你按下按键时,它会先闪一下,然
后在绿色彩上停下来第四形式:当你再按下开关时,它
主动回到形式一下,(当然还能够写出三种色彩)
本程序是第一个版别,第二版功用更强壮拜见:
http://www.51hei.com/mcu/1531.html*/
#include
#define uint unsigned int
#define uchar unsigned char
sbit RJ=P2^5;//红灯IO口
sbit GJ=P2^6;//绿灯IO口
sbit BJ=P2^7;//兰灯IO口
sbit key=P1^4;//按键IO口
uchar ding3,yin,x;//分别为定时器变量,标志位变量,以及色彩标志位变量
bit a=1,b,c;//分别为形式1.2.3标志位
/*******************************/
/***********延时子程序***********/
/*******************************/
void delay(uint z)
{
uint x,y;
for(x=100;x>0;x–)
for(y=z;y>0;y–);
}
/*******************************/
/********按键处理子程序********/
/*******************************/
void sk()
{
switch(yin)//履行一键多功用程序
{
case 0:if(key==0)//假如0与yin比较持平,则履行break前的一切内容
{
delay(100);//延时
if(key==0)//再次承认是否有按下
{
yin++;//将变量加1,此句很重要,效果是以使下次按下时好履行下一开关句子
a=0;//将a变为0
c=0;
b=1;//将b变为1,即翻开按键程序中的第二段程序
x=0;//清掉色彩计数变量,以便它从赤色开端循环
while(!key);//按键铺开了吗?
}
}
break;//退出开关句子
case 1: if(key==0)//假如1与yin比较持平,则履行大括号内容
{
delay(100);//延时
if(key==0)//再次承认是否有按下
{
yin++;//将变量加1,此句很重要,效果是以使下次按下时好履行下一开关句子
b=0;
c=1;//翻开第三种形式标志位,即确认状况
a=0;
x=0;//清掉色彩计数变量,以便它从赤色开端循环
while(!key);//按键铺开了吗?
}
}
break;//退出开关句子
case 2: if(key==0)//假如2与yin比较持平,则履行大括号内容
{
delay(100);//延时
if(key==0)//再次承认是否有按下
{
b=0;//将b变为0,即封闭上一次功用
c=0;//封闭上前面的功用
a=1;//翻开第1次功用,即0.5秒循环闪耀
yin=0;
x=0;//清掉色彩计数变量,以便它从赤色开端循环
while(!key);//按键铺开了吗?
}
}
break;//退出开关句子
}
}
/*******************************/
/*******三种形式显现子程序******/
/*******************************/
void xian()
{
uchar m;//形式3变量
if(a!=0)//第一种形式以0.5秒速度循环闪耀一次,然后在白光处停下来
{
if(ding3>=10)//定时器到了0.5秒吗?
{
ding3=0;
x++;//将标志位加1,以便进入下一种色彩
switch(x)
{
case 1:RJ=1;GJ=0;BJ=0;//亮红光
break;
case 2:RJ=0;GJ=1;BJ=0;//亮绿光
break;
case 3:RJ=0;GJ=0;BJ=1;//亮兰光
break;
case 4:RJ=1;GJ=1;BJ=1;a=0;//亮白光,//将标志位a清0,以便再次循环
break;
}
}
}
if(b!=0)//第二种形式以1秒速度一向循环闪耀。
{
if(ding3>=20)
{
ding3=0;
x++;
switch(x)
{
case 1:RJ=1;GJ=0;BJ=0;m=x;//将x变量内给m保存起来,以便进入形式三时能精确的确认一种状况
break;
case 2:RJ=0;GJ=1;BJ=0;m=x;
break;
case 3:RJ=0;GJ=0;BJ=1;m=x;
break;
case 4:RJ=1;GJ=1;BJ=1;m=x;x=0;
break;
}
}
}
if(c!=0)//第三种形式记住形式二时按键按下的色彩,然后确认。
{
RJ=0;GJ=0;BJ=0;
delay(550);
switch(m)//判别上一次形式三的状况,然后确认显现哪种色彩
{
case 1:RJ=1;GJ=0;BJ=0;
break;
case 2:RJ=0;GJ=1;BJ=0;
break;
case 3:RJ=0;GJ=0;BJ=1;
break;
case 4:RJ=1;GJ=1;BJ=1;
break;
}
c=0;//将标志位清0,以便再次循环
}
}
/*******************************/
/*************主程序************/
/*******************************/
void main()
{
RJ=0;//将R LED封闭
GJ=0;//将G LED封闭
BJ=0;//将B LED封闭
TMOD=0X01;//寄存器工作方式
EA=1;//开总中止
TR0=1;//开定时器
ET0=1;//开定时器中止
TH0=(65536-50000)/256;//赋值给高位
TL0=(65536-50000)%256;//赋值给低位
while(1)
{
sk();//调用按键子程序
xian();//调用显现子程序
}
}
void zhong() interrupt 1//T1中止服务程序
{
TH0=(65536-50000)/256;//赋值给高位
TL0=(65536-50000)%256;//赋值给低位
ding3++;//将按键计数器加1
}