3路RGB渐变学习用

[复制链接]
查看3921 | 回复1 | 2017-8-5 11:26:59 | 显示全部楼层 |阅读模式
#include  "SN8P2501B.h"

        #define                key_stop               FP12                                //按键
//*******************************************************
//led
        #define                led_r                   FP00                                //三个灯的IO口
        #define                led_g                   FP25
        #define                led_b                   FP10

        bit         ft_r_wait_2s,ft_g_wait_2s,ft_b_wait_2s;       

    bit         ft_r_2s,ft_g_2s,ft_b_2s;
    bit         ft_isr_on,ft_pwm_20ms,ft_key_20ms;                //中断时间,pwm增加的基准时间
    bit         f_stop,f_key_on,ft_sleep_on;
//.......................................................;
        unsigned int        b_led_g_model,b_led_b_model;                //pwm的模式
        unsigned int        b_led_r_model,b_led_r_tcor;
        unsigned int        b_led_g_tcor,b_led_b_tcor;                        //占空比
       
        unsigned int        t_r_10ms,t_g_10ms,t_b_10ms,t_1ms;
       
        unsigned int        b_pwm_sum,b_key_sum;               
//*******************************************************
//初始化  
        void         sys_init(void)
{
//*******************************************************
//清RAM
        _ClrRAM();       
//*******************************************************
//IO  
        P1UR=0xFF;                                                                                        //P10.0,P1.0,P5.4输出                                                                       
        P1M=0xFB;                                                                                        //p1.2作为按键使用
        P2M=0XFF;
        P0M=0xFF;                                                                                                                                                        
//******************************************************;
//TC0__50US
        TC0M=0xF4;
        TC0R=180;       
        FTC0IRQ=0;
        FTC0IEN=1;
//*******************************************************;
//T0__1MS
        T0M=0xB0;
        T0C=131;       
        FT0IRQ=0;
        FT0IEN=1;
        FGIE=1;       
//*******************************************************;         
//数据初始化       
        b_led_r_model=0;
        b_led_g_model=2;
        b_led_b_model=1;
//.......................................................;
        b_led_r_tcor=0;         
        b_led_g_tcor=255;
        b_led_b_tcor=0;
//.......................................................;
        ft_r_wait_2s=1;
        ft_g_wait_2s=1;
        ft_b_wait_2s=0;
//*******************************************************;         
}

        void         time(void )
{
        if(ft_isr_on==1)
                {
                        ft_isr_on=0;
                        t_1ms++;
                           if(t_1ms==20)                                                                //20ms增加一介
                                {
                                        t_1ms=0;
                                        ft_key_20ms=1;       
//.......................................................;是否暂停,暂停后不需要进下面程序
                                        if(f_stop==1)        {goto time_pro90;}
//.......................................................;2.5s=20MS*127
                                          ft_pwm_20ms=1;                                                //pwm增加的基准时间       
                                        if(ft_r_wait_2s==1)
                                                {
                                                        t_r_10ms++;       
                                                         if(t_r_10ms==127)
                                                                 {
                                                                         t_r_10ms=0;
                                                                        ft_r_2s=1;
                                                                        ft_r_wait_2s=0;
                                                                 }
                                                }       
//.......................................................;
                                        if(ft_g_wait_2s==1)
                                                {       
                                                        t_g_10ms++;       
                                                         if(t_g_10ms==127)
                                                                 {
                                                                         t_g_10ms=0;
                                                                        ft_g_2s=1;
                                                                        ft_g_wait_2s=0;
                                                                 }       
                                                }       
//.......................................................;
                                        if(ft_b_wait_2s==1)
                                                {
                                                        t_b_10ms++;       
                                                         if(t_b_10ms==127)
                                                                 {
                                                                         t_b_10ms=0;
                                                                        ft_b_2s=1;
                                                                        ft_b_wait_2s=0;
                                                                 }
                                                }               
//.......................................................;                                                                                       
                                }                                  
                }
time_pro90:;
}


void         pwm_count(void)                                                                               
        {
//.......................................................;19ms进一次程序       
                if(ft_pwm_20ms==1)
                {                               
                        ft_pwm_20ms=0;
//*******************************************************
//R                       
pwm_r_10:;
                        if(b_led_r_model==0)                                                //选择模式,如果是模式0的话那在这里停2s
                                {
                                        if(ft_r_2s==1)
                                                {
                                                        ft_r_2s=0;
                                                        b_led_r_model=1;
                                                }
                                        goto pwm_g_20;
                                }               
//.......................................................;       
                        if(b_led_r_model==2)
                                {
                                        if(ft_r_2s==1)
                                                {
                                                        ft_r_2s=0;
                                                        b_led_r_model=3;
                                                }
                                        goto pwm_g_20;
                                }                               
//.......................................................;       
                        if(b_led_r_model==1)
                                {
                                        b_led_r_tcor++;                                                //19ms增加一介(这个数据必须小于20ms,否则会有停顿的感觉)
                                        if(b_led_r_tcor==255)
                                                {
                                                        b_led_r_model=2;
                                                        ft_r_wait_2s=1;                                //等待2s的标志位
                                                }
                                        goto pwm_g_20;
                                }
//.......................................................;                                                                               
                        if(b_led_r_model==3)
                                {
                                        b_led_r_tcor--;
                                        if(b_led_r_tcor==0)
                                                {
                                                        b_led_r_model=0;
                                                        ft_r_wait_2s=1;
                                                }
                                }                       
//*******************************************************
//G               
pwm_g_20:;       
                        if(b_led_g_model==0)
                                {
                                        if(ft_g_2s==1)
                                                {
                                                        ft_g_2s=0;
                                                        b_led_g_model=1;
                                                }
                                        goto pwm_b_30;
                                }               
//.......................................................;       
                        if(b_led_g_model==2)
                                {
                                        if(ft_g_2s==1)
                                                {
                                                        ft_g_2s=0;
                                                        b_led_g_model=3;
                                                }
                                        goto pwm_b_30;
                                }
//.......................................................;       
                        if(b_led_g_model==1)
                                {
                                        b_led_g_tcor++;                                 
                                        if(b_led_g_tcor==255)
                                                {
                                                        b_led_g_model=2;
                                                        ft_g_wait_2s=1;
                                                }
                                        goto pwm_b_30;
                                }
//.......................................................;                                                                               
                        if(b_led_g_model==3)
                                {
                                        b_led_g_tcor--;
                                        if(b_led_g_tcor==0)
                                                {
                                                        b_led_g_model=0;
                                                        ft_g_wait_2s=1;
                                                }
                                }                       
//*******************************************************
//B                        
pwm_b_30:;       
                        if(b_led_b_model==0)
                                {
                                        if(ft_b_2s==1)
                                                {
                                                        ft_b_2s=0;
                                                        b_led_b_model=1;
                                                }
                                        goto pwm_pro90;
                                }               
//.......................................................;       
                        if(b_led_b_model==2)
                                {
                                        if(ft_b_2s==1)
                                                {
                                                        ft_b_2s=0;
                                                        b_led_b_model=3;
                                                        goto pwm_pro90;
                                                }
                                        goto pwm_pro90;
                                }               
//.......................................................;       
                        if(b_led_b_model==1)
                                {
                                        b_led_b_tcor++;                                         
                                        if(b_led_b_tcor==255)
                                                {
                                                        b_led_b_model=2;
                                                        ft_b_wait_2s=1;
                                                }
                                        goto pwm_pro90;
                                }
//.......................................................;                                                                               
                        if(b_led_b_model==3)
                                {
                                        b_led_b_tcor--;
                                        if(b_led_b_tcor==0)
                                                {
                                                        b_led_b_model=0;
                                                        ft_b_wait_2s=1;
                                                }
                                }       
/////////////////////////////////////////////////////////;
                }
pwm_pro90:;
        }




void key(void)
                {
////////////////////////////////////////////////////////////////////////////////////;按键10ms扫描一次                               
                        if(ft_key_20ms==1)                                                         
                                {
                                        ft_key_20ms=0;
////////////////////////////////////////////////////////////////////////////////////;赋数                                                                                                       
                                        if(key_stop==1)                                                                                                        //按键按下key_stop=0
                                                {                                                                                                                       
                                                        f_key_on=0;                                                                                                //如果按键弹起那把按下按下标志位清掉
                                                        b_key_sum=0;                                                                                        //消抖寄存器也清掉
                                                        goto key_pro90;
                                                }
////////////////////////////////////////////////////////////////////////////////////;判断按键是否还未弹起
                                                if(f_key_on==1)        {goto key_pro90;}
////////////////////////////////////////////////////////////////////////////////////;消抖120ms(由于这个按键是常闭按键,所以消抖时间比较长)                                                                                                                       
                                                 b_key_sum++;
                                                if(b_key_sum==6)
                                                        {
                                                                f_key_on=1;                                                                                        //按键按下标志位
                                                                f_stop=!f_stop;                                                                                //暂停工作标志位
                                                        }
////////////////////////////////////////////////////////////////////////////////////;跳出
                                }
key_pro90:;
                }



        void         ROM_save(void )
{





}




void         led(void)                                                                               
                {
//*******************************************************;用占空比的数据和周期数据比较,大于输出高电平,反之输出低电平
//R                       
                        if(b_led_r_tcor>b_pwm_sum){led_r=1;}
                          else{led_r=0;}
//*******************************************************
//G
                        if(b_led_g_tcor>b_pwm_sum){led_g=1;}
                        else{led_g=0;}
//*******************************************************
//B       
                        if(b_led_b_tcor>b_pwm_sum){led_b=1;}
                        else{led_b=0;}
/////////////////////////////////////////////////////////;
                }

        __interrupt isr(void)
                {       
                        if(FTC0IRQ==1)
                                {
                                         FTC0IRQ=0;
                                        b_pwm_sum++;                                                //灯的周期        50us*256=12.8ms=78.125hz(只有大于50hz才能够保证灯不会看到闪烁的现象)
                                }       
//*******************************************************
//中断1ms
                        if(FT0IRQ==1)
                                {
                                         FT0IRQ=0;
                                        T0C=131;                                                        //t0中断重新赋初值
                                        ft_isr_on=1;                                                //中断标志位,用于计数
                                }
                }


void         sleep(void )
                {
                        if(ft_sleep_on==1)
                                {
                                        ft_sleep_on=0;
                                        FCPUM0=1;
                                }
                }
////////////主函数/////////////////////////////
   void      main(void)
{
   STKP=0X7F;
   PFLAG=0;
   OSCM=0;
   sys_init();


   while(1)
        {
                  WDTR=0x5A;           //清狗
                          time();
                           pwm_count();
                    led();
            key();
                        ROM_save();
                sleep();
                 }
}

评分

1

查看全部评分

MCU | 2017-8-7 08:18:45 | 显示全部楼层
80HZ频率偏低了吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则