本帖最后由 芯圣电子官方QQ 于 2023-7-20 10:10 编辑
主控为015L 实现LED按键切换 睡眠 亮 微亮 闪烁 快闪 流水 呼吸灯功能,程序根据中断系统检测按键输入及调整灯控亮度,输入输出分明,方便移植修改,需要的朋友可以参考一下。
原理图如下图:
程序宏定义如下,可根据自己需求添加LED灯,更改LED亮度
#include <SQ015L.h>
unsigned char LED0,LED1,LED2,LED3,LED4;
unsigned char mode;
#define asm(szCmd) __asm__(#szCmd);
#define AllLight 100
#define CloseLight 0
#define SmallLight 20
#define Fast_time 800
#define Slow_time 2000
#define Port_time 200
#define breath_time 50
程序初始化如下:
void io_init( void )//端口初始化
{
TRISB=0x08;//PB方向寄存器初始化
PHCON=0;//输入上拉功能初始化
PORTB=0;//PORTB输出电平配置
}
void sys_init( void )//系统初始化
{
T0=155;//T0计数值初始化
PCON=0B00111000;//POWER控制寄存器初始化
INTECON=0B10000001;//中断控制寄存器初始化
INTFLAG=0B00000000;//中断标志寄存器初始化
OPTION=0B00000000;//PA方向寄存器初始化
}
中断服务系统如下:
void Intr(void) __interrupt 0
{
static unsigned char i,j;
if(T0IF) //Judge T0IF
{
i++;
if(i>100)i=0;
if(i<LED0) //设置LED灯亮度
PORTB0=1;
else
PORTB0=0;
if(i<LED1)
PORTB1=1;
else
PORTB1=0;
if(i<LED2)
PORTB2=1;
else
PORTB2=0;
if(i<LED3)
PORTB4=1;
else
PORTB4=0;
if(i<LED4)
PORTB5=1;
else
PORTB5=0;
if(PORTB3==0)//按键按下
{
if(j<150)//按键防抖
j++;
}
else
{
if(j>50)
{
j=0;
mode++; //模式切换
if(mode>6)
mode=0;
}
}
INTFLAG=0B00000000; //Clear T0IF
T0=250; //重置T0值
}
}
主函数main如下:
void main(void)
{
unsigned short Delay,breath,flag;
io_init(); //端口初始化
sys_init(); //T0定时中断初始化
set_LED(CloseLight);//LED灯关闭
mode=0; //模式清零,进入睡眠
breath =0; //
flag =0;
while(1)
{
Mode:switch(mode)
{
case 0: //睡眠
{
set_LED(CloseLight);
IOCB=0B00001000;//变化中断使能/唤醒功能
PCON=0B00111000;//POWER控制寄存器初始化
INTECON=0B00000010;//中断控制寄存器初始化
OPTION=0B00000000;// OPTION寄存器初始化
asm(sleep);asm(nop);asm(nop);asm(nop);asm(nop);asm(nop);//进入睡眠低功耗模式
io_init(); //端口初始化
sys_init(); //T0定时中断初始化
set_LED(CloseLight);//LED灯关闭
Delay=20000;
while(Delay--){if(mode!=0)goto Mode;}
}break;
case 1: //全亮
{
set_LED(AllLight);
}break;
case 2: //微亮
{
set_LED(SmallLight);
}break;
case 3: //慢闪
{
set_LED(AllLight);
Delay=Slow_time;
while(Delay--){if(mode!=3)goto Mode;}
set_LED(CloseLight);
Delay=Slow_time;
while(Delay--){if(mode!=3)goto Mode;}
}break;
case 4: //快闪
{
set_LED(AllLight);
Delay=Fast_time;
while(Delay--){if(mode!=4)goto Mode;}
set_LED(CloseLight);
Delay=Fast_time;
while(Delay--){if(mode!=4)goto Mode;}
}break;
case 5: //流水
{
set_LED(CloseLight);LED0=100;
Delay=Port_time;
while(Delay--){if(mode!=5)goto Mode;}
set_LED(CloseLight);LED1=100;
Delay=Port_time;
while(Delay--){if(mode!=5)goto Mode;}
set_LED(CloseLight);LED2=100;
Delay=Port_time;
while(Delay--){if(mode!=5)goto Mode;}
set_LED(CloseLight);LED3=100;
Delay=Port_time;
while(Delay--){if(mode!=5)goto Mode;}
set_LED(CloseLight);LED4=100;
Delay=Port_time;
while(Delay--){if(mode!=5)goto Mode;}
}break;
case 6:
{
set_LED(breath);
if(flag==0)
{breath++;}
else
{breath--;
if(breath==0)flag=0;}
Delay=breath_time;
if(breath>100)flag=1;
while(Delay--){if(mode!=6)goto Mode;}
}break;
}
}
}
程序完成后根据原理图焊板效果如下:
利用仿真器烧录后效果如下:
点击按键可以切换6个模式,亲测实用有效!
程序和原理图打包给有需要朋友下载使用。
HC18P010L_LedSwitch_program.rar
(86.93 KB)
|
文件是损坏了的?跟本就解压不了。