//==============================================================================
// 最简测试：直接输出正弦波到 PWM（不经过任何编解码和缓冲）
//==============================================================================
#include "stc32G.h"

sbit led = P1^6;

#define PWM_PERIOD      299
#define PWM_MIDDLE      128

// 8点正弦波表（12位范围 -2048~2047）
static const short sine_table[8] = {
    0, 1060, 1500, 1060, 0, -1060, -1500, -1060
};

//==============================================================================
// PWM 初始化
//==============================================================================
void PWM_Init(void)
{
    PWMB_CCER1 = 0x00;
    PWMB_CCER2 = 0x00;
    PWMB_IER = 0;
    PWMB_CCER1 |= 0x55;
    PWMB_CCER2 |= 0x55;
    PWMB_CCMR4 |= 0x68;
    PWMB_PSCRH = 0;
    PWMB_PSCRL = 1;
    PWMB_ARRH = (unsigned char)(PWM_PERIOD >> 8);
    PWMB_ARRL = (unsigned char)(PWM_PERIOD);
    PWMB_CCR8H = (unsigned char)(PWM_MIDDLE >> 8);
    PWMB_CCR8L = (unsigned char)(PWM_MIDDLE);
    PWMB_ENO |= 0x40;
    PWMB_PS = (PWMB_PS & 0x3F) | 0x40;
    PWMB_BKR = 0x80;
    PWMB_CR1 |= 0x81;
    PWMB_EGR = 0x01;
}

void PWM_SetDuty(unsigned char val)
{
    unsigned int duty;
    duty = (unsigned int)val * 300UL / 256;
    if(duty > 299) duty = 299;
    PWMB_CCR8H = (unsigned char)(duty >> 8);
    PWMB_CCR8L = (unsigned char)(duty);
}

//==============================================================================
// 定时器1中断：直接输出正弦波
//==============================================================================
void Timer1_Isr(void) interrupt 3
{
    static unsigned char phase = 0;
    static unsigned char pwm_val;
    
    // 正弦波表值 (-2048~2047) 转 PWM (0~255)
    pwm_val = (unsigned char)((sine_table[phase] + 2048) >> 4);
    PWM_SetDuty(pwm_val);
    
    phase++;
    if(phase >= 8) phase = 0;
}

void Timer1_Init(void)
{
    AUXR |= 0x40;
    TMOD &= 0x0F;
    TL1 = 0x48;
    TH1 = 0xF4;
    TF1 = 0;
    TR1 = 1;
    ET1 = 1;
}

//==============================================================================
// 系统初始化
//==============================================================================
void sys_init(void)
{
    WTST = 0;
    EAXFR = 1;
    CKCON = 0;
    P3M0 |= 0x10;
    P3M1 &= ~0x10;
}

//==============================================================================
// 主函数
//==============================================================================
void main(void)
{
    sys_init();
    PWM_Init();
    Timer1_Init();
    
    EA = 1;
    
    while(1);
}