|
短按調(diào)色,1次白光,2次黃光,3次中性光每種光都可長按無級調(diào)光,互不影響。
中微SC8p8022已測穩(wěn)定.
- #include <sc.h>
- #include "Touch_Kscan_Library.h"
- volatile unsigned int pwm_duty,pwm_duty1,pwm_duty2,num;
- volatile unsigned char MainTime,touch_count = 0;
- volatile bit B_MainLoop,state=0;
- volatile unsigned int Time;
- void delay(int count) {
- for (int i = 0; i < count; i++) {
- for (int j = 0; j < 100; j++) {
- }
- }
- }
- //系統(tǒng)初始化
- void Init_System()
- {
- asm("nop");
- asm("clrwdt");
- INTCON = 0; //禁止中斷
- OSCCON = 0X72; //配置振蕩為8M
- OPTION_REG = 0;
-
- PORTB = 0;
-
- PIE1 = 2;
-
- PR2 = 250; //8M下將TMR2設(shè)置為125us中斷
- //TRISB=0B00010100;
- TRISB=0;
- PWMCON0=0;
- PWMTL=0XEF;
- PWMT4L=0XEF;
- PWMTH=0B00001111;
-
- PWMD23H=00;
- PWMD3L=0X0F;
- PWMD4L=0X0F;
-
-
- PWMIF=0;
- PWMCON0 &= ~(0b00011000);
-
- T2CON = 4; //使能定時器2
- INTCON = 0XC0; //使能中斷
- }
- void Refurbish_Sfr()
- {
- //刷新中斷相關(guān)控制寄存器
- PIE1 = 2;
- PR2 = 250;
- INTCON = 0XC0;
- if (4 != T2CON)
- T2CON = 4;
- }
- void set_pwm_duty_cycle(unsigned int pwm3_duty, unsigned int pwm4_duty)
- {
-
-
-
- pwm3_duty=pwm3_duty/4;
- pwm4_duty=pwm4_duty/4;
- // 寫入PWM3占空比(8位)
-
- PWMD23H = ((pwm3_duty >> 8) & 0x03)<<4; // 高2位
- PWMD3L = pwm3_duty&0xFF ; // 低8位
- // 寫入PWM4占空比(10位)
- PWMTH = ((pwm3_duty >> 8) & 0x03)<<4;
- PWMD4L = pwm4_duty&0xFF;
- PWMCON0=0B00011000;
-
-
-
-
-
- }
- /***********************************************************
- 鍵處理函數(shù)
- ***********************************************************/
- void KeyServer()
- {
- static unsigned char KeyOldFlag = 0;
- static bit Leave,state=0;
- unsigned int Tim;
-
- // 有鍵按下
- if (KeyFlag[0])
- {
- delay(6);//delay(8);
- if(KeyFlag[0]){
- if(Leave)Leave = 0; //有鍵按下 清 松手標(biāo)志
-
- Time++;
- if(Time>200)
- {
- Tim++;
- if(Tim>=3000){
- Tim=0;
-
- if(state==0)
- {
- num++; //增加亮度
- if(num>=800)
- {
- num=800;
- }
- }
- if((state==1) && (num>8))
- {
- num--; //減少加亮度
- if(num<=12)
- {
- num=12;
- }
- }
-
- switch(touch_count)
- {
- case 1:
- pwm_duty1=num;
- set_pwm_duty_cycle(0,pwm_duty1);
- break;
- case 2:
- pwm_duty=num;
- set_pwm_duty_cycle(pwm_duty, 0);
- break;
- case 3:
- pwm_duty2=num;
- set_pwm_duty_cycle(pwm_duty2, pwm_duty2);//
- break;
- case 4:
- break;
- }
- //num=pwm_duty;
- }
- }
-
- KeyOldFlag = KeyFlag[0];
- }
- }
- else //沒鍵按下
- {
- if(Leave == 0) //無鍵按下 置位 松手標(biāo)志
- {
- Leave = 1;
- state = ~state; //松手后只執(zhí)行一次
- }
-
- if((KeyOldFlag!=KeyFlag[0]) && Time<200) //短按處理
- {
- delay(4);
- touch_count++;
- switch (touch_count)
- {
- case 1:
- {set_pwm_duty_cycle(0, pwm_duty1); // PWM4 亮 黃
- num=pwm_duty1;
- break;}
- case 2:
- {set_pwm_duty_cycle(pwm_duty, 0); // PWM3 亮
- num=pwm_duty;
- break;}
- case 3:
- {set_pwm_duty_cycle(pwm_duty2,pwm_duty2); // 都 亮
- num=pwm_duty2;
- break;}
- case 4:
- {//set_pwm_duty_cycle(0, 0); // 關(guān)
- //PWMD3L=0;
- //PWMD4L=0;
- PWMCON0 &= ~(0b00011000);
- touch_count=0;
- break;}
- }
-
- }
-
- Time=0;
- KeyOldFlag = 0;
- }
- }
- /***********************************************************
- 中斷服務(wù)函數(shù)
- ***********************************************************/
- void interrupt Isr_Timer()
- {
- if (TMR2IF)
- { //若只使能了一個中斷源,可以略去判斷
- TMR2IF = 0;
- if (++MainTime >= 20)
- {
- MainTime = 0;
- B_MainLoop = 1;
-
- }
- }
- else
- {
- PIR1 = 0;
- }
-
- }
- /***********************************************************
- 主循環(huán)
- ***********************************************************/
- void main()
- {
- Init_System();
- pwm_duty=12;
- pwm_duty1=12;
- pwm_duty2=12;
- while (1)
- {
- if (B_MainLoop)
- {
- B_MainLoop = 0;
- CLRWDT();
- CheckTouchKey();
- Refurbish_Sfr();
- KeyServer();
- }
- }
- }
復(fù)制代碼
51hei.png (4 KB, 下載次數(shù): 0)
下載附件
2025-4-24 16:24 上傳
程序下載:
雙色無級調(diào)光.rar
(136.47 KB, 下載次數(shù): 0)
2025-4-24 10:59 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|