Примеры ШИМ, проверено на двух МК, всех из выходах и режимах.
Особенность: период - один регистр, заполнение - второй. Заполнение задается не в процентах, а в виде значения от первого регистра.
Т.е: Вы задали в регистре периода 40000, чтобы получить заполнение равное 50% во второй регистр пишите 20000.

PWM1p, на примере STC8H1K08

Код:
$regfile = "8H1K08.DAT"              ' STC registers list
$crystal = 5529600                   ' CPU clock frequence '11059200/2= 5529600
$large                               '

Dim Temp As Byte , Temp2 As Byte
Dim Temp_w As Word , Adc_dat As Word

'---------------------------------------------------------------------------------------

' Выходы P1
P1ie = 255                           ' 1: Enable digital pins
P1pu = 0                             ' 0= Disable pull-up resistor
P1m0 = 0 : P1m1 = 0                  ' pins mode

' Выходы P3
P3ie = 255                           ' 1: Enable digital pins
P3pu = 0                             ' 0= Disable pull-up resistor
P3m0 = 0 : P3m1 = 0                  ' pins mode

  P_sw2 = &H80                       ' EAXFR:Extended RAM SpecialFunctionRegister (XFR) access

  Pwma_ccer1 = 0 : Pwma_ccer2 = 0    ' FECC Ccerx Must Be Cleared  Before Writing To Ccmrx
  Pwma_ccmr1 = &H60                  ' FEC8 Set Cc1 To Pwma Output Mode1
  Pwma_ccer1 = 1                     ' FECC Enable Cc1 Channel

  Pwma_arrh = &H6 : Pwma_arrl = &HFF       ' FED2 FED3   Set Period Time
  Pwma_ccr1h = &H3 : Pwma_ccr1l = &HFF       ' FED5 FED6  Set Duty Cycle Time

  Pwma_eno = 0                       ' FEB1
  Pwma_eno = &B_0000_0011            ' FEB1 Enable Pwm1p Port Output

  Pwma_ps = 0                        ' FEB2
  Pwma_bkr = &H80                    ' FEDD Enable Main Output
  Pwma_cr1 = 1                       ' FEC0 Start Timing

  P_sw2.7 = 0

Do
 P3.2 = Not P3.2
 Waitms 150
Loop

PWM8, на примере STC8H1K28

Код:
$regfile = "8H1K28.DAT"              ' STC registers list
$crystal = 5529600                   ' CPU clock frequence '11059200/2= 5529600
$large                               '

Dim Temp As Byte , Temp2 As Byte
Dim Temp_w As Word , Adc_dat As Word

'---------------------------------------------------------------------------------------

' Выходы P0
P0ie = 255                           ' 1: Enable digital pins
P0pu = 0                             ' 0= Disable pull-up resistor
P0m0 = 0 : P0m1 = 0                  ' pins mode
' Выходы P1
P1ie = 255                           ' 1: Enable digital pins
P1pu = 0                             ' 0= Disable pull-up resistor
P1m0 = 0 : P1m1 = 0                  ' pins mode
' Выходы P2
P2ie = 255                           ' 1: Enable digital pins
P2pu = 0                             ' 0= Disable pull-up resistor
P2m0 = 0 : P2m1 = 0                  ' pins mode
' Выходы P3
P3ie = 255                           ' 1: Enable digital pins
P3pu = 0                             ' 0= Disable pull-up resistor
P3m0 = 0 : P3m1 = 0                  ' pins mode

 P_sw2 = &H80                        ' EAXFR:Extended RAM SpecialFunctionRegister (XFR) access

  Pwmb_ccer1 = 0 : Pwmb_ccer2 = 0    ' Ccerx Must Be Cleared  Before Writing To Ccmrx
  Pwmb_ccmr4 = &B_0110_0000          ' Set Cc8 To Mode "Pwm1"
  Pwmb_ccer2 = &B_0001_0000          ' Enable Cc8 Channel

  Pwmb_arrh = &H6 : Pwmb_arrl = &HFF       '   Set Period Time
  Pwmb_ccr8h = &H3 : Pwmb_ccr8l = &HFF       ' Set Duty Cycle Time

  Pwmb_eno = &B_0100_0000            ' Enable Pwm8 Port Output

  Pwmb_ps = 0                        '
'  Pwmb_ps = &B_10_00_0000             '

  Pwmb_bkr = &H80                    ' Enable Main Output
  Pwmb_cr1 = 1                       ' Start Timing

 P_sw2.7 = 0


Do
 P3.2 = Not P3.2
 Waitms 70
Loop