查看: 2423|回复: 0
打印 上一主题 下一主题

1按键多功能

[复制链接]
跳转到指定楼层
沙发
发表于 2016-6-6 18:52:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//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; //占空比清零        
      }                 
                                 
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表