这是我用的stc8g08a-8pin代码, 可以参考一下, 我测下来还行, io口设置的是p32 p33 p55
- #include "driver/pca.h"
-
- static u16 g_pwm_tmps[2];
- static u16 g_pwm_highs[2]={PCA_T1US*500, PCA_T1US*2500};
- static u16 g_pwm_lows[2]={PWM_DUTY-PCA_T1US*500, PWM_DUTY-PCA_T1US*2500};
- void PCA_Init(void)
- {
- CCON = 0x00;
- CMOD = 0x00; //PCA时钟为系统时钟12分频
- CL = 0x00;
- CH = 0x00;
-
- CCAPM1 = 0x4d; //PCA模块0为16位定时器模式并使能脉冲输出
- g_pwm_tmps[0] = PCA_T1US*500;
- CCAP1L = g_pwm_tmps[0];
- CCAP1H = g_pwm_tmps[0] >> 8;
- g_pwm_tmps[0] += PCA_T1US*500;
-
- CCAPM2 = 0x4d;
- g_pwm_tmps[1] = PCA_T1US*500;
- CCAP2L = g_pwm_tmps[1];
- CCAP2H = g_pwm_tmps[1] >> 8;
- g_pwm_tmps[1] += PCA_T1US*500;
-
- CR = 1; //启动PCA计时器
- }
-
- void UpdatePCA(u8 pin, u16 pwm_high)
- {
- CR = 0;
- g_pwm_highs[pin] = pwm_high*PCA_T1US;
- g_pwm_lows[pin] = PWM_DUTY-g_pwm_highs[pin];
- CR = 1;
- }
-
-
- void PCA_Isr() interrupt 7
- {
- if(CCF1) {
- CCF1 = 0;
- if(P33) g_pwm_tmps[0] += g_pwm_highs[0];
- else g_pwm_tmps[0] += g_pwm_lows[0];
- CCAP1L = g_pwm_tmps[0];
- CCAP1H = g_pwm_tmps[0] >> 8;
- }
-
- if(CCF2) {
- CCF2 = 0;
- if(P55) g_pwm_tmps[1] += g_pwm_highs[1];
- else g_pwm_tmps[1] += g_pwm_lows[1];
- CCAP2L = g_pwm_tmps[1];
- CCAP2H = g_pwm_tmps[1] >> 8;
- }
-
- if(CF) CF = 0;
- }
-
- #ifndef __PCA_H__
- #define __PCA_H__
-
- #include "firmware/config.h"
-
- #define PCA_T1US (MAIN_Fosc / 12 / 1000000) // 1us 12分频
- #define PWM_DUTY (20000*PCA_T1US) // 20ms
-
- void PCA_Init(void);
- void UpdatePCA(u8 pin, u16 pwm_high);
-
- #endif // __PCA_H__
-
复制代码
|