MINI- C 語言
1.1 簡介.
1.2 MINI-C 的程序結構.
1.3 預處理
1.4 標示符
1.5 數(shù)據(jù)類型
1.6 常量
1.7 變量
1.8 表達式
1.9 特殊的符號或者符號串.
1.10 指針
2 程序控制語句
2.1 賦值語句
2.2 if 語句
2.3 switch 語句.
2.4 while 語句
3 查表.
4 函數(shù).
5 參考程序范例.
1 MINI- C 語言
1.1 簡介
臺灣科技的 MINI-C 編譯器基本上是構建于 ANSI C,但受限于應廣單片機的硬件結構,因此只能支持部
分的 ANSI C。并根據(jù)應廣單片機的硬件結構,擴展了一些語法,以提高編譯效率及節(jié)省程序空間。
1.2 MINI-C 的程序結構
MINI-C 語言程序由語句、注釋和預處理指令組合而成的。
語句
語句由變量、常量、運算符和函數(shù)共同組成,以分號作為結束符。主要是執(zhí)行以下的動作:
宣告數(shù)據(jù)變量與數(shù)據(jù)結構
定義數(shù)據(jù)空間
執(zhí)行算術與邏輯運算
執(zhí)行程序的控制動作
一行程序可以包含多個語句;復合語句由一個或多個被包含在一對大括號內的語句組成,并且可以將其當
單一語句來使用。
源程序必須定義主函數(shù) fppa0。工程可能不只一個源程序文件,但只有一個源程序文件中可以定義主函數(shù)
fppa0。
應廣早期的產(chǎn)品具有雙核和 8 核,如果采用雙核,程序中還可以有第二個程序指針所指的一套程序 fppa1;
如果采用 8 核,則還可以有 fppa2,fppa3....,fppa7 等。
注釋
注釋一般是在文件中解釋源程序語句的意義與作用來提供程序的可讀性。注釋不可以嵌套。
行注釋符[ // ],開始于//直至此行結束。
塊注釋符[ /*…*/ ],開始于/*結束于*/。
1.3 預處理指令
1)文件包含
語法:
#include “filename”
說明:
用雙撇號時,系統(tǒng)先在用戶當前工程目錄中尋找要包含的文件,該文件可以是用戶頭文件或者 C 程序文件,
或者用戶私密庫文件 .在應廣單片機開發(fā)中,各類型的單片機所使用的的寄存器定義頭文件,會被系統(tǒng)根
據(jù)用戶選擇的單片機型號自動載入,不需要用戶在單獨使用“#include”來載入。
2)宏定義
#define 標識符 value
其中 value 可以是數(shù)值或者語句。注意#define 不能用來定義 IO 名稱。
一般用#define 來定義常數(shù)或者宏名是可以的。
比如定義常數(shù):
#define C_AD_PB0 0 //定義 AD 通道 PB0 為數(shù)據(jù) 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 循環(huán),此處是數(shù)據(jù)表
{
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. 函數(shù):
MINI-C 支持的所有函數(shù)都是不帶參數(shù)傳遞的,所有的參數(shù)傳遞都需要通過全局變量或者
累加器 A,功能相同匯編的子程序,只是采用了 C 的架構編寫。
函數(shù)的聲明:void 函數(shù)名(void);或者 extern void 函數(shù)名(void);
函數(shù)的調用:函數(shù)名();
5. 參考程序范例:
本程序是一個關于自行車用燈的,有一個按鍵控制 5 個 LED,一組 2 個 LED,一組 3 個 LED
通過按鍵來改變自行車燈的亮燈模式:
//功能說明:
//1.平常 OFF 狀態(tài);
//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 亮度調節(jié)
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 狀態(tài);
//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
}