工控秀才 发表于 2012-4-20 20:13

应广单片机---MINI-C参考程序

应广科技做MCU算是很用心了,虽然出道比较晚,但是开发工具及开发环境等。
已经超出好几个较早的台湾品牌MCU。就拿开发语言来说,MINI-C就胜过其他的
纯汇编强多了,而且MINI-C的效率是非常高的。
以下是小生初期写的LED混色产品,给大家参考,不过丑话说在前面,由于小生也比较忙,小生只服务自己的已有客户或者潜在客户,
非小生的客户,小生不做技术支持,也不提供产品服务,请大家谅解。
#include "extern.h"
#define         WTD_ON   set1clkmd.1
#define         WTD_OFF    set0clkmd.1
#define         PA5_RESET_ON   set1 clkmd.0
#define         PA5_RESET_OFFset0 clkmd.0
ON_ICE_DEBUG         EQU      0
//----------IO define-------------------------------
BIT          AC_SYN_INA            :PA.6   //out
BIT          LEDR_OUT            :PA.7   //out
BIT          AC_SYN_INB            :PA.0   // out
BIT          LEDB_OUT            :PA.3   // out
BIT          LEDG_OUT            :PA.4   //out, 低电平使能充电
BIT          AC_SYN_INC            :PA.5   //in,此IO为低时,为充电满

//---------IO define end----------------------------
//
//---------constant define--------------------------
/*
LED工作描述:
混色步骤:
0.绿色渐亮,兰色灭,红色渐亮;
1.绿色渐灭,兰色渐亮,红色渐灭;
2.绿色灭,兰色渐暗,红色渐亮;
3.绿色渐亮,兰色灭,红色渐暗;
4.绿色亮,兰色灭,红色渐亮;
5.绿色亮,兰色渐亮,红色渐暗;
6.绿色渐暗,兰色亮,红色渐亮;
7.绿色渐亮,兰色亮,红色亮;
8.绿色亮,兰色渐亮,红色亮;
9.绿色渐灭,兰色渐灭,红色渐灭
外部时钟输入,20ms.
*/
c_T16_us EQU1
c_10msEQU10
loop_100ms EQUc_10ms * 1000 / c_T16_us
T16_Base      EQU             11764
//---------constant define end----------------------
//
//---------RAM define-------------------------------
word         t16_cnt          ;
word         t16_result       ;
byte         sys_status       ;
bit          f_key_busy          :sys_status.0
bit          f_key_release       :sys_status.1
bit          f_vusb_over_load    :sys_status.2
bit          f_vusb_power_on   :sys_status.3
bit          f_key_once_time   :sys_status.4
bit          f_reach_low_bat   :sys_status.5
bit          f_led_flash         :sys_status.6
bit          f_power_full      :sys_status.7
//
byte         sys_mode      ;
byte         timer_11ms_cnt;
byte         timer_100ms_cnt;
//
byte         pwmr_cnt;
byte         pwmg_cnt;
byte         pwmb_cnt;
byte         pwm_cnt;
//
//---------RAM define end --------------------------
//---------User program start-----------------------
void    io_init(void);
void    ad_init(void);
void    t16_init(void);
void    int_init(void);
void    key_scan(void);
void    delay_1ms(void);
/*
BIT          AC_SYN_IN            :PA.6   //in
BIT          RLED_OUT             :PA.7   //out
BIT          AC_SYN_IN            :PA.0   //in
BIT          BLED_OUT             :PA.3   //out
BIT          GLED_OUT             :PA.4   //out, 低电平使能充电
BIT          AC_SYN_IN            :PA.5   //in,此IO为低时,为充电满
*/
void    io_init(void)
{
paph = 0x00;
pbph = 0x00;
pa   = 0x00;
pb   = 0xff;
pac= 0x99;
pbc= 0x00;
}

void    ad_init(void)
{
      ADCDI = 0x07;
      ADCM= 0x00;
      ADCC= 0x80;
}
void    t16_init(void)
{
      word   t16_index;
      T16M= 0x2f;
      t16_index = 0;
      stt16t16_index;
         
}
void FPPA0 (void)
{
      wordtemp_reg;
.ADJUST_OTP_IHRCR 4MIPS// IHRC/2 = 8MIPS, WatchDog Disable, RAM 0,1 temporary be used
WTD_OFF;   // WatchDog Enable
io_init();
// ad_init();
t16_init();
t16_cnt = T16_Base;
fppen = 0x03;
if(gdio == 0)
{
sys_mode = 0;
      timer_11ms_cnt = 0;
      pwm_cnt    = 0;
      pwmr_cnt   = 0;
      pwmg_cnt   = 0;
      pwmb_cnt   = 0;               
gdio = 0xaa;
}
WTD_ON;
while (1)
{   //a
wdreset;
ldt16   t16_result
a   = (t16_result - t16_cnt) >> 8;
if(a < 0x80)
{
tog   AC_SYN_INB;   
    t16_cnt += T16_Base;
    timer_11ms_cnt++;
    if(timer_11ms_cnt == 0)
    {
       sys_mode++;
       if(sys_mode > 9)
       {
      sys_mode = 0;
      }
   }
    if(sys_mode == 0)
    {
      if(pwmr_cnt < 254)
      {
         pwmr_cnt++;
       }
      if(pwmg_cnt < 254)
      {
          pwmg_cnt++;
       }
       pwmb_cnt = 0;
   }
    if(sys_mode == 1)
    {
      if(pwmr_cnt != 0)
      {
         pwmr_cnt--;
       }
      if(pwmg_cnt != 0)
      {
          pwmg_cnt--;
       }
      if(pwmb_cnt < 254)
      {
       pwmb_cnt++;
       }   
   }
    if(sys_mode == 2)
    {
      if(pwmr_cnt <254 )
      {
         pwmr_cnt++;
       }

       pwmg_cnt = 0;

      if(pwmb_cnt != 0)
      {
       pwmb_cnt--;
       }   
   }
    if(sys_mode == 3)
    {
      if(pwmr_cnt != 0)
      {
         pwmr_cnt--;
       }
      if(pwmg_cnt <254 )
      {
          pwmg_cnt++;
       }

       pwmb_cnt = 0;
   
   }
    if(sys_mode == 4)
    {
      if(pwmr_cnt != 0)
      {
         pwmr_cnt--;
       }
      if(pwmg_cnt != 0)
      {
          pwmg_cnt--;
       }
      if(pwmb_cnt < 254)
      {
       pwmb_cnt++;
       }   
   }
    if(sys_mode == 5)
    {
      if(pwmr_cnt != 0)
      {
         pwmr_cnt--;
       }
      pwmg_cnt = 0;
      if(pwmb_cnt <254)
      {
       pwmb_cnt++;
       }      
   }
    if(sys_mode == 6)
    {
      pwmg_cnt = 0;
      if(pwmb_cnt != 0)
      {
         pwmb_cnt--;
       }
      pwmr_cnt = 0;
   }
    if(sys_mode == 7)
    {
      if(pwmg_cnt < 254)
      {
         pwmg_cnt++;
       }
      if(pwmb_cnt < 254)
      {
         pwmb_cnt++;
       }
       pwmr_cnt = 0;
   }
    if(sys_mode == 8)
    {
       pwmg_cnt = 255;
       if(pwmb_cnt != 0)
       {
      pwmb_cnt--;
      }
       if(pwmr_cnt < 254)
       {
      pwmr_cnt++;
      }
   }
    if(sys_mode == 9)
    {
       if(pwmg_cnt != 0)
       {
      pwmg_cnt--;
      }
       pwmb_cnt = 0;
       if(pwmr_cnt != 0)
       {
          pwmr_cnt--;
      }
   }
                                                
               } // if(a< 0x80)end
}   //aa
}
void FPPA1 (void)   //注意这里,两核心的好处,可以单独跑几路低频的PWM,很轻松。
{
while(1)
{
if(pwmr_cnt >= pwm_cnt)
{
   LEDR_OUT   = 1;
}
else
{
   LEDR_OUT   = 0;
}
//
if(pwmg_cnt >= pwm_cnt)
{
   LEDG_OUT   = 1;
}
else
{
   LEDG_OUT   = 0;
}
//
if(pwmb_cnt >= pwm_cnt)
{
   LEDB_OUT   = 1;
}
else
{
   LEDB_OUT   = 0;
}
   pwm_cnt++;
if(pwm_cnt == 0)
{
   pwm_cnt = 1;
   }   

}
}

董自祝 发表于 2015-10-30 16:31

大神!!!

yhy630 发表于 2015-12-30 16:37

学习了

日你妹的代码 发表于 2018-3-26 16:49

牛B

ywc3000 发表于 2020-5-23 15:23

好,学习了

wyx135135 发表于 2020-9-4 18:20

你好.有技术支持.购你芯片要技术支持下 应广与别的MCU 不一样
页: [1]
查看完整版本: 应广单片机---MINI-C参考程序