[资源共享] 芯圣SQ015芯片!利用按键实现睡眠流水灯等功能切换

[复制链接]
1540|29
 楼主 | 2018-7-12 09:08 | 显示全部楼层 |阅读模式
主控为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个模式,亲测实用有效!
程序和原理图打包给有需要朋友下载使用。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2018-7-12 16:04 | 显示全部楼层
点个赞
| 2018-7-12 21:31 | 显示全部楼层
直接用的定时器啊

评论

asd2002061 2018-7-13 09:56 回复TA
对的 
| 2018-7-13 08:44 | 显示全部楼层
芯圣深圳代理商 QQ1449251178
 楼主 | 2018-7-13 09:56 | 显示全部楼层
wowu 发表于 2018-7-12 21:31
直接用的定时器啊

对的,,哈哈
| 2018-7-17 13:57 | 显示全部楼层

呵呵呵看来我眼光还在
| 2018-7-22 22:49 | 显示全部楼层
牛逼,这个芯片有多便宜呢
 楼主 | 2018-7-23 09:03 | 显示全部楼层
xujunyi3611 发表于 2018-7-22 22:49
牛逼,这个芯片有多便宜呢?

1块2,1块3那样。。。很便宜的。。
| 2018-8-12 22:28 | 显示全部楼层
asd2002061 发表于 2018-7-23 09:03
1块2,1块3那样。。。很便宜的。。

好贵啊
| 2018-8-13 08:51 | 显示全部楼层

他瞎扯的  实际很便宜  你加下我 1449251178
| 2018-8-13 09:24 | 显示全部楼层
芯圣深圳代理企鹅号:756088897 有需要联系
| 2018-9-12 20:21 | 显示全部楼层
这个不错
| 2018-9-12 22:23 | 显示全部楼层
用什么编译器?
 楼主 | 2018-9-13 14:56 | 显示全部楼层
pmw_56 发表于 2018-9-12 22:23
用什么编译器?

HC-IDE
| 2018-9-13 16:17 | 显示全部楼层
很便宜  你加下我 1449251178
| 2018-9-27 17:16 | 显示全部楼层
能说说怎么调节灯的亮度吗 萌新表示看不太懂程序
 楼主 | 2018-9-28 09:01 | 显示全部楼层
间接税 发表于 2018-9-27 17:16
能说说怎么调节灯的亮度吗 萌新表示看不太懂程序

直接调用set_LED();函数即可,0~100调节亮度,0为关闭LED,100最亮。
| 2018-9-28 10:49 | 显示全部楼层
芯圣深圳代理企鹅号:814512312 有需要随时联系
| 2018-9-28 14:37 | 显示全部楼层

芯圣深圳代理企鹅号:1449251178 有需要随时联系
 楼主 | 2018-9-28 16:30 | 显示全部楼层
冷画 发表于 2018-9-28 14:37
芯圣深圳代理企鹅号:1449251178 有需要随时联系

你这广告不是打了一回了,,
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

快速回复 返回顶部 返回列表