设置函数按键扫描什么的这些不相关有没什么好看的我就不发了
大概讲一下:开机控制led渐亮,按键短按切换亮度(渐变),3阶循环,按键长按关机,关机状态下按键开机
我用的不是51,stm等常用的单片机,自带有pwm模块,,T1TATA0就是pwm比较寄存器,值越大占空比越大
@dirtwillfly
void int_isr(void) __interrupt //中断服务函数
{
__asm
movra _ABuf
swapar _STATUS
movra _StatusBuf
__endasm;
T0IF = 0; //清定时中断标志
bit_time_flag = 1; //一个定时器循环标志
cnt_pd++;
if(bit_long_delay)
{
cnt_long++;
if(cnt_long>=DEF_long_press)
{
bit_power_down=1;
bit_long_delay=0;
}
}
led_shade++;
if((bit_switch)&&(led_shade==tmp_shade))
{
led_shade=0;
if(PWM_level==0)//1-2阶
{
T1DATA0++;
if(T1DATA0>=DEF_PWM_level1)
{
bit_switch=0;
PWM_level=1;
tmp_shade=DEF_shade;//2到3阶
}
}else if(PWM_level==1)//2到3阶
{
T1DATA0++;
if(T1DATA0>=DEF_PWM_level2)
{
bit_switch=0;
PWM_level=2;
tmp_shade=DEF_shade_down;//3到1阶
}
}else if(PWM_level==2)//3到1阶
{
T1DATA0=LED_tab[cnt_tab++];//这里就是渐灭,采用查表的方式,本来想这样变化可以做到比较平滑,不过和直接递减效果没多大差别
if(T1DATA0==DEF_PWM_level0)
{
bit_switch=0;
PWM_level=0;
cnt_tab=0;
tmp_shade=DEF_shade;//1到2阶
}
}else if(PWM_level==3)//关闭到1阶
{
T1DATA0++;
if(T1DATA0>=DEF_PWM_level0)
{
bit_switch=0;
PWM_level=0;
tmp_shade=DEF_shade;//1到2阶
}
}
else if(PWM_level==4)//关闭到2阶
{
if(T1DATA0>=0x4a)
T1DATA0++;
else
T1DATA0+=2;
if(T1DATA0>=DEF_PWM_level1)
{
bit_switch=0;
PWM_level=1;
tmp_shade=DEF_shade;//2到3阶
}
}else if(PWM_level==5)//关闭到3阶
{
if(T1DATA0>180)
T1DATA0+=5;
else
T1DATA0+=2;
if(T1DATA0>=DEF_PWM_level2)
{
bit_switch=0;
PWM_level=2;
tmp_shade=DEF_shade_down;//3到1阶
}
}
}
__asm
swapar _StatusBuf
movra _STATUS
swapr _ABuf
swapar _ABuf
__endasm;
}
void key_work(void) //按键功能,短按切换亮度,长按关机,关机状态下短按开机
{
if(key_new==0x01)
{
key_new = 0;
if(bit_sleep)
{
bit_sleep=0;
bit_poweron=1;
bit_switch=1;
if(PWM_level==0)
tmp_shade=DEF_shade_poweron;
else if(PWM_level==1)
tmp_shade=8;
else if(PWM_level==2)
tmp_shade=5;
PWM_level+=3;
tmp_shade=DEF_shade_poweron;
T1CR = DEF_T1_IO | DEF_T1PR | DEF_T1PTS;
PWMCR = DEF_PWM0EN | DEF_PWM_DBLCK;
}
else
{
bit_long_delay=1;
cnt_long=0;
}
}
if(key_release)
{
key_release = 0;
if(!bit_power_down)
{
if((!bit_sleep)&&(!bit_poweron))
{
bit_long_delay=0;
bit_switch=1;
}
bit_poweron=0;
}
}
}
void power_down_led_close(void) //关机按键灯渐灭
{
cnt_pd=0;
if(T1DATA0>150)
T1DATA0-=7;
else if(T1DATA0>70)
T1DATA0-=5;
else if(T1DATA0>30)
T1DATA0-=3;
else if(T1DATA0>15)
T1DATA0-=2;
else
T1DATA0--;
if(!T1DATA0)
{
bit_goto_sleep=1;
bit_power_down=0;
}
}
void main(void)
{
clr_ram(); //清ram
init_system(); //设置各个寄存器
bit_switch=1; //开启亮度渐变,开机渐渐变亮
PWM_level=3;
T1DATA0=0;
tmp_shade=DEF_shade_poweron;
while(1)
{
ClrWdt();
read_key_value();
key_work();
if((bit_power_down)&&(cnt_pd>=DEF_powerdown))
power_down_led_close(); //关机灯渐灭
if((bit_wake_sleep)||(bit_goto_sleep))
goto_sleep();//睡眠设置
}
}
|