程序思想逻辑:1.采用12v供电的2835灯珠
2.通过一个按键执行0-5档的循环切换,本程序以松开按键有效来执行,所以短按长按都可以
3.调光理论是改变PWM值,设定5个参数,同步按键的档位即可
4.设定定时器的溢出时间,这里是设置TMR0定时时长=1/系统时钟频率x4x预分频值x255
=(1/16000000)x4x2x255=0.127ms
5.设置调光频率,通过修改 if(count>120) 这个参数,来调整档位效果,通过测试,100-120效果比较好,150就
会有明显的频闪 ,值越小档位越不清晰,值越大,频闪越明显.
实测1-5档位波形:
c
// FT60E011A SOP8
// ----------------
// VDD-----------|1(VDD) (GND)8|------------GND
// NC------------|2(PA2) (PA4)7|----DemoPortOut
// NC------------|3(PA1) (PA5)6|-------------NC
// NC------------|4(PA3) (PA0)5|-------------NC
// ----------------
//
//*********************************************************
#include "SYSCFG.h"
//***********************宏定义****************************
#define unchar unsigned char
#define unint unsigned int
#define LED_DR PA5
#define KEY1 PA3
#define key_short 100
unchar led_cur_level=0; //按键档位
unint levels[]={0,25,50,75,100}; //灯光亮度
unint DUTY=0; //驱动占空比
unchar DIRECTION=1; //呼吸灯状态
/*-------------------------------------------------
* 函数名:interrupt ISR
* 功能: TMR0中断处理函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void interrupt ISR(void)
{
//if(T0IE && T0IF) //16.384ms翻转一次≈30Hz//T0IF为定时器溢出标志位,必须软件清0
// {
// T0IF = 0;
// DemoPortOut = ~DemoPortOut; //翻转电平
// }
if(T0IE && T0IF)
{
T0IF = 0;
static unint count=0;
count++;
if(count<DUTY){LED_DR=1;}
else{LED_DR=0;}
if(count>120) //0.127MS X120=15.24MS 65hz
{
count=0;
DUTY=levels[led_cur_level];
}
}
}
/*-------------------------------------------------
* 函数名:POWER_INITIAL
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void POWER_INITIAL (void)
{
OSCCON = 0B01110000; //IRCF=111=16MHz/4T=4MHz,0.25us
INTCON = 0; //暂禁止所有中断
OPTION = 0B00001000; //Bit3=1,WDT MODE,PS=000=WDT RATE 1:1
PORTA = 0B00000000;
TRISA = 0B00001000; //PA输入输出 0-输出 1-输入
//PA4-OUT
WPUA = 0B00000000; //PA端口上拉控制 1-开上拉 0-关上拉
MSCKCON = 0B00000000;
//Bit4=0,禁止LVR(60e01x O版之前)
//Bit4=0,LVREN使能时,开启LVR(60e01x O版及O版之后)
//Bit4=1,LVREN使能时,工作时开启LVR,睡眠时自动关闭LVR(60e01x O版及O版后)
}
/*----------------------------------------------------
* 函数名:TIMER0_INITIAL
* 功能: 初始化设置定时器0
* 设置TMR0定时时长=1/系统时钟频率*4*预分频值*255
=(1/16000000)*4*2*255=0.127ms
----------------------------------------------------*/
void TIMER0_INITIAL (void)
{
OPTION = 0B00000000; //时钟源为指令时钟,预分频比为1:2
//Bit5: T0CS Timer0时钟源选择
// 1-外部引脚电平变化T0CKI 0-内部时钟(FOSC/4)
//Bit4: T0SE T0CKI引脚触发方式 1-下降沿 0-上升沿
//Bit3: PSA 预分频器分配位 0-Timer0 1-WDT
//Bit[2:0]:PS 8位预分频比 111 - 1:256 000-1:2
T0IF = 0; //清空T0软件中断
}
/*-------------------------------------------------
* 函数名: main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main()
{
DUTY=0;
POWER_INITIAL(); //系统初始化
unint key_cnt;
LED_DR=0;
key_cnt=0;
TIMER0_INITIAL(); //Timer0初始化
GIE = 1; //开全局中断
T0IE = 1; //开Timer0中断
led_cur_level=0;
while(1)
{
if(!KEY1)
{
key_cnt++;
}
while((KEY1)&&(key_cnt>0))
{
if(key_cnt>=key_short)
key_cnt=0;
//led_cur_level=(led_cur_level+1)%5;
led_cur_level++;
if(led_cur_level>5) {led_cur_level=0;}
}
}
}