应广科技做MCU算是很用心了,虽然出道比较晚,但是开发工具及开发环境等。
已经超出好几个较早的台湾品牌MCU。就拿开发语言来说,MINI-C就胜过其他的
纯汇编强多了,而且MINI-C的效率是非常高的。
以下是小生初期写的LED混色产品,给大家参考,不过丑话说在前面,由于小生也比较忙,小生只服务自己的已有客户或者潜在客户,
非小生的客户,小生不做技术支持,也不提供产品服务,请大家谅解。
#include "extern.h"
#define WTD_ON set1 clkmd.1
#define WTD_OFF set0 clkmd.1
#define PA5_RESET_ON set1 clkmd.0
#define PA5_RESET_OFF set0 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 EQU 1
c_10ms EQU 10
loop_100ms EQU c_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;
stt16 t16_index;
}
void FPPA0 (void)
{
word temp_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;
}
}
} |