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
}