找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 252|回复: 1
打印 上一主题 下一主题
收起左侧

中微SC8p8022单片机双色无级调光,触摸,PWM控制程序

[复制链接]
跳转到指定楼层
楼主
短按调色,1次白光,2次黄光,3次中性光每种光都可长按无级调光,互不影响。
中微SC8p8022已测稳定.

  1. #include <sc.h>
  2. #include "Touch_Kscan_Library.h"

  3. volatile unsigned int pwm_duty,pwm_duty1,pwm_duty2,num;
  4. volatile unsigned char MainTime,touch_count = 0;
  5. volatile bit        B_MainLoop,state=0;
  6. volatile unsigned int Time;

  7. void delay(int count) {
  8.     for (int i = 0; i < count; i++) {
  9.         for (int j = 0; j < 100; j++) {
  10.         }
  11.     }
  12. }
  13. //系统初始化
  14. void Init_System()
  15. {
  16.         asm("nop");
  17.         asm("clrwdt");
  18.         INTCON = 0;                                //禁止中断
  19.         OSCCON = 0X72;                        //配置振荡为8M
  20.         OPTION_REG = 0;
  21.        
  22.         PORTB = 0;
  23.        
  24.     PIE1 = 2;
  25.    
  26.     PR2 = 250;                //8M下将TMR2设置为125us中断
  27.         //TRISB=0B00010100;
  28.         TRISB=0;
  29.     PWMCON0=0;       
  30.     PWMTL=0XEF;
  31.         PWMT4L=0XEF;
  32.     PWMTH=0B00001111;
  33.        
  34.         PWMD23H=00;
  35.         PWMD3L=0X0F;
  36.     PWMD4L=0X0F;
  37.        
  38.    
  39.     PWMIF=0;
  40.     PWMCON0 &= ~(0b00011000);
  41.    
  42.     T2CON = 4;                                //使能定时器2
  43.     INTCON = 0XC0;                        //使能中断
  44. }

  45. void Refurbish_Sfr()
  46. {
  47.         //刷新中断相关控制寄存器
  48.         PIE1 = 2;
  49.         PR2 = 250;
  50.         INTCON = 0XC0;
  51.         if (4 != T2CON)
  52.                 T2CON = 4;
  53. }
  54. void set_pwm_duty_cycle(unsigned int pwm3_duty, unsigned int pwm4_duty)
  55. {
  56.        
  57.        
  58.        
  59.         pwm3_duty=pwm3_duty/4;
  60.         pwm4_duty=pwm4_duty/4;
  61.     // 写入PWM3占空比(8位)
  62.        
  63.     PWMD23H = ((pwm3_duty >> 8) & 0x03)<<4;  // 高2位
  64.     PWMD3L = pwm3_duty&0xFF ;          // 低8位

  65.     // 写入PWM4占空比(10位)
  66.     PWMTH = ((pwm3_duty >> 8) & 0x03)<<4;   
  67.     PWMD4L = pwm4_duty&0xFF;  
  68.         PWMCON0=0B00011000;
  69.        
  70.                
  71.        
  72.                
  73.        

  74. }


  75. /***********************************************************
  76. 键处理函数
  77. ***********************************************************/
  78. void KeyServer()
  79. {       
  80.         static unsigned char KeyOldFlag = 0;
  81.         static bit        Leave,state=0;
  82.         unsigned int Tim;
  83.        
  84.         //        有键按下
  85.         if (KeyFlag[0])
  86.         {       
  87.                 delay(6);//delay(8);
  88.                 if(KeyFlag[0]){
  89.                         if(Leave)Leave = 0;        //有键按下 清 松手标志
  90.                
  91.                         Time++;
  92.                         if(Time>200)
  93.                         {       
  94.                                 Tim++;
  95.                                 if(Tim>=3000){
  96.                                         Tim=0;
  97.                                        
  98.                                                         if(state==0)
  99.                                                         {       
  100.                                                                 num++;        //增加亮度
  101.                                                                 if(num>=800)
  102.                                                                 {
  103.                                                                         num=800;
  104.                                                                 }
  105.                                                         }                                       
  106.                                                         if((state==1) && (num>8))
  107.                                                         {      
  108.                                                                 num--;        //减少加亮度       
  109.                                                                 if(num<=12)
  110.                                                                 {
  111.                                                                         num=12;
  112.                                                                 }
  113.                                                         }
  114.                                                                                        
  115.                                                 switch(touch_count)
  116.                                                 {
  117.                                                         case 1:
  118.                                                                 pwm_duty1=num;
  119.                                                            set_pwm_duty_cycle(0,pwm_duty1);                                                
  120.                                                                 break;
  121.                                                         case 2:
  122.                                                                 pwm_duty=num;
  123.                                                            set_pwm_duty_cycle(pwm_duty, 0);                         
  124.                                                                 break;
  125.                                                         case 3:
  126.                                                                 pwm_duty2=num;
  127.                                                                 set_pwm_duty_cycle(pwm_duty2, pwm_duty2);//
  128.                                                                 break;
  129.                                                         case 4:                  
  130.                                                                 break;
  131.                                                 }
  132.                                                 //num=pwm_duty;
  133.                                         }
  134.                         }
  135.                
  136.                 KeyOldFlag = KeyFlag[0];
  137.                 }
  138.         }
  139.         else        //没键按下
  140.         {
  141.                 if(Leave == 0)        //无键按下 置位 松手标志
  142.                 {
  143.                         Leave = 1;
  144.                         state = ~state;        //松手后只执行一次
  145.                 }
  146.                
  147.                 if((KeyOldFlag!=KeyFlag[0]) && Time<200)        //短按处理
  148.                 {       
  149.                         delay(4);
  150.                         touch_count++;
  151.                         switch (touch_count)
  152.                         {
  153.                                 case 1:
  154.                                   {set_pwm_duty_cycle(0, pwm_duty1);  // PWM4 亮         黄                                       
  155.                                         num=pwm_duty1;
  156.                                         break;}
  157.                                 case 2:
  158.                                    {set_pwm_duty_cycle(pwm_duty, 0);  // PWM3 亮
  159.                                         num=pwm_duty;                                       
  160.                                         break;}
  161.                                 case 3:
  162.                                         {set_pwm_duty_cycle(pwm_duty2,pwm_duty2);  // 都 亮        
  163.                                         num=pwm_duty2;
  164.                                         break;}
  165.                                 case 4:
  166.                                         {//set_pwm_duty_cycle(0, 0);  // 关   
  167.                                         //PWMD3L=0;
  168.                                         //PWMD4L=0;
  169.                                         PWMCON0 &= ~(0b00011000);                                                        
  170.                                         touch_count=0;
  171.                                         break;}
  172.                         }
  173.                        
  174.                 }
  175.                
  176.                 Time=0;
  177.                 KeyOldFlag = 0;
  178.         }
  179. }

  180. /***********************************************************
  181. 中断服务函数
  182. ***********************************************************/
  183. void interrupt Isr_Timer()
  184. {
  185.         if (TMR2IF)
  186.         {                        //若只使能了一个中断源,可以略去判断
  187.                 TMR2IF = 0;

  188.                 if (++MainTime >= 20)
  189.                 {       
  190.                         MainTime = 0;
  191.                         B_MainLoop = 1;
  192.                        
  193.                 }
  194.         }  
  195.         else
  196.         {
  197.                 PIR1 = 0;
  198.         }
  199.          
  200. }


  201. /***********************************************************
  202. 主循环
  203. ***********************************************************/
  204. void main()
  205. {
  206.         Init_System();
  207.         pwm_duty=12;
  208.         pwm_duty1=12;
  209.         pwm_duty2=12;               
  210.         while (1)
  211.         {       
  212.                 if (B_MainLoop)
  213.                 {
  214.                         B_MainLoop = 0;
  215.                         CLRWDT();
  216.                         CheckTouchKey();
  217.                         Refurbish_Sfr();                               
  218.                         KeyServer();
  219.                 }
  220.         }
  221. }
复制代码


程序下载: 双色无级调光.rar (136.47 KB, 下载次数: 0)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1091094 发表于 2025-4-29 23:37 | 只看该作者
楼主 也在用中微的单片机吗  可以交流交流吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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