//1按键多功能
//第1次按下:红黄绿全亮 第2次按下:红黄绿依次间隔1S点亮 第3次按下:红黄绿间隔4秒依次渐亮渐暗变化
//记忆上面3状态 关机重启能读出上次掉电时的状态
#include<reg51.h>
#include"24c02.h"
#define uchar unsigned char
#define uint unsigned int
sbit led_k=P1^4;
sbit a1=P1^0;
sbit a2=P1^1;
sbit a3=P1^2;
sbit a4=P1^3;
sbit led_red =P0^0;
sbit led_yellow=P0^1;
sbit led_green =P0^2;
sbit k=P3^3;
unsigned int t1=0;
unsigned char t=0,num,num1,count=0;
void keycount();
void delay1ms(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
main()
{
init(); //i2c初始化
count=read_add(2); //首次上电读出记忆的状态
TMOD=0X11;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
EA=1;
ET0=1;
ET1=1;
led_k=1;/*打开6个led的总开关*/
a1=a2=a3=a4=0;/*关闭数码管,否则数码管会拉低P0口电平,导致流水灯不亮*/
P0=0;
while(1)
{
keycount();
}
}
void keycount()
{
if(k==0)
{
delay1ms(10);
if(k==0)
{
count++;
if(count>=4)
{
count=1;
}
write_add(2,count); //按键状态记忆
}
while(k==0);
}
switch(count)
{
case 1: { TR0=0;TR1=0; led_red=led_yellow=led_green=1; } break;
case 2: { TR0=1;TR1=0; } break;
case 3: { TR0=0;TR1=1; } break;
}
}
void t_0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
num++;
if(num>=100)
{
num=0;
t++;
}
if(t<1)
{
led_red=1; led_yellow=0;led_green=0;
}
else if((t>=1)&&(t<2))
{
led_red=0; led_yellow=1;led_green=0;
}
else if((t>=2)&&(t<3))
{
led_red=0; led_yellow=0;led_green=1;
}
else if(t>=3)
{
t=0;
}
}
void t_1() interrupt 3
{
//定义亮度变化范围为0~99(100等分).即最亮的时候其灰度等级为99,为0的时候最暗,也就是熄灭了。
static PWM = 0 ; //PWM初始为0
static Direction = 0 ; //LED方向控制 (0:渐亮 ) (1:渐灭)
static PWMCounter= 0 ; //LED占空比计数(0~99变化)
TH1=(65536-200)/256; //计数寄存器高8位重新载入
TL1=(65536-200)%256; //计数寄存器低8位重新载入 200us
num1++;
if(num1>=100) //每20ms调整一下LED的占空比
{
num1=0;
t1++;
if((PWMCounter <=99) &&(Direction==0)) //如果是渐亮方向变化,则占空比递增 (2S时间100等分)
{ //20MS * 100 = 2S的时间内LED从暗逐渐变亮
PWMCounter++ ;
if(PWMCounter > 99)
{
Direction = 1 ;
PWMCounter= 99 ;
}
}
if( (PWMCounter >= 0) &&(Direction==1) ) //如果是渐暗方向变化,则占空比递减
{ //20MS * 100 = 2S的时间内LED从亮逐渐变暗
PWMCounter-- ;
if(PWMCounter < 0)
{
Direction = 0 ;
PWMCounter= 0 ;
}
}
PWM = PWMCounter ; //获取LED的占空比
}
if(t1<200) //0~4秒红变化
{
if(PWM > 0) //占空比大于0,则点亮LED,否则熄灭LED
{
led_red=1; led_yellow=0;led_green=0;
PWM-- ;
}
else P0=0;
}
else if((t1>=200)&&(t1<400)) //4~8秒黄变化
{
if(PWM > 0) //占空比大于0,则点亮LED,否则熄灭LED
{
led_red=0; led_yellow=1;led_green=0;
PWM-- ;
}
else P0=0;
}
else if((t1>=400)&&(t1<600)) //8~12秒绿变化
{
if(PWM > 0) //占空比大于0,则点亮LED,否则熄灭LED
{
led_red=0; led_yellow=0;led_green=1;
PWM-- ;
}
else P0=0;
}
else if(t1>=600) //大于12秒清零
{
t1=0;
Direction = 0 ; //渐亮方向变化
PWMCounter= 0; //占空比清零
}
}
|