应广单片机(PADAUK) MINI-C 编程开发指南初级篇,台湾应广科技的MINI-C 编译器基本上是构建于 ANSI C

整理编辑:逐高电子技术开发部 / 日期:2023-11-28

 MINI- C 语言
1.1 简介.
1.2 MINI-C 的程序结构.应广单片机编程开发
1.3 预处理
1.4 标示符
1.5 数据类型
1.6 常量
1.7 变量
1.8 表达式
1.9 特殊的符号或者符号串.
1.10 指针
2 程序控制语句
2.1 赋值语句
2.2 if 语句
2.3 switch 语句.
2.4 while 语句
3 查表.
4 函数.
5 参考程序范例.

1 MINI- C 语言
1.1 简介
台湾科技的 MINI-C 编译器基本上是构建于 ANSI C,但受限于应广单片机的硬件结构,因此只能支持部
分的 ANSI C。并根据应广单片机的硬件结构,扩展了一些语法,以提高编译效率及节省程序空间。
1.2 MINI-C 的程序结构
MINI-C 语言程序由语句、注释和预处理指令组合而成的。


语句
语句由变量、常量、运算符和函数共同组成,以分号作为结束符。主要是执行以下的动作:
宣告数据变量与数据结构
定义数据空间
执行算术与逻辑运算
执行程序的控制动作
一行程序可以包含多个语句;复合语句由一个或多个被包含在一对大括号内的语句组成,并且可以将其当
单一语句来使用。


源程序必须定义主函数 fppa0。工程可能不只一个源程序文件,但只有一个源程序文件中可以定义主函数
fppa0。
应广早期的产品具有双核和 8 核,如果采用双核,程序中还可以有第二个程序指针所指的一套程序 fppa1;
如果采用 8 核,则还可以有 fppa2,fppa3....,fppa7 等。
注释
注释一般是在文件中解释源程序语句的意义与作用来提供程序的可读性。注释不可以嵌套。
行注释符[ // ],开始于//直至此行结束。
块注释符[ /*…*/ ],开始于/*结束于*/。


1.3 预处理指令
1)文件包含
语法:
#include “filename”
说明:
用双撇号时,系统先在用户当前工程目录中寻找要包含的文件,该文件可以是用户头文件或者 C 程序文件,
或者用户私密库文件 .在应广单片机开发中,各类型的单片机所使用的的寄存器定义头文件,会被系统根
据用户选择的单片机型号自动载入,不需要用户在单独使用“#include”来载入。

 


2)宏定义
#define 标识符 value
其中 value 可以是数值或者语句。注意#define 不能用来定义 IO 名称。
一般用#define 来定义常数或者宏名是可以的。
比如定义常数:
#define C_AD_PB0 0 //定义 AD 通道 PB0 为数据 0;
宏语句定义:
#define WTD_ON set1 clkmd.1 ;//定义宏语句,将看门狗 WTD 打开;
#define WTD_OFF set0 clkmd.1 ;//定义宏语句,将看门狗 WTD 关闭;
定义后,便可以在程序中直接使用宏语句,以方便程序的阅读。
byte a_tamp;
a++;
if(a <= 6)
{
pcadd a; //a = 1~n,a 值等于 0 时不能跳出 pcadd 循环,此处是数据表
{
ret 0x00; //00
ret 0x01;
ret 0x03;
ret 0x07;
ret 0x0f;
ret 0x00;
}
}
else
{
.wdreset; //非预期值,说明程序跑飞,做复位处理。
}
}
访问时通过程序调用,返回表格中的值
例如:
a = led_run_ptrbak;
led_charactor_out_table();
g_byte = a;
out_run_led();


4. 函数:
MINI-C 支持的所有函数都是不带参数传递的,所有的参数传递都需要通过全局变量或者
累加器 A,功能相同汇编的子程序,只是采用了 C 的架构编写。
函数的声明:void 函数名(void);或者 extern void 函数名(void);
函数的调用:函数名();


5. 参考程序范例:
本程序是一个关于自行车用灯的,有一个按键控制 5 个 LED,一组 2 个 LED,一组 3 个 LED
通过按键来改变自行车灯的亮灯模式:
//功能说明:
//1.平常 OFF 状态;
//2.按键一次,三个白色 LED 点亮;
//3.按键二次,两个红色 LED 点亮;
//4.按键三次,白色,红色 LED 全亮;
//5.按键四次,所有 LED 一起闪烁,闪烁频率 100ms,
//6.按键五次,所有 LED 一起关闭。


#define WTD_ON set1 clkmd.1
#define WTD_OFF set0 clkmd.1
#include "extern.h"
KEY_IN equ pa.7 //按键输入
//BLU_OUT equ pa.4 //低 1.4s,高 2.8s
WHITE_LED1_OUT equ pa.0 //脉宽输出信号,LED 亮度调节
WHITE_LED2_OUT equ pa.4 //
WHITE_LED3_OUT equ pa.3 //
WHITE_LIGHT_ON equ 0xe6
RED_LIGHT_ON equ 0x9f
ALL_OFF equ 0xff
RED_LED1_OUT equ pa.5
RED_LED2_OUT equ pa.6
//功能说明:
//1.平常 OFF 状态;
//2.按键一次,三个白色 LED 点亮;
//3.按键二次,两个红色 LED 点亮;
//4.按键三次,白色,红色 LED 全亮;
//5.按键四次,所有 LED 一起闪烁,闪烁频率 100ms,
//6.按键五次,所有 LED 一起关闭。
//-----------------------------------------------
T16_Base EQU 32142
PWM_MAX EQU 250 //100
KEY_MAX_TIME EQU 150
word t16_cnt ;
word t16_result ;
byte pwma_cnt;
byte pwm_cnt;
byte key_value_bak;
byte sysflag;
f_pwm_add_sub equ sysflag.0 //add--->1; sub --->0
f_pwm_adj_en equ sysflag.1
f_10ms equ sysflag.2
f_led_on equ sysflag.3
f_key_scan_en equ sysflag.4
f_key_release equ sysflag.5
f_key_busy equ sysflag.6
f_led_flash_on equ sysflag.7
word key_10ms_cnt ;
word interruput_cnt ;//2.5uS 一次中断
byte key_press_cnt ;//
byte pwm_adj_cnt ;
byte pwm_stable_timer_cnt;
byte stop_sys_cnt;
byte sys_mode;
byte led_flash_cnt;


MINI-C 程序文件仅供参考:
#include "ljs04.h"
void secret(void);
void t16init(void);
void t16_init(void)
{
word t16_index;
T16M = 0x2f;
t16_index = T16_Base;
stt16 t16_index;
}
void timer_pro(void)
{
if(f_10ms == 1)
{
f_10ms = 0;
if(pwm_stable_timer_cnt != 0)
{
pwm_stable_timer_cnt--;
}
if((f_led_on == 0 && KEY_IN == 1) )
{
if(stop_sys_cnt != 0)
{
stop_sys_cnt--;
}
}
}
}
void pwm_generator(void)
{
if(sys_mode == 0)
{
pa = 0xff;
}
else if(sys_mode == 1)
{
pa = WHITE_LIGHT_ON;
}
else if(sys_mode == 2)
{
pa = RED_LIGHT_ON;
}
else if(sys_mode == 3)
{
pa = RED_LIGHT_ON & WHITE_LIGHT_ON;
}
else if(sys_mode == 4)
{
if(f_led_flash_on == 1)
{
pa = RED_LIGHT_ON & WHITE_LIGHT_ON;
}
else
{
pa = ALL_OFF;
}
}
else
{
pa = ALL_OFF;
}
}
void sys_sleep(void)
{
wdreset;
WTD_OFF;
f_led_on = 0;
pac = 0x7f;
pa = 0xff;
paph = 0x80;
flag = 0;
stopsys;
nop;
wdreset;
WTD_ON;
stop_sys_cnt = 200;
}
void key_process(void)
{
byte key_value;
if(f_key_scan_en)
{ //key_scan
f_key_scan_en = 0;
//key_scan();
//-------key scan---------------------------------
a = pa >> 7;
a = 0x01 & a;
a = a ^ 0x01;
//-------key scan end-----------------------------
key_value = a;
if(key_value == 0)
{
if(f_key_release != 1)
{
if(key_press_cnt > 0x70)
{
key_press_cnt --;
}
if(key_press_cnt < 0x78)
{
f_key_release = 1;
f_key_busy = 0;
key_press_cnt = 0x7f;
//if(key_10ms_cnt < 200 && sys_mode != SYS_DISCHARGE)
if(key_10ms_cnt < KEY_MAX_TIME)
{
//tm2c = 0x1a;
}
key_10ms_cnt = 0;
}
}
}
else
{
if(key_value == key_value_bak )
{
if(f_key_busy != 1 )
{ //f_key_busy != 1
if(key_press_cnt < 0x90)// && power_disp_2s_cnt == 0)
{
key_press_cnt ++;
}
if(key_press_cnt > 0x85 )// && power_disp_2s_cnt == 0)
{ // k > 0x8f
f_key_busy = 1;
led_flash_cnt = 0;
key_10ms_cnt = 0;
f_key_release = 0;
key_press_cnt = 0x7f;
pwm_adj_cnt = 0;
if(sys_mode < 4)
{
sys_mode++;
f_led_on = 1;
stop_sys_cnt = 250;
}
else
{
sys_mode = 0;
f_led_on = 0;
stop_sys_cnt = 250;
}
}// k> 0x8f end
} //f_key_busy != 1 end
else
{
//if(key_10ms_cnt < 220)
if(key_10ms_cnt < KEY_MAX_TIME)
{
key_10ms_cnt++;
}
//else if(key_10ms_cnt >= 200 && f_key_once_time == 0)


else
{
pwm_adj_cnt++;
if(pwm_adj_cnt >= 4)
{
pwm_adj_cnt = 0;
f_pwm_adj_en = 1;
}
stop_sys_cnt = 10;
}
}
}
else
{
key_value_bak = key_value;
key_press_cnt = 0x7f;
}
}
}// key_scan end
}
void FPPA0 (void)
{
byte key_value,key_value_bak;
byte sys_stop_cnt;
byte a_temp_m;
//.ADJUST_IC 4MIPS // IHRC/2 = 8MIPS, WatchDog Disable, RAM 0,1 temporary
be used
.ADJUST_IC SYSCLK=IHRC/32, IHRC=16MHz, VDD=3.3V//, Bandgap=On;
// WatchDog Disable, RAM 0 ~ 3 temporary be used
// CLKMD.En_WatchDog = 1; // WatchDog Enable
//clkmd = 0xe4;
WTD_OFF; // WatchDog Enable
misc = 0x20;
intrq = 0x00;
led_flash_cnt = 0;
inten.2 = 1;
//io_init();
pa = 0xff;
paph = 0x80;
pac = 0x7f;
$ padier 0x80;
sysflag = 0;
sys_mode = 0;
f_key_release = 1;
key_press_cnt = 0x7f;
key_10ms_cnt = 0;
t16_init();
stop_sys_cnt = 250;
pwm_adj_cnt = 0;
wdreset;
WTD_ON;
engint;
while (1)
{ //a
if(inten.7 == 0)
{
goto 0;
}
else
{
wdreset;
}
pac = 0x7f;
paph = 0x80;
//===============================================
timer_pro();
key_process();
// pwm_adj();
if(stop_sys_cnt == 0)
{
sys_sleep();
}
} //aa
}
void Interrupt (void)
{
pushaf //
if (Intrq.2) //timer interruput
{
// ldt16 t16_cnt;
t16_cnt = T16_Base;
stt16 t16_cnt;
pwm_generator();
//timer-------
if( led_flash_cnt < 35)
{
led_flash_cnt++;
}
else
{
led_flash_cnt = 0;
}
if(led_flash_cnt < 18)
{
f_led_flash_on = 1;
}
else
{
f_led_flash_on = 0;
}
if(interruput_cnt < 1)
{
interruput_cnt++;
}
else
{
interruput_cnt = 0;
f_key_scan_en = 1;
f_10ms = 1;
}
nop
}
Intrq = 0;
popaf // At PDK80CXX, not support the command
}

应广单片机技术资料

  • 台湾应广单片机官网
  • 应广单片机例程
  • 应广单片机编程指南
  • 应广单片机定时器
  • 技术开发工具
  • 应广单片机IDE&仿真器
  • 应广单片机烧录器
  • 代码生成器
模数转换器ADC 如何工作?应广科技官网公布的PMS132/PMS132B8单片机,ADC 装进程的步骤,有 7 个寄存器需要配置

模数转换器ADC 如何工作?应广科技官网公布的PMS132/PMS132B8单片机,ADC 装进程的步骤,有 7 个寄存器需要配置


应广单片机烧录方法,PMS133/PMS134 的烧录脚为 PA3,PA4,PA5,PA6,VDD,GND 这 6 只引脚,随着烧录器版本的不同,每种封装形式烧录方法也不尽相同

应广单片机烧录方法,PMS133/PMS134 的烧录脚为 PA3,PA4,PA5,PA6,VDD,GND 这 6 只引脚,随着烧录器版本的不同,每种封装形式烧录方法也不尽相同


应广单片机YFS1224 系列12bit ADC 型 MTP MCU 带 2K-bit EEPROM,包含两个部分:PFS122B MCU,2Kbit EEPROM,是一款 12bit ADC 类型的 MTP MCU

应广单片机YFS1224 系列12bit ADC 型 MTP MCU 带 2K-bit EEPROM,包含两个部分:PFS122B MCU,2Kbit EEPROM,是一款 12bit ADC 类型的 MTP MCU


应广单片机PMB180 8 位 OTP 型单片机带充电,IC充电器使用与设定,PMB180 的充电器做电性量测V1 电压波形:(CC Mode, R1 = 10Kohm, C1 = 1uF)

应广单片机PMB180 8 位 OTP 型单片机带充电,IC充电器使用与设定,PMB180 的充电器做电性量测V1 电压波形:(CC Mode, R1 = 10Kohm, C1 = 1uF)


单片机选型指南,项目开发如可购买单片机,这里分享干货让你少找弯路,选择微控制器(MCU)的10个步骤,推荐几款常用的单片机

单片机选型指南,项目开发如可购买单片机,这里分享干货让你少找弯路,选择微控制器(MCU)的10个步骤,推荐几款常用的单片机


PMS152G应广科技8 位 OTP SuLED IO 型单片机,工作温度范围:-40°C ~ 85°C,烧录方法,请使用 PDK5S-P-003x 烧录,1.25KW OTP 程序存储

PMS152G应广科技8 位 OTP SuLED IO 型单片机,工作温度范围:-40°C ~ 85°C,烧录方法,请使用 PDK5S-P-003x 烧录,1.25KW OTP 程序存储


应广科技单片机应用开发中PMC-APN003 IO 输出引脚连接长导线时的应用需知,PA3 用于控制 TRIAC,线路接法为 PA3 输出引脚先接100 公分长的导线

应广科技单片机应用开发中PMC-APN003 IO 输出引脚连接长导线时的应用需知,PA3 用于控制 TRIAC,线路接法为 PA3 输出引脚先接100 公分长的导线


应广触摸单片机 PMS161 触摸功能内含一个触摸检测电路,用户可通过寄存器 ESOCR配置触摸模块电源

应广触摸单片机 PMS161 触摸功能内含一个触摸检测电路,用户可通过寄存器 ESOCR配置触摸模块电源


应广科技 PMB183 8 位 OTP 型单片机带充电,内置一个硬件充电器,此充电器为完全恒流/恒压线性充电,可用于单节锂离子电池充电管理

应广科技 PMB183 8 位 OTP 型单片机带充电,内置一个硬件充电器,此充电器为完全恒流/恒压线性充电,可用于单节锂离子电池充电管理


低功耗高效能语音控制IC,为您的设备赋予语音交互能力,应广科技语音单片机芯片打造极致语音控制体验的IC选择

低功耗高效能语音控制IC,为您的设备赋予语音交互能力,应广科技语音单片机芯片打造极致语音控制体验的IC选择


PMB180应广单片机8 位 OTP 型单片机带充电,内置一个硬件充电器。此充电器为完全恒流/恒压线性充电,可用于单节锂离子电池充电管理

PMB180应广单片机8 位 OTP 型单片机带充电,内置一个硬件充电器。此充电器为完全恒流/恒压线性充电,可用于单节锂离子电池充电管理


PMC-APN002 过电压保护应用需知,IO 输入电压高过 VDD 或低于 GND,都可能造成应广单片机损伤,或是因内部电流引发单片机不正常工作

PMC-APN002 过电压保护应用需知,IO 输入电压高过 VDD 或低于 GND,都可能造成应广单片机损伤,或是因内部电流引发单片机不正常工作


语音芯片IC_MCU单片机语音方案,使用Arduino和蓝牙DIY语音控制家庭自动化案例,用语音命令无线控制家用电器和灯光

语音芯片IC_MCU单片机语音方案,使用Arduino和蓝牙DIY语音控制家庭自动化案例,用语音命令无线控制家用电器和灯光


PMS154C单片机8位PWM计数器/比较器使用,选择 PA3 为负输入和 Vinternal R 为正输入,Vinternal R 的电压为(18/32)*VDD,AC 阻容降压供电

PMS154C单片机8位PWM计数器/比较器使用,选择 PA3 为负输入和 Vinternal R 为正输入,Vinternal R 的电压为(18/32)*VDD,AC 阻容降压供电


语音控制IC应广单片机(MCU)如何设计声控灯应用解决方案?将介绍设计过程中的关键阶段,包括组件选择、电路设计、电源、编程和测试

语音控制IC应广单片机(MCU)如何设计声控灯应用解决方案?将介绍设计过程中的关键阶段,包括组件选择、电路设计、电源、编程和测试


开发实力

专业资深的软硬件开发工程师团队,熟悉行业客户产品硬件技术平台解决方案

全球渠道

为客户提供高性价比的产品和服务,满足客户及时快速的电子生产制造需求

品质保证

专业的测试保证团队,保证每批方案的稳定性,兼容性,和抗干扰性

售后服务

专业的技术服务团队,24小时为客户提供各种软硬件的技术支持和售后服务

服务热线

0755-88364040
18902464556

义隆代理

烧录开发

技术支持

申请样品

扫描微信二维码