Holtek微控制器應(yīng)用范例-使用HoltekC語言_第1頁
Holtek微控制器應(yīng)用范例-使用HoltekC語言_第2頁
Holtek微控制器應(yīng)用范例-使用HoltekC語言_第3頁
Holtek微控制器應(yīng)用范例-使用HoltekC語言_第4頁
已閱讀5頁,還剩143頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第1頁共189頁Holtek微控制器應(yīng)用范例ー使用HoltekC語言目錄第一章內(nèi)容簡介第二章選定HoltekC語言的使用環(huán)境進入HT-IDE3000建立新的專案時,選定HoltekC編譯器已開啟專案后,選用HoltekC編譯器第三章微控制器C語言程式的速成3.!定義主函式main()定義副函式(sub-function)定義全域變數(shù)(globalvariable)3.4定義3.4定義中斷服務(wù)函式(InterruptServiceRoutine:ISRI其他第四章C語言程式C程式架構(gòu)開始用C語言設(shè)計ー個程式定義主函式main將標頭檔引入(includeaheaderfile)定義文字符號及變數(shù)設(shè)定微控制器及裝置的初始狀態(tài)設(shè)計子函式設(shè)計中斷服務(wù)函式變數(shù)(variable)及資料型態(tài)(datatype)變數(shù)名資料型態(tài)變數(shù)的有效范圍(scope)變數(shù)的資料型態(tài)(datatype)盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第2頁共189頁整數(shù)型(integer)浮點型(floatingpoint)bit資料型態(tài)儲存類別(storageclass)與修飾詞(qualifier)儲存類別(storageclass)修飾詞(qualifier)絕對變數(shù)(absolutevariable)常數(shù)(constant)指標(pointer)與陣列(array)指標的運算子&與?陣歹!J(array)結(jié)構(gòu)(struct)與等位(union)結(jié)構(gòu)的運算子?>與.運算子(Operators)運算前的型態(tài)轉(zhuǎn)換程式流程控制(programflowcontrol)if-else敘述switch敘述fbr敘述while敘述do-while敘述goto敘述break與continue敘述函式(Functions)參數(shù)(arguments)返回值(returnvalues)中斷服務(wù)函式(InterruptServiceRoutines)在C語言程式中嵌入組合語言(in-lineassemblycode)從組合語言的程式去存取C語言的物件(變數(shù))前置處理指令(Preprocessor)定義文字符號(#define)盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第3頁共189頁引入檔案(#include)內(nèi)嵌組合語言(inlineassembly)條件式編譯(#if7#endif)編譯器的特殊選項pragmaHoltekC編譯器的內(nèi)建函式(built-infunctions)第五章基本C語言程式語法觀念回圈的應(yīng)用(loop)撰寫MCU應(yīng)用程式的注意事項可供微控制器應(yīng)用程式使用的范本設(shè)計微控制器應(yīng)用程式的小技巧第六章程式范例ー初級LED跑馬燈LED霹靂燈單顆七段顯示器5*5點矩陣LED顯示HT48微控制器控制HT1621LCD的顯示HT48微控制器控制LCD模組的顯示具LCD驅(qū)動功能的微控制器之顯示應(yīng)用程式ーHT46R63顯示器的通用函式ーHT44780LCM鍵盤掃描程式第七章程式范例一中斷函式用時鐘控制LED的亮與滅類比/數(shù)位轉(zhuǎn)換(ADC)的應(yīng)用第八章HT46R52A應(yīng)用於銀氫電池充電器(HA0084T)第九章程式范例ーHT46R74D-1胎壓計(HA0105T)盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第4頁共189頁第一章內(nèi)容簡介盛群半導(dǎo)體公司(Holtek)開發(fā)ー系列的八位元微控制器(micro-controller,MCU).當開發(fā)微控制器的應(yīng)用程式時,除了可使用盛群提供的組合語言(assemblylanguage),也可使用標準的C語言編譯器(Ccompiler).由於八位元微控制器的記憶體空間,不論是程式記憶體(programmemoryspace)或是資料記憶體(rammemoryspace),皆是有限制的,通常會使用組合語言開發(fā)應(yīng)用程式.但是越來越多的微控制器支援更多的記憶體以及更多的功能,使得程式也相對的擴大.如果仍然使用組合語言開發(fā)程式,不但費時費カ,未來在維護及擴增功能的エ作上也相當困難.因此,使用高階程式語言,例如C語言,來開發(fā)應(yīng)用程式就是ー種可行的趨勢.C語言是高階程式語言中的一種,它具有高度的的可讀性及可移植性(portability),除了能夠快速地完成應(yīng)用程式的開發(fā)與偵錯,也很容易移植到其他的微控制器上.當程式需要縮減或擴充功能時,也很容易的完成,因此很適合於微控制器的程式開發(fā).本書主要是以HoltekC語言為主,說明如何使用HoltekC語言撰寫盛群微控制器的應(yīng)用程式,包括C的程式架構(gòu),C語言的一般用法,特殊用法及應(yīng)用范例書中將說明在開發(fā)微控制器的應(yīng)用程式時需要注意的地方及如何撰寫會比較恰當,并配以實例解釋.讀者可以參考修改或直接采用到自己的程式中,再用發(fā)展工具HT-ICE,HT-IDE3000驗證之.第二章介紹選用HoltekC編譯器的步驟,指引HT-IDE3000呼叫HoltekC編譯器去編譯C語言的原始程式.第三章提供ー種快速撰寫C程式的方法,對ANSIC語言熟悉的用者,可於閱讀本章之后即開始撰寫微控制器的C語言程式第四章介紹C語言,未曾使用過C語言的讀者應(yīng)仔細閱讀本章以了解C語言的用法第五章介紹使用C語言寫程式的基本觀念,注意事項及建議的寫作方法第六章到第九章則是應(yīng)用范例,針對盛群各系列的微控制器,以C語言撰寫的應(yīng)用程式.包含有功能說明,應(yīng)用電路及程式說明.盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第5頁共189頁第二章選定HoltekC編譯器的使用環(huán)境進入HT-IDE3000,建立新的專案時,選定HoltekC編譯器進入HT-IDE3000開發(fā)環(huán)境后,依照下列方法建立一個新的專案(project)ー移動滑鼠游標到Project選單,按左鍵ー移動滑鼠游標到New命令,按左鍵—>出現(xiàn)如ド的視窗,在LanguageToo!之處勾選EnhancedHoltekCcompiler/Assembler盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第6頁共189頁已開啟專案后,如何選用HoltekC編譯器若專案(project)已開啟之后,可以點選(click)Option選單下的ProjectSetting命令,在LanguageToo!中點選EnhancedHoltekCCompiler/Assembler以設(shè)定使用HoltekC的Enhance版編譯器Enhance版的Ccompiler包括ehcc32srsc.exe,ehcc32mrsc.exe與ehcc32mrmc.exe三個執(zhí)行檔此版本必須在HT-IDE3000V7.0或以上的系統(tǒng)才能執(zhí)行盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第7頁共189頁第三章微控制器C語言程式的速成本章介紹如何快速撰寫微控制器的C語言應(yīng)用程式.已熟悉ANSIC標準語言的用法或有撰寫的經(jīng)驗者,在閱讀此章后即可開始設(shè)計撰寫微控制器的C應(yīng)用程式,以下各節(jié)是基本的C程式成員,某些是必須要有的,如3.1,其他的則視微控制器的功能及應(yīng)用來決定是否需要3.!定義主函式main()#include"ht46r63.h"voidmain(void){intFlag;TurnOn_LCD();Flag=LCDdisplay(cstr);TurnOfCLCD();}…主函式的返回資料型態(tài)(returntype)必須是void,而且不能有參數(shù)檔案ht46r63.h定義與微控制器有關(guān)的常數(shù),例如暫存器的位址定義,將之引入(include)可增加程式的可讀性.定義副函式(sub-function)視程式的大小及功能決定是否需要定義副函式.基本上,主函式應(yīng)將應(yīng)用程式的架構(gòu)做成模組化,不需要將所有的程式皆放在主函式中.為了能很快的完成及了解應(yīng)用程式,主函式中只需要包含(呼叫)定義各功能的副函式即可,無論在設(shè)計或維護程式時皆能很快的進入與完成.例如,關(guān)於LCD的開啟,顯示及關(guān)閉等功能就可分別定義為單獨的副函式,如下例.任何其他的函式或其他的應(yīng)用專案都可去呼叫這些副函式.若設(shè)計成通用型的,也可藉由程式館管理器(LibraryManager)將之建入程式館檔案,以供其他應(yīng)用專案使用.盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第8頁共189頁voidTumOnLCD(void){-}intLCDdisplay(char*cstr)}voidTumOff^LCD(void)()定義全域變數(shù)(globalvariable)程式在運行中會需要一些變數(shù)做為資料存放的地方,由於微控制器資料記憶體大小的限制及C編譯器的設(shè)計,最好將常需使用的變數(shù)定義為全域型的變數(shù),在編譯程式的大小與執(zhí)行上皆較佳.例如定義常數(shù)型指標變數(shù)cstr指到字串"Hello!”,則constchar*cstr="Hello!";定義中斷服務(wù)函式(InterruptServiceRoutine:若微控制器的周邊裝置具有中斷功能,程式也需要此中斷機能以完成工

作時,則必須定義此周邊裝置的中斷服務(wù)函式(InterruptServiceRoutine,#pragmavector#pragmavector0\0cvoidtmrO(void)tick++;中斷服務(wù)函式必須遵守下列規(guī)定ー返回的資料型態(tài)必須是voidー不能有參數(shù)(必須為void)t必須使用前置處理指令#pragmavector設(shè)定中斷向量值(interruptvector),在函式名稱(本例子是IS]tmrO)之后加上@及中斷向量(本例子是IS]tmrO)之后加上@及中斷向量值(本例是.也可使用先前定義好的常數(shù),例如盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第9頁共189頁#defineVECTORTMROTO!#pragmavector11^3tmrO@(SECTORTMROvoid直2_tmr0(void)其他上述的主函式,副函式及中斷服務(wù)函式不需要定義在同一個原始程式檔案內(nèi).為縮短編譯的時間,最好是分別定義在不同的檔案中,并使用有意義的檔名,方便日后找尋所要的函式.盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第10頁共189頁第四章C程式語言基本上,HoltekC是仿ANSI(美國國家標準局)標準的C語言,為配合盛群八位元微控制器的架構(gòu),將提供ー些特殊的語法去存取或控制微控制器的資源.另外,本章會從八位元微控制器的角度,說明如何使用C語言設(shè)計及撰寫微控制器的應(yīng)用程式C程式架構(gòu)C語言的程式是由敘述(statements)所組成,每個敘述的最后必須有分號做為結(jié)束符號.敘述分為四類:—?宣告(declaration),宣告變數(shù)及資料型態(tài),資料結(jié)構(gòu).例如charflag,tickcnt;//宣告變數(shù)flag與tickcnt為char型態(tài)一定義(definition),定義變數(shù)數(shù)值及位址例如inttotal=10;//定義變數(shù)total,設(shè)定值為10ー描述式(expression),執(zhí)行數(shù)學(xué)及邏輯運算,控制程式的流程例如count=(input>10)10:input;—?函式呼叫(function),執(zhí)行函式的功能例如putchar(ch);/Z寫出ー個字元到輸出口每個敘述可以附加注解做說明.C編譯器不會對注解做編譯,下列為兩種可被接受的注解一介於符號Z?與符號?/之間的數(shù)據(jù)及文字,包括換行字I\n'如果/?與?/不在同一行,則其間所有的行皆會被視為注解例如/*thisisacomment1*/ー從符號〃開始到本行的結(jié)束皆被視為注解例如〃這是注解的新寫法在C語言中,程式執(zhí)行區(qū)(programblock)是以函式的格式定義,因此,所有要執(zhí)行的敘述皆需定義(包含)於某個函式(function)中,例如描述式.盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第11頁共189頁開始用C語言設(shè)計ー個程式依照下列步驟使用C語言實作一個簡單的應(yīng)用程式定義主函式mainvoidmain(void)在C語言中,主函式main是程式執(zhí)行的起點,有如組合語言程式中的startORG00jmpstartstart:void是資料型態(tài),main與void皆是保留字,必須用此字,小寫字母將標頭檔引入(includeaheaderfile)范例#include"ht46r63.h"/Z引入標頭檔ht46r63.hvoidmain(void)()標頭檔ht46r63.h中定義許多與微控制器有關(guān)的變數(shù)及文字符號(symbol).接下來寫程式時可以使用這些變數(shù)與文字符號(symbol),好處是寫程式或維護程式時會很容易了解程式的功能,增加程式的易讀性.例如unsignedcharjpa@0x12;定義_pa是ー個unsignedchar型態(tài)的變數(shù),它的位址在RAM的0x12(就是A埠,portA),所以程式中如下的敘述_pa=0;則與組合語言的CLRPA;(PA=[12H])有相同的功能盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第12頁共189頁定義文字符號及變數(shù)在程式中使用文字符號能夠更容易的讀懂程式及修改,例如定義文字符號_pa0如ド#define_pa0120表示_pa0是RAM位址12H的位元〇(bit0),就是A埠的位元0.下列敘述_paO=1;表示將A埠的位元0設(shè)為!,與組合語言程式的SET[12H].O有相同的功能前置處理指令#define是定義ー個文字符號代表數(shù)值,或是文字串,或是巨集指令.C編譯器的前置處理器(preprocessor)在編譯前,會先替換這些定義的文字符號.前置處理指令#undef是將先前定義過的文字符號取消,變成無效.詳細的說明請參閱第4.9節(jié)微控制器中其他暫存器的變數(shù)或文字符號,皆定義於對應(yīng)之微控制器的標頭檔案內(nèi),在設(shè)計程式時可參考之.可以定義ー些程式需要,但是在標頭檔案中沒有定義的變數(shù)或文字符號,方便程式的開發(fā)及維護,例如/include"ht48R50A-l.h"definescl_pa3//SCL(時鐘線)接到MCU的A埠的第3位元definescl_c_13_3//A埠之控制暫存器的第3位元(bit型變數(shù))definesda_pal〃SDA(資料線)接到MCU的A埠的第1位元definesdac」3」〃A埠之控制暫存器的第1位元voidmain(void)()定義四個文字符號scl,scl_c,sda,sda_c分別代表不同的輸出/輸入埠定義變數(shù)會占用RAM/ROM的空間,如果又指定位址,則此變數(shù)占用此位址,否則Linker在做連結(jié)時オ會分派位址給變數(shù).其效果有如組合語言的_paDB定義文字符號的效果則與組合語言的EQU相同,例如definesclpa3與sclEQU_pa3有相同的效果盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第13頁共189頁設(shè)定微控制器及裝置的初始狀態(tài)根據(jù)程式的功能,設(shè)定微控制器中各裝置的初始值,例如周邊設(shè)備的初始狀態(tài),暫存器的型態(tài)等.scl_c=0;//設(shè)定SCL(=PAC)的狀態(tài)為輸出sda_c=0;//設(shè)定SDA(=PA)的狀態(tài)為輸出設(shè)計子函式獨立之功能可分別用子函式完成,在程式的偵錯,維護及重復(fù)使用上皆有好處.在設(shè)計時需要注意函式的參數(shù),返回值等.通常會將主函式main()放在程式檔的最后,各個子函式定義在前面或其他的程式檔案內(nèi).下列范例只是部份,詳細的說明可參閱4.6節(jié).#include"ht48r50a-l.h"/Z引入標頭檔definescl_pa3//SCL(時鐘線)接到MCU的A埠的第3位元#definescl_c」3_3//A埠(位址0x13)之控制暫存器的第3位元(bit型變數(shù))definesda_pal〃SDA(資料線)接到MCU的A埠的第1位元definesdac_13_1〃A埠(位址0x13)之控制暫存器的第1位元〃函式:StartCondition()子函式/Z功能:開始ー個命令/Z輸入:無/Z輸出:無voidStartCondition(void)sda=1;//SDA輸出highscl=1;//SCL拉h(huán)ighsda=0;//SDA輸出lowscl=0;11完成Startofcommand}〃函式:StopCondition()/Z功能:結(jié)束先前的命令/Z輸入:無〃輸出:無voidStopCondition(void)(盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第14頁共189頁)〃函式:main()//功能:主函式/Z輸入:無〃輸出:無voidmain(void)(unsignedcharRdata,type;/Z暫存器的初始設(shè)定scl_c=sda_c=0;//將A埠的位元1,3設(shè)為輸出型態(tài)(SCL,SDA為輸出)StartCondition();/Z呼叫子函式

4.2.6設(shè)計中斷服務(wù)函式針對有硬體中斷的微控制器,需要設(shè)計中斷服務(wù)函式以處理中斷事件ISRI定義周邊裝置的中斷服務(wù)函式(InterruptServiceRoutine,程式執(zhí)行過程中,可能會需要暫存ー些資料,例如旗標,執(zhí)行次數(shù),延遲秒數(shù)等,因此就必須ISRI#prajnnavectorISvoid直2_tmr0(void)l3_tmr0@0\(lctick++;中斷服務(wù)函式必須遵守下列規(guī)定ー返回的資料型態(tài)必須是voidー不能有參數(shù)ー必須設(shè)定中斷向量值(interrupt#prajnnavectorISvoid直2_tmr0(void)l3_tmr0@0\(lctick++;中斷服務(wù)函式必須遵守下列規(guī)定ー返回的資料型態(tài)必須是voidー不能有參數(shù)ー必須設(shè)定中斷向量值(interruptvector),在函式名稱(本例子是直エtmrO之后加上@及中斷向量值(本例是園2).也可使用先前定義好的常數(shù),#defineRectortmroHEvectoriTOtmrO@yECTORTMRO#pragmavoidtmrO(void))盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第15頁共189頁4.3變數(shù)(variable)及資料型態(tài)(datatype)定義變數(shù)以儲存這些資料.由於變數(shù)要占用程式記憶體(PROM)或資料記憶體(RAM),因此在使用變數(shù)之前,定義變數(shù)的資料型態(tài),以便讓編譯器正確的編譯程式及配置記憶體空間.除了資料型態(tài)之外,還可加入儲存類別(storageclass)及修飾詞(qualifier),對變數(shù)做更詳細的安置.變數(shù)名變數(shù)名的規(guī)則ー第一個字元必須是英文字母或底線符號(underscore),之后可緊接著字母或數(shù)字—>變數(shù)名的前32個字元有效ー變數(shù)名內(nèi)不可有……等符號字元—?英文字母的大小寫是有區(qū)別的(case-sensitive),例如count與Count是不同的變數(shù)名范例,number,totaltick,tick是合法的變數(shù)名,而2num,$dot,line\n是非法的變數(shù)名資料型態(tài)Type(資料型態(tài))Size(bits)ArithmeticType范圍大小bit1unsignedinteger0,1char8signedinteger-128~+127signedchar8signedinteger-128~+127unsignedchar8unsignedinteger0~255short16signedinteger-32768?+32767unsignedshort16unsignedinteger0?65535int16signedinteger-32768?+32767unsignedint16unsignedinteger0?65535long32signedinteger-2147483648?+2147483647unsignedlong32unsignedinteger0~4294967295void0--float32real-3.48e-38?3.48e+38*盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第16頁共189頁double32real-3.48e-38?3.48e+38**float,double皆使用!EEE75432位元的格式4.3.3變數(shù)的有效范圍(scope)根據(jù)變數(shù)定義的所在決定此變數(shù)的有效范圍.可分為—?區(qū)域變數(shù)(localvariable)定義在程式區(qū)塊內(nèi)(programbloek,例如函式)的變數(shù)皆是區(qū)域變數(shù).只有當此程式區(qū)塊被執(zhí)行時,區(qū)域變數(shù)才會有效,而在執(zhí)行完畢并離開此程式區(qū)塊后,這些區(qū)域變數(shù)將無效.程式區(qū)塊是指包含在左右大括號,{,及,}1之間的敘述行定義在函式中的static變數(shù)則是全域變數(shù),參考4.3.2說明—>全域變數(shù)(globalvariable)定義在所有函式之外的變數(shù)為全域變數(shù).當程式在執(zhí)行時,此變數(shù)皆有效,任何函式都可以存取或修改這個變數(shù)范例#include"ht48r50a-l.h"unsignedcharflag;/Z全域變數(shù)voidmain(void){chartype;//區(qū)域變數(shù),只有在此函式被執(zhí)行時オ有效staticstatus=0;//static變數(shù),只在第一次執(zhí)行時設(shè)為04.3.4變數(shù)的資料型態(tài)(datatype)當宣告變數(shù)時,必須指定它的資料型態(tài),以告知編譯器此變數(shù)所需記憶體的大小.資料型態(tài)分為整數(shù)型(integertype)及浮點數(shù)型(floatingpointtype).整數(shù)型又可區(qū)分為有正負號(signed)及無正負號(unsigned).整數(shù)型(integer)—>char占用ー個位元組(byte)的記憶體空間.如加上signed則表示有正負號,其大小盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第17頁共189頁范圍是?128到127.若加上unsigned,則表示沒有正負號,其大小范圍是〇到255.如果沒有signed或unsigned,則被視為signed.可用此型態(tài)定義字元,如A,d,$,3等—>short占用兩個位元組(2bytes)的記憶體空間,如加上signed則表示有正負號,其大小范圍是?32768到32767.若加上unsigned,則表示沒有正負號,其大小范圍是〇到65535.如果沒有signed或unsigned,則被視為signed.HoltekC采用little-endian格式,就是變數(shù)的低位元組(leastsignificantbyte)仔放在記憶體的低位址.例如變數(shù)count=0x1234是存放於記憶體40H的位址,則低位元組的數(shù)值0x34存放於位址40H,高位元數(shù)值0x12存放於位址41H.—int與short型態(tài)相同—>long占用四個位元組(4bytes)的記憶體空間,如加上signed則表示有正負號,其大小范圍是ー2147483648到2147483647.若加上unsigned,則表示沒有正負號,其大小范圍是0到4294967295.如果沒有signed或unsignedi則被視為signed在!ittle-endian格式中,32位元的變數(shù),則是先存低字元(leastsignificantword)的低位元組(leastsignificantbyte)到記憶體的低位址,再存放低字元的高位元組(highbyte),再存放高字元(highword)的低位元組,最后才是高字元的高位元組浮點型(floatingpoint)HoltekC支援!EEE75432位元的格式.包括float及double兩個資料型態(tài),浮點數(shù)值是以下表的格式儲存在記憶體signbiasedexponentmantissaIEEE75432bitxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx與浮點數(shù)值的關(guān)系式為number=(-l)signx2(exponent-127)x1.mantissa例如,浮點數(shù)為2.77000e+37在儲存到記憶體時換成7DA6B69B共占32位元盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第18頁共189頁bit資料型態(tài)類似整數(shù)型,但是只有0或1兩個值,所以只會取整數(shù)的最低位值(LSB:leastsignificantbit)需要注意ド列用法一bit型態(tài)不可與autoー起使用,bit型態(tài)的變數(shù)不可當函式的參數(shù),不可用於指標(pointer)的數(shù)據(jù)型態(tài),不可設(shè)定靜態(tài)初始值(static)一bit型態(tài)可以設(shè)為函式的返回型態(tài),它是存於累加器(accumulator)的相對位置ー程式開始執(zhí)行時,不會設(shè)定bit型變數(shù)的初始值,因此程式必須自行設(shè)定初始值一以下是合法的使用方式staticbitinitflag;/Z定義於函式內(nèi)則被視為區(qū)域變數(shù)bittoggleflag;ー范例intdata=0x54;bitflag;flag=data;則flag=0(取data的LSB)如果微控制器具有一個以上的RAMbank,例如HT46R63,在定義bit型態(tài)的變數(shù)時需要使用前置處理指令#pragmarambankO指定在RAMbank0,如下#pragmarambankObitflag;#pragmanorambank記憶體儲存值signBiasedexponent1.mantissa十進位數(shù)值32bit7DA6B69Bh011111011b(=251)1.0100110101101101001101b(=1.302447676659)2.77000e+37盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第19頁共189頁儲存類別(storageclass)與修飾詞(qualifier)儲存類別(storageclass)auto,register,static,extern修飾詞(qualifier)const,volatile,persistent指定詞(specifier)typedef變數(shù)於宣告或定義時必須指定其資料型態(tài),但是儲存類別及修飾詞是可選擇的,可根據(jù)應(yīng)用時的需要去設(shè)定或不使用.儲存類別(storageclass)儲存類別與區(qū)域變數(shù)(localvariable)及全域變數(shù)(globalvariable)有關(guān).ー儲存類別autoauto是給區(qū)域變數(shù)使用的,沒有指定儲存類別的區(qū)域變數(shù)皆是auto寫與不寫auto都是相同效力.區(qū)域變數(shù)是存放在RAMbank0的空間ー儲存類別registerregister與auto類似,是給區(qū)域變數(shù)用的,當變數(shù)的存取很頻繁時,可將之設(shè)為register,C編譯器會使用暫存器而非資料記憶體空間來存放此變數(shù),如此可增加存取的速度及減少編碼.目前并未實做此功能.ー儲存類別staticstatic的變數(shù)會一直有效到整個程式結(jié)束后オ失效.它的初始值只會在程式開始執(zhí)行時被設(shè)定一次.雖然static的變數(shù)在程式結(jié)束前皆有效,但是定義在函式內(nèi)的static變數(shù)仍然是區(qū)域變數(shù),必須要在它所定義的函式中オ可以讀寫ー儲存類別externextern通知C編譯器此變數(shù)是定義在其他的程式檔內(nèi),需要經(jīng)由連結(jié)器(Linker)連結(jié)定義此變數(shù)的檔案后,才知道變數(shù)的所在.以目前在微控制器的應(yīng)用程式上,比較需要使用extern,其他三種不具特別的優(yōu)勢可用定義全域變數(shù)(globalvariabl)的方式即可達到相同效果.建議不要使用.修飾詞(qualifier)一修飾詞constC編譯器會將const的變數(shù)放置於程式記憶體(PROM).在定義const變數(shù)時,必須要設(shè)定其值,而程式在執(zhí)行中不能修改此變數(shù)的值盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第20頁共189頁—>修飾詞constant這個修飾詞是HoltekC編譯器特別提供的.它會將constant的變數(shù)放置於程式記憶體(PROM)的最后ー頁(lastpage).定義constant變數(shù)時,必須要設(shè)定其值,而程式在執(zhí)行中不能修改此變數(shù)的值.使用此修飾詞要注意下列三點?只能使用在int或unsignedint的資料型態(tài)?設(shè)定值必須配合微控制器程式記憶體的寬度,例如,若使用在HT48R50A-1時,因為此微控制器的寬度為!5個位元,最高位元是無效的,所以0x9A會被C編譯器改成OxlA.最高位元,位元15被清除為〇?所有設(shè)定此修飾詞的變數(shù)或陣列,總共占用的字位元組(word)不可超過256個指定詞(specifier)t指定詞typedeftypedef是針對資料型態(tài)做新名稱的宣告,不是宣告資料型態(tài)的新變數(shù),而是宣告ー個新的名字.例如將UCHAR(新名字)宣告為unsignedchar的資料型態(tài),可使用typedefunsignedcharUCHAR;//UCHAR為unsignedchar的新名字UCHARcount;/Z變數(shù)count的資料型態(tài)為unsignedchar/Z等同於unsignedcharcount;使用typedef宣告資料型態(tài)的新名字可以讓程式的可讀性更高,更易了解.例如,typedefunsignedintWORD;/Z使用WORD代表unsignedint,16bitstypedefunsignedlongDWORD;//DWORD代表32bit的doubleword絕對變數(shù)(absolutevariable)可以將全域變數(shù)或static變數(shù)指定一個固定的記憶體的位址,例如unsignedcharPortA@0x12;在變數(shù)名的后面再加上及位址C編譯器在編譯時會將程式中出現(xiàn)絕對變數(shù)的程式改為此位址,但并未在記憶體中保留位置給此變數(shù),所以從連結(jié)器(Linker)產(chǎn)出的對映檔(mapfile)中找不到此變數(shù)C編譯器會將之翻成組合語言的EQU指令,如下盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第21頁共189頁PortAEQU12h此種用法主要是對微控制器內(nèi)的暫存器做定義,方便閱讀程式常數(shù)(constant)整數(shù)型常數(shù)(integralconstant)可使用基底(radix)格式表示之.Radix(進位制)常數(shù)格式范例二進缶リObnumber或OBnumberOblOl11110ハ進制0number0276十進制number190十六進制Oxnumber或OXnumberOxBE若常數(shù)的最后一字為1或L,則表示它使用signedlong或unsignedlong的型態(tài).字尾是u或U,則表示常數(shù)為unsigned型態(tài).浮點型(floatingpoint)常數(shù)的型態(tài)是double,若它的字尾是f或F,則是float.字元常數(shù)(characterconstant)必須以單引號,,框住,例如,a'字串常數(shù)(stringconstant)必須以雙引號”"框起,例如"Hello!".字串常數(shù)的定義會影響它所儲存的記憶體位址,如下char*cp="one";//C編譯器會發(fā)出錯誤constchar*sptr="Hell〇";〃"Hello"儲存在程式記憶體(PROM)常數(shù)型的變數(shù)或陣列(array)必須要設(shè)定其值,否則C編譯器會發(fā)出錯誤訊息,如上例指標(pointer)與陣列(array)指標本身是ー個變數(shù),它的內(nèi)容是另ー個變數(shù)存放的位址,類似組合語言的間接定址.在使用上,指標必須要指到ー個已定義(存放於記憶體)的變數(shù),否則在程式執(zhí)行時會發(fā)生錯誤.指標的宣告格式資料型態(tài)?指標名[,?指標名資料型態(tài)是這個指標所指的變數(shù)的資料型態(tài),例如char,指標名類似變數(shù)名,可以在ー行中,宣告指向相同資料型態(tài)的不同指標名,例如char*tptr,*array_ptr;int*line_ptr;盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第22頁共189頁以上只是宣告指標變數(shù),必須要將這些指標指向已定義的變數(shù)才能使用指標的運算子&與?運算子&如果緊鄰在變數(shù)的前面,例如&line,則是代表取得此變數(shù)的記憶體位址例如,intline"/定義變數(shù)int*line_ptr;1!宣告指標line=12;line_ptr=&line;若變數(shù)line被安置於RAM的位址64,則指標!ine_ptr等於64運算子?緊鄰指標變數(shù)之前是表示取得這個指標指到的變數(shù)的內(nèi)容,承上例,inttotal;II定義變數(shù)total=*line_ptr;//取得指標!ine_ptr所指到的變數(shù)line的內(nèi)容則變數(shù)tota!等於12指標的大小會根據(jù)微控制器具有之記憶體空間大小而定,如果微控制器具有一個以上的RAMbank,則指標本身會使用兩個位元組來儲存被指到的變數(shù)的位址如果變數(shù)有const或constant修飾詞,則是指向程式記憶體(PROM),而且此變數(shù)的內(nèi)容不能被修改如果所指向的變數(shù)不具有const或constant,則指標會指向資料記憶體(datamemory,RAM)內(nèi)的變數(shù).陣列(array)陣列是由相同資料型態(tài)的元素組成的,例如chararray_name[32];是由32個char型態(tài)的元素組成的,這些元素的名字是以陣列名array_name為準,而以索引(index)區(qū)分各個元素,例如array_name[3]是第4個元素.陣列的索引是正整數(shù),從〇開始直到元素的總個數(shù)減ー,上例中,最后一個元素是array_name[31].這種資料型態(tài)在建表格(table)時非常有用陣列也可當做指標的一種,只是使用時格式不同,下列范例說明指標與陣列之間的盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第23頁共189頁使用方法char*nptr,*fptr;/Z宣告指標charch,tbl;/Z定義變數(shù)chartable[5]={'a','b',で,d,七’};〃定義陣列nptr=table;//指標nptr指到陣列table的第一個元素table[O]ch=*nptr;//將字元宜存入變數(shù)chtbl=table[O];/Z將字元,a,存入變數(shù)tbl,所以變數(shù)ch與變數(shù)tbl的內(nèi)容相同fptr=&table[4];//指標fptr指到陣列table的第5個元素,table[4]ch=*fptr;//將字元,e'(第5個元素)存入變數(shù)ch內(nèi)tbl=*(nptr+4);〃nptr指到陣列table的第一個元素,加4,所以tbl='e'結(jié)構(gòu)(struct)與等位(union)結(jié)構(gòu)是ー個或多個成員的集合,每個成員的資料型態(tài)可以不同,并且使用結(jié)構(gòu)的名字去讀寫這些成員.結(jié)構(gòu)的宣告是等同於定義ー個新的資料型態(tài),當變數(shù)宣告為ー個結(jié)構(gòu)的型態(tài)時,便可用結(jié)構(gòu)的名字去讀寫各成員的內(nèi)容.成員的資料型態(tài)不可以使用bit型態(tài),但是可以用bit-field方式宣告成員的型態(tài),例如structstrname{unsignedflag:1;/Z此成員放於最低位元leastsignificantbitunsignednoused:7;unsignedstack:5;/Z此成員置於最高位元highbits}usage;每個bitfield會置放於16位元的單位內(nèi),不會橫跨兩個16位元的單位等位(union)的格式與結(jié)構(gòu)相同,唯一不同的是記憶體空間的分配方式.等位是安排共用的空間來存放不同資料型態(tài)的成員.每個成員必須要宣告其資料型態(tài),而等位的大小則是所有成員中占用最大位元組(bytes)的型態(tài)大小.每個成員的開始位址皆相同,就是等位的位址.unionunion_name{charnumbyte;/Z占用1個位元組盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第24頁共189頁intnumint;〃占用2個位元組longnumlong;1I占用4個位元組}number;等位number的大小為4個位元組結(jié)構(gòu)與等位的型態(tài)也可使用修飾詞(qualfer),例如const,其效果與一般的資料型態(tài)相同.結(jié)構(gòu)的運算子?>與.指標所指變數(shù)的資料型態(tài)若是結(jié)構(gòu)或等位,可使用右箭頭運算子去讀寫其成員.也可以使用此變數(shù)名以及句點(dot.)去讀寫成員變數(shù)范例:structtag{charflag;intnumber;unsignedac:1;unsignedz:1;};structtagstatus;//定義變數(shù)status是結(jié)構(gòu)tag的資料型態(tài)structtag*sptr;//宣告指標sptr為結(jié)構(gòu)tag的資料型態(tài)bitvac,pac;//定義變數(shù)vac,pac是bit的資料型態(tài)status.flag=1;〃寫1到結(jié)構(gòu)的成員flagstatus.ac=1;〃寫1到結(jié)構(gòu)成員acvac=status.ac;//vac=1sptr=&status;//指標sptr指到結(jié)構(gòu)statuspac=sptr->ac;//pac=14.4運算子(Operators)運算子是針對變數(shù)所存的數(shù)據(jù)加以運算的符號,運算式(expression)是運算子,數(shù)據(jù),變數(shù),盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第25頁共189頁函式及運算式的組合表示式.有下列的運算子ー數(shù)學(xué)運算子(arithmeticoperators)+,-,*,/,%分別為加法,減法,乘法,除法,余數(shù)運算子?比牧運算ナ(comparisonoperators)將兩個運算元做比較,回傳比較后的結(jié)果為真(非零)或假(零)>大於>=大於或等於<小於>向右移位元?向左移位元ー算式設(shè)定運算元(assignmentoperators)+=;變數(shù)加上expr的值,將結(jié)果存入變數(shù)=;變數(shù)減去expr的值,將結(jié)果存入變數(shù)=;變數(shù)乘以expr的值,將結(jié)果存入變數(shù)/=;變數(shù)除以expr的值,將商數(shù)存入變數(shù)%=;變數(shù)除以expr的值,將余數(shù)存入變數(shù)&=;變數(shù)與expr的值做位元AND,將結(jié)果存入變數(shù)盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第26頁共189頁|=;變數(shù)與expr的值做位元OR,將結(jié)果存入變數(shù)A=;變數(shù)與expr的值做位元XOR,將結(jié)果存入變數(shù)?=;變數(shù)向右移expr個位元,將結(jié)果存入變數(shù)?=;變數(shù)向左移expr個位元,將結(jié)果存入變數(shù)—?遞增(increment)與遞減(decrement)運算子++變數(shù)先加!,再做運算++先做運算,變數(shù)再加I-變數(shù)先減1,再做運算-先做運算,變數(shù)再減I一條件運算子(conditionaloperator).若運算的結(jié)果為真,則執(zhí)行,否則就執(zhí)行ー運算子的優(yōu)先性(priority)與結(jié)合性(associativity)ー個運算式中包含多個運算子時,必須注意運算子執(zhí)行的優(yōu)先順序(priority).避免運算結(jié)果與預(yù)期的不合,下表為運算子的優(yōu)先順序及結(jié)合性,前面欄位內(nèi)的運算子,具有較高的優(yōu)先權(quán).同一欄位中的運算子則由結(jié)合性決定優(yōu)先運算子說明結(jié)合性sizeof陣列元素函式或運算式中的括號結(jié)構(gòu)成員或等式成員的間接存取數(shù)據(jù)所占的位元組大小(byte)由左到右++&增】減1取1ネト數(shù)(one'scomplement)否定負號(unaryminussign)正號(unaryplussign)取變數(shù)的位址存取指標所指位址的內(nèi)容由右到左?乘法由左到右盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第27頁共189頁/%除法余數(shù)+加法減法由左到右<><>=左移右移小於小於或等於大於大於或等於由左到右!=&&&II相等イ、相等位元AND位元XOR位元OR邏輯AND邏輯OR條件運算由左到右*=仁%=&=尸A二設(shè)定相乘再存入變數(shù)相除再將商數(shù)存入變數(shù)取余數(shù)再存入變數(shù)相加再存入變數(shù)相減再存入變數(shù)右移再存入變數(shù)位元AND后,再存入變數(shù)位元OR后,再存入變數(shù)位元XOR后,再存入變數(shù)由右到左,分隔變數(shù)或算式由左到右盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第28頁共189頁運算前的型態(tài)轉(zhuǎn)換當運算子要處理不只一個運算元(operand)時,這些運算元必須是相同的資料型態(tài)C編譯器會自動將運算元的型態(tài)轉(zhuǎn)換成一致,為避免因轉(zhuǎn)換而造成資料的遺漏,將以轉(zhuǎn)成較大的型態(tài)為原則.有些情況,即使運算元的型態(tài)是ー樣,但是在執(zhí)行運算前也會先做型態(tài)的轉(zhuǎn)換,c編譯器會根據(jù)運算的狀況自動做轉(zhuǎn)換.如果希望運算能照所要的方式運作,可以對運算元的資料型態(tài)做強制性的轉(zhuǎn)換(typecast).范例:charcount,a=0,b=50;if(a-b<10)count++;C編譯器做減法及比較,結(jié)果是?50,因此count++會被執(zhí)行.若改成if((unsignedint)(a-b)>)對signedchar/int/short/long型態(tài)的運算會將原先的最高位元(mostsignifieantbit,MSB)復(fù)制到右移后的最高位元,例如signedint0x0124在右移ー個位元后,變成0x0092(MSB=0)signedint0x8024在右移ー個位元后,變成0xC012(MSB=1)右移運算元對unsignedchar/int/short/long型態(tài)的運算,會將MSB填0左移運算元對unsigned/signed型態(tài)的運算,皆會將最低位元(leastsignificantbit)清為零4.5程式流程控制(programflowcontrol)在熟悉程式架構(gòu),變數(shù)及其資料型態(tài),運算式及運算子之后,根據(jù)功能需求去設(shè)計最恰當?shù)某淌搅鞒?使用最適合的流程控制敘述式.下列各敘述的語法中,粗字是保留字,使用到此敘述時必須用這個字.不可使用這些保留字當做變數(shù)名.語法內(nèi)的中括號代表被圍住的部分盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第29頁共189頁是可選擇的,可有可無,視需要決定.if-else敘述語法:if(cond-expression)statement1;[elsestatement?;]說明:這是ー個條件判斷的控制敘述.在不同的條件下會需要不同的處理時,可以使用這種敘述做不同的流程控制.如果條件cond-expression的結(jié)果為真(不等於零)則statemenれ會被執(zhí)行.否則,若有else部分,則會執(zhí)行else部分的敘述statement2,中括號代表此部分可有可無,完全視程式有無需要.statement1及statement?可以不只一個敘述,如果超過ー個敘述時,必須要以左右大括號包含這些敘述.范例:if(seconds>59)minutes++;seconds=0;}elseseconds++;.?switch敘述語法:switch(expression)caseconstant1:statement1;break;caseconstant?:statement2;break;盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別120日期?008/5/?6第30頁共189頁[default:statementX;break;])說明:if-else是針對只有兩種結(jié)果的運算式(expression)導(dǎo)出對應(yīng)的流程,如果運算式的結(jié)果超過兩個值,使用switch-case敘述會讓程式增加可讀性,更容易了解程式的功能.如果expression的結(jié)果是constant1,則statemen日會被執(zhí)行.若expression的結(jié)果等於constant?,貝リstatement?會被執(zhí)行.如果沒有任何的case與expression的結(jié)果相等,則default部分的statementX會被執(zhí)行.default部分可有可無.每個case(或default)中可以有多個敘述,例如caseconstant2:statement20;statement21;break;expression可以是ー個變數(shù)也可以是一個能計算出數(shù)值的運算式.不要忘記在每個case的最后ー個敘述后,加上break;敘述行,否則一直到下ー個break敘述之前或switch右括號之前的所有敘述皆會被執(zhí)行,除非程式確實要如此執(zhí)行.下例中,如果caseT中沒有break;則當inputkey等於1時,eolor=RED被執(zhí)行,因為沒有break,所以下ー個敘述color=GREEN也被執(zhí)行,結(jié)果就不是程式所要的范例:switch(input_key)("1:color=RED;break;2:color=GREEN;break;盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第31頁共189頁default:color=WHITE;break;fbr敘述語法:for(initial-expression;cond-expression;update-expression)statement1;說明:for敘述是重復(fù)執(zhí)行相同的動作(敘述).做條件回圈的功能.首先會執(zhí)行initial-expression,通常是初始設(shè)定一些變數(shù),這個運算式只會執(zhí)行一、次.如果沒有此運算式,則會直接做cond-expression的比較.cond-expression是條件判斷式,與if-else的cond-expression相同.當條件成立時,則會去執(zhí)行statement1.否則會離開此回圈,跳到statement1之后的敘述去執(zhí)行.在條件成立并執(zhí)行statement1之后,接著會去執(zhí)行update-expression的部分,再回到cond-expression做比較.重復(fù)此動作,直到條件不成立,就跳出此回圈,回到下ー個敘述.如果update-expressionイ、存在,則會直接對cond-expression做比較.statement!可以是ー個以上的敘述,但必須要以左右大括號包含這些敘述.范例:要將陣列變數(shù)的每個元素清為零,intidx;charcbuf[20];fbr(idx=0;idx<20;idx++)cbuf[idx]=0;while敘述語法:while(cond-expression)statement1;說明:與敘述for有類似的條件回圈功能.但是沒有initial-expressionupdate-expression.只要cond-expression條件成立就執(zhí)行statement1直到盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第32頁共189頁條件不成立,則跳出回圈.statement!可以不只一個敘述,但要用左右大括號包含之.范例:intidx;idx=0;while(idx<20)(cbuffidx]=0;idx++;}do-while敘述語法:do{statement1;}while(cond-expression);說明:do-while會先執(zhí)行statement1,之后再做cond-expression的比較,若條件成立,就再執(zhí)行statement1,一直到條件不成立,就跳出回圈.這個敘述與while敘述相似,不同點是statement!至少會執(zhí)行ー次.statement!可以不只ー個敘述范例:idx=0;do{cbuffidx]=0;idx++;}while(idx<20);goto敘述語法:gotolabel;說明:goto是一種強制性的流程控制敘述.可以直接跳出回圈將程式移轉(zhuǎn)到標名盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第33頁共189頁label的敘述或是從switch-case中移轉(zhuǎn)到label處.標名label必須和goto敘述在同一個函式內(nèi),也就是不允許跳到其他的函式里.范例:參看4.5.7范例break與continue敘述語法:break;continue;說明:break是從回圈或是switchcase跳出,一次只能跳出ー層continue是跳過continue敘述之后的其他敘述,再從下一回圈繼續(xù)執(zhí)行范例:idx=0;while(idx<20)(if(cbuf[idx]==0)//cbuf[]沒有字元break;/Z跳出while的回圈idx++;)fbr(idx=0;idx<20;idx-H-){if(cbuf[idx]!=0)continue;//cbuf[]仍有字元,回到idx++繼續(xù)gotocountJ;//沒有字元,計算字元總數(shù)}……/Z其他敘述countl:/Z標號//idx=字元總數(shù)函式(Functions)函式是敘述的集合.所有可被執(zhí)行的敘述必須定義於函式中(main()是主函式).使用函式前,必須要宣告及定義函式,否則編譯器會發(fā)出錯誤訊息.除了內(nèi)容的敘述,函式最重要的是參數(shù)(arguments)及返冋值(returnvalues).它的格式如下盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第34頁共189頁return-typefunction_name(var-typeargl,var-typearg2,...){'"'statements;)其中,return-type是函式的返冋值的型態(tài),可使用4.2節(jié)中的資料型態(tài)functionname是函式名,可由字元(character),數(shù)字(〇?9),底線(underscore)所組成.采用case-sensitive.大寫字元與小寫字元是不同的.var_type是參數(shù)的資料型態(tài),除了bit型態(tài)不可使用外,其余皆可argl,arg2,..是參數(shù)名稱,采用case-sensitive.大寫字元與小寫字元是不同的.參數(shù)(arguments)根據(jù)參數(shù)的資料型態(tài)(datatype),是以下列的存放方式傳入被呼叫的函式.一所有參數(shù)皆存放於內(nèi)部變數(shù)中,變數(shù)的名字是以函式名為準,再加上數(shù)字,從〇開始,例如函式名字為multiple,則第一個參數(shù)會存入變數(shù)multipleO,第二個參數(shù)則存放於變數(shù)multiple1,以此類推.如果參數(shù)型態(tài)為int或unsignedint,則使用兩個位元組儲存,例如第二個參數(shù)是int型態(tài),則變數(shù)multiplel儲存參數(shù)的低位元組,變數(shù)multiplel+1的位置儲存參數(shù)的高位元組返回值(returnvalues)從組合語言的角度看ー返回值的大小為ー個位元組(byte),則此值會放入累加器(accumulator)傳回呼叫函式的敘述行ー返回值是兩個位元組(int,short),則返回值的低位元組(lowbyte)存放在累加器,高位元組(highbyte)則放在變數(shù)RH.ー返回值是四個位元組(long,float),則返回值的低字低位元組(lowbyteoflowword)存放在累加器,返回值的低字高位元組(highbyteoflowword)放在變數(shù)RH.返回值的高字低位元組(lowbyteofhighword)放在變數(shù)RM.返回值的高字高位元組(highbyteofhighword)放在變數(shù)RU.為了讓程式更模組化及可讀性更高,將程式的各功能分別以獨立之函式實作之,會是最佳的

方式.主函式負責管理及呼叫各功能的函式,這些函式可以不要與主函式放在同一個程式檔.盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第35頁共189頁中斷服務(wù)函式(InterruptServiceRoutines)微控制器的硬體中斷可以用C語言撰寫它的中斷服務(wù)函式(Interruptserviceroutine,ISRIserviceroutine,ISRI必須遵照下列的規(guī)則來定義中斷服務(wù)函式ー函式的返回值型態(tài)必須是void—>函式不可有參數(shù)(parameter)ー使用#pragmavector設(shè)定中斷服務(wù)函式的中斷向量(interruptvector)使用@指定中斷向量ー最好不要從程式的其他地方呼叫中斷服務(wù)函式ー針對不具有中斷可重疊(nested)發(fā)生的微控制器,則在中斷服務(wù)函式內(nèi)不可開啟中斷功能ISRTimer@0x08#pragmavectorISRTimer@0x08voidIwSlTimer(void)/Z定義:返回值的型態(tài),沒有參數(shù),設(shè)定中斷向量為0x08C編譯器會根據(jù)中斷服務(wù)函式對暫存器的需要,在進入中斷服務(wù)函式后,將這些暫存器的內(nèi)容儲存.等執(zhí)行完中斷服務(wù)函式的工作后,再恢復(fù)先前所儲存的暫存器內(nèi)容.最后回到被中斷的地方繼續(xù)執(zhí)行,同時中斷功能也打開,允許中斷產(chǎn)生.在程式的其他地方若需要將中斷功能開啟(enable),可自行設(shè)定相關(guān)的暫存器.當中斷服務(wù)函式正在處理此中斷時,另ー個更優(yōu)先的中斷發(fā)生并需要盡快處理,則微控制器必須暫停目前的中斷服務(wù)函式,轉(zhuǎn)而處理新發(fā)生并且是更優(yōu)先的中斷事件.亦即微控制器具有中斷可重疊(interruptnested)的特性.在編譯中斷服務(wù)函式時,HoltekCcompiler會將一些常用的暫存器的內(nèi)容保存於資料記憶空間(RAMspace),當中斷服務(wù)函式完成其工作后,在返回原先被中斷處之前,再將這些內(nèi)容還原到暫存器.由於要支援可重疊的中斷事件,HoltekCcompiler對於每一個中斷向量保留一組資料記憶空間,例如中斷向量一(1NT1)的中斷服務(wù)函式會將暫存器的內(nèi)容保存於Vlxx的記憶空間,中斷向量二(INT2)的中斷服務(wù)函式會保存在V2xx記憶空間,其他的中斷以此類推.盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第36頁共189頁中斷服務(wù)函式會保存的暫存器內(nèi)容包括累加暫存器(accumulator,ACC),狀態(tài)暫存器(status,S),記憶體區(qū)塊指標(bankpointer,BP),間接位址指標(MP0,IAR0)以及在算術(shù)運算中使用的中間變數(shù)(以T開頭的,例如T2,T3,…).這些暫存器或中間變數(shù)將會保存於對應(yīng)的變數(shù),VIA,VIS,VIBP,V1MP0,V1MP1,V1T2,VIT3,…(中斷向量一),V2A,V2S,V2BP,V2MP0,V2MPI,V2T2,V2T3,…(中斷向量二),其他的累推.如果微控制器不具有BP,MP1的則不需要保存這些暫存器的內(nèi)容.雖然不同的中斷事件可以重疊發(fā)生,但是同一個中斷事件并不可以重疊產(chǎn)生,必須等候前ー個發(fā)生被處理完成后,才能認可下ー個中斷事件.可以在中斷服務(wù)函式中將同一個中斷除能(disableinterrupt)如果微控制器中不同類的中斷事件不可重疊發(fā)生,則HoltekCcompiler可以只使用一組記憶體空間保存這些暫存器的內(nèi)容,但是必須在定義中斷服務(wù)函式的程式中指明之.(使用#pragmanovectomest)而在中斷服務(wù)函式中要將中斷功能停止(disableinterrupt,_emi=O)在C語言程式中嵌入組合語言(in-lineassemblycode)如果想要讓編譯后的程式碼更為精簡,執(zhí)行上更有效,可以在C程式中加入組合語言的指令.格式如下#asm組合語言指令組合語言指令#endasm#asm與#endasm是前置處理指令,指示C編譯器將其中的組合語言指令取出當做輸出的執(zhí)行碼在C語言的條件結(jié)構(gòu)中,如if,while,do之類,不要使用#asmblock的格式去內(nèi)嵌組合語言指令.前置處理指令(Preprocessor)前置處理指令是以#為字首的文字串,程式中所有的前置處理指令會最先被前置處理器盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第37頁共189頁(preprocessor)處理.這些指令提供的功能有定義文字符號(define),巨集指令(macro),引入檔案(includefile),條件式編譯(conditionalcompiler)與特殊選項(pragma)定義文字符號(#define)—#define語法:#definesym_namereplaced_text說明:定義symname為replacedtext,而replacedtext可以是數(shù)值,運算式或文字串.前置處理器會將程式中所有含sym_name的敘述,更換成replacedtext.范例:defineTOTALCOUNT40definePAO120>#undef語法:#undefsymname說明:取消先前定義的文字符號或前置處理巨集范例:undefPA0//取消先前定義的PA0引入檔案(#include)—>#include語法:#include"filename"或#include說明:將指定檔案的內(nèi)容嵌入所在的程式處.當filename以雙引號”包含時,編譯器先到工作目錄中找尋此檔,若找不到,則到目前的目錄找尋,若找不到就發(fā)出錯誤訊息當filename是以角號包含時,則只到環(huán)境參數(shù)設(shè)定的目錄中去找尋內(nèi)嵌組合語言(inlineassembly)—>#asm#endasm盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別!.20日期2008/5/26第38頁共189頁語法:#asm組合語言的指令,例如MOVA,1#endasm說明:在#asm與#endasm之間嵌入組合語言指令.范例:#asmANDA,OFhSUBA,09h#endasm條件式編譯(#if7#endif)—>#if#else#endif語法:#ifexpressionstatements1;[#elsestatements!;]#endif說明:控制編譯器體有條件地編譯程式.當expression為真時,statements1的程式會被編譯,否則statementsI會被忽略,若有#else部分,則會編譯statements2.#else部分可有可無,視需要范例:#ifMODE>0#defineDISP_MODEMODE#else#defineDISPMODE7#endif一#ifdef語法:#ifdefsymbolstatements1;[#else盛群半導(dǎo)體股份有限公司HOLTEKSEMICONDUCTORINCC50微電腦工具事業(yè)處部撰寫人:文件編號版別1.20日期2008/5/26第39頁共189頁statements2;]#endif說明:如果symbo!在前面已被定義(用#define),則statements1被編譯,否則會編譯statements2.#else部分可有可無—#ifhdef語法:#ifhdefsymbolstatements1;[#elsestatements2;]#endif說明:與#iftief相反,如果symbo!在前面未被定義,則statements1被編譯,否則會編譯statements2.#else部分可有可無—>#elif語法:#ifexpression1statements1;#elifexpression2statements2;#endif說明:如果ex

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論