打印
[通用PIC核OTP系列]

芯圣SQ015芯片!利用按键实现睡眠流水灯等功能切换

[复制链接]
6036|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 芯圣电子官方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)

评论
yulin0668 2019-9-20 13:12 回复TA
文件是损坏了的?跟本就解压不了。 
沙发
广游戏| | 2018-7-12 16:04 | 只看该作者
点个赞

使用特权

评论回复
板凳
wowu| | 2018-7-12 21:31 | 只看该作者
直接用的定时器啊

使用特权

评论回复
评论
asd2002061 2018-7-13 09:56 回复TA
对的 
地板
冷画| | 2018-7-13 08:44 | 只看该作者
芯圣深圳代理商 QQ1449251178

使用特权

评论回复
5
asd2002061|  楼主 | 2018-7-13 09:56 | 只看该作者
wowu 发表于 2018-7-12 21:31
直接用的定时器啊

对的,,哈哈

使用特权

评论回复
6
wowu| | 2018-7-17 13:57 | 只看该作者

呵呵呵看来我眼光还在

使用特权

评论回复
7
xujunyi3611| | 2018-7-22 22:49 | 只看该作者
牛X,这个芯片有多便宜呢

使用特权

评论回复
8
asd2002061|  楼主 | 2018-7-23 09:03 | 只看该作者
xujunyi3611 发表于 2018-7-22 22:49
牛X,这个芯片有多便宜呢?

1块2,1块3那样。。。很便宜的。。

使用特权

评论回复
9
copower| | 2018-8-12 22:28 | 只看该作者
asd2002061 发表于 2018-7-23 09:03
1块2,1块3那样。。。很便宜的。。

好贵啊

使用特权

评论回复
10
冷画| | 2018-8-13 08:51 | 只看该作者

他瞎扯的  实际很便宜  你加下我 1449251178

使用特权

评论回复
11
一个M组成MCU| | 2018-8-13 09:24 | 只看该作者
芯圣深圳代理企鹅号:756088897 有需要联系

使用特权

评论回复
12
angelzsj| | 2018-9-12 20:21 | 只看该作者
这个不错

使用特权

评论回复
13
pmw_56| | 2018-9-12 22:23 | 只看该作者
用什么编译器?

使用特权

评论回复
14
asd2002061|  楼主 | 2018-9-13 14:56 | 只看该作者
pmw_56 发表于 2018-9-12 22:23
用什么编译器?

HC-IDE

使用特权

评论回复
15
冷画| | 2018-9-13 16:17 | 只看该作者
很便宜  你加下我 1449251178

使用特权

评论回复
16
间接税| | 2018-9-27 17:16 | 只看该作者
能说说怎么调节灯的亮度吗 萌新表示看不太懂程序

使用特权

评论回复
17
asd2002061|  楼主 | 2018-9-28 09:01 | 只看该作者
间接税 发表于 2018-9-27 17:16
能说说怎么调节灯的亮度吗 萌新表示看不太懂程序

直接调用set_LED();函数即可,0~100调节亮度,0为关闭LED,100最亮。

使用特权

评论回复
18
Jerry李| | 2018-9-28 10:49 | 只看该作者
芯圣深圳代理企鹅号:814512312 有需要随时联系

使用特权

评论回复
19
冷画| | 2018-9-28 14:37 | 只看该作者

芯圣深圳代理企鹅号:1449251178 有需要随时联系

使用特权

评论回复
20
asd2002061|  楼主 | 2018-9-28 16:30 | 只看该作者
冷画 发表于 2018-9-28 14:37
芯圣深圳代理企鹅号:1449251178 有需要随时联系

你这广告不是打了一回了,,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

34

帖子

1

粉丝