盛群半導體股份有限公司
HOLTEK SEMICONDUCTOR INC C50 微電腦工具事業處部 文 件 編 號 撰 寫 人 : 版 別 1.20 日 期 2008/5/26 第 11 頁 共 189 頁
4.2 開始用 C 語言設計一個程式
依照下列步驟? 使用 C 語言實作一個簡單的應用程式
4.2.1 定義主函式 main
範例
void main(void) { }
在 C 語言中, 主函式 main 是程式執行的起點, 有如組合語言程式中的 start
ORG 00 jmp start :
void 是資料型態, main 與 void 皆是保留字, 必須用此字, 小寫字母
4.2.2 將標頭檔引入 (include a header file)
範例
#include “ht46r63.h” void main(void) { }
標頭檔 ht46r63.h 中定義許多與微控制器有關的變數及文字符號(symbol). 接下來寫程 式時可以使用這些變數與文字符號(symbol), 好處是寫程式或維護程式時會很容易了解 程式的功能, 增加程式的易讀性. 例如
unsigned char _pa
@0x12 ;
定義 _pa 是一個 unsigned char 型態的變數, 它的位址在 RAM 的 0x12 (就是A埠, port A). 所以程式中如下的敘述
_pa = 0 ;
則與組合語言的 CLR PA ; (PA=[12H]) 有相同的功能
// 引入標頭檔 ht46r63.h
start
盛群半導體股份有限公司
HOLTEK SEMICONDUCTOR INC C50 微電腦工具事業處部 文 件 編 號 撰 寫 人 : 版 別 1.20 日 期 2008/5/26 第 12 頁 共 189 頁
4.2.3 定義文字符號及變數
在程式中使用文字符號能夠更容易的讀懂程式及修改, 例如定義文字符號 _pa0 如下
#define _pa0 _12_0
表示 _pa0 是 RAM 位址 12H 的位元 0 (bit 0), 就是 A 埠的位元 0. 下列敘述
_pa0 = 1 ;
表示將 A 埠的位元 0 設為 1, 與組合語言程式的 SET [12H].0 有相同的功能
前置處理指令 #define 是定義一個文字符號代表數值, 或是文字串, 或是巨集指令. C 編譯器的前置處理器 (preprocessor) 在編譯前, 會先替換這些定義的文字符號. 前置處理指令 #undef 是將先前定義過的文字符號取消, 變成無效. 詳細的說明請參閱 第 4.9 節
微控制器中其他暫存器的變數或文字符號, 皆定義於對應之微控制器的標頭檔案內, 在設計程式時可參考之. 可以定義一些程式需要, 但是在標頭檔案中沒有定義的變數或 文字符號, 方便程式的開發及維護, 例如 #include #define #define #define #define
“ht48R50A-1.h”
// SCL (時鐘線) 接到 MCU 的 A 埠的第 3 位元 scl _pa3
scl_c _13_3 // A 埠之控制暫存器的第 3 位元 (bit 型變數)
// SDA (資料線) 接到 MCU 的 A 埠的第 1 位元 sda _pa1
sda_c _13_1 // A 埠之控制暫存器的第 1 位元
void main(void)
{ }
定義四個文字符號 scl, scl_c, sda, sda_c 分別代表不同的輸出/輸入埠
定義變數會佔用 RAM/ROM 的空間, 如果又指定位址, 則此變數佔用此位址, 否則 Linker 在做連結時才會分派位址給變數. 其效果有如組合語言的
_pa
DB
?
定義文字符號的效果則與組合語言的 EQU 相同, 例如
#define scl _pa3 與 scl EQU _pa3 有相同的效果
盛群半導體股份有限公司
HOLTEK SEMICONDUCTOR INC C50 微電腦工具事業處部 文 件 編 號 撰 寫 人 : 版 別 1.20 日 期 2008/5/26 第 13 頁 共 189 頁
4.2.4 設定微控制器及裝置的初始狀態
根據程式的功能, 設定微控制器中各裝置的初始值, 例如周邊設備的初始狀態, 暫存器 的型態等.
scl_c = 0 ; sda_c = 0 ;
4.2.5 設計子函式
獨立之功能可分別用子函式完成, 在程式的偵錯, 維護及重複使用上皆有好處. 在設計 時需要注意函式的參數,返回值等. 通常會將主函式 main() 放在程式檔的最後, 各個 子函式定義在前面或其他的程式檔案內. 下列範例只是部份, 詳細的說明可參閱 4.6 節.
// 設定 SCL (= PAC) 的狀態為輸出 // 設定 SDA (=PA) 的狀態為輸出
#include “ht48r50a-1.h” #define scl _pa3 #define #define #define
scl_c
// 引入標頭檔
// SCL (時鐘線) 接到 MCU 的 A 埠的第 3 位元
_13_3 // A 埠(位址 0x13)之控制暫存器的第 3 位元 (bit 型變數)
// SDA (資料線) 接到 MCU 的 A 埠的第 1 位元 // A 埠 (位址 0x13)之控制暫存器的第 1 位元 子函式
sda _pa1 sda_c _13_1
// 函式 : StartCondition() // 功能 : 開始一個命令 // 輸入 : 無 // 輸出 : 無
void StartCondition(void) {
sda = 1 ; // SDA 輸出 high scl = 1 ; // SCL 拉 high sda = 0 ; // SDA 輸出 low scl = 0 ; // 完成 Start of command }
// 函式 : StopCondition() // 功能 : 結束先前的命令 // 輸入 : 無 // 輸出 : 無
void StopCondition(void) {
盛群半導體股份有限公司
HOLTEK SEMICONDUCTOR INC C50 微電腦工具事業處部 文 件 編 號 撰 寫 人 : 版 別 1.20 日 期 2008/5/26 第 14 頁 共 189 頁
}
// 函式 : main() // 功能 : 主函式 // 輸入 : 無 // 輸出 : 無
void main (void) {
unsigned char Rdata, type ;
// 暫存器的初始設定
scl_c = sda_c = 0 ; // 將 A 埠的位元 1, 3 設為輸出型態 (SCL, SDA 為輸出) StartCondition() ; // 呼叫子函式 …… }
4.2.6 設計中斷服務函式
針對有硬體中斷的微控制器, 需要設計中斷服務函式以處理中斷事件 定義周邊裝置的中斷服務函式 (Interrupt Service Routine, ISR) 如下格式
#pragma vector ISR_tmr0 @ 0x0c void ISR_tmr0(void) {
tick++ ; }
中斷服務函式必須遵守下列規定 → 返回的資料型態必須是 void → 不能有參數
→ 必須設定中斷向量值 (interrupt vector), 在函式名稱(本例子是 ISR_tmr0之後
加上 @ 及中斷向量值 (本例是 0x0c). 也可使用先前定義好的常數, 例如 #define VECTOR_TMR0 0x0c
#pragma vector ISR_tmr0 @ VECTOR_TMR0 void ISR_tmr0(void) { }
盛群半導體股份有限公司
HOLTEK SEMICONDUCTOR INC C50 微電腦工具事業處部 文 件 編 號 撰 寫 人 : 版 別 1.20 日 期 2008/5/26 第 15 頁 共 189 頁
變數 (variable) 及資料型態 (data type)
程式執行過程中, 可能會需要暫存一些資料, 例如旗標, 執行次數, 延遲秒數等, 因此就必須 定義變數以儲存這些資料. 由於變數要佔用程式記憶體 (PROM) 或資料記憶體(RAM), 因此在使用變數之前, 定義變數的資料型態, 以便讓編譯器正確的編譯程式及配置記憶體 空間. 除了資料型態之外, 還可加入儲存類別 (storage class) 及修飾詞 (qualifier), 對變數做 更詳細的安置.
4.3.1 變數名
變數名的規則
→ 第一個字元必須是英文字母或底線符號 (underscore), 之後可緊接著字母或數字 → 變數名的前 32 個字元有效
→ 變數名內不可有 +, - , *, / , ……等符號字元
→ 英文字母的大小寫是有區別的 (case-sensitive), 例如 count 與 Count 是不同的 變數名
範例, number, total_tick, _tick 是合法的變數名, 而 2num, $dot, line\\n 是非法的變數名
4.3.2 資料型態
Type (資料型態) Size (bits) bit char signed char unsigned char short unsigned short int unsigned int long unsigned long void float 1 8 8 8 16 16 16 16 32 32 0 32 Arithmetic Type unsigned integer signed integer signed integer unsigned integer signed integer unsigned integer signed integer unsigned integer signed integer unsigned integer - real 範圍大小 0, 1 -128 ~ +127 -128 ~ +127 0 ~ 255 -32768 ~ +32767 0 ~ 65535 -32768 ~ +32767 0 ~ 65535 -2147483648 ~ +2147483647 0 ~ 4294967295 - -3.48e-38 ~ 3.48e+38 *
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库合泰单片机C语言教程(3)在线全文阅读。
相关推荐: