資源描述:
《第1章 SPCE061A 單晶片簡(jiǎn)介》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、C語(yǔ)言的基本知識(shí)與軟體模擬這裏不是教你如何使用C語(yǔ)言。而是怎樣利用C語(yǔ)言來(lái)編寫淩陽(yáng)μ’nSP?的單晶片的程式。以下我們將複習(xí)關(guān)於C語(yǔ)言的一些概念,如結(jié)構(gòu)迴圈和類型定義等。3.1資料與運(yùn)算3.1.1資料與資料類型在表3.1中列出了μ’nSP?GCC認(rèn)可的基本資料類型及其值域。讀者應(yīng)該特別注意:表中所列的資料類型及其表示範(fàn)圍與一般機(jī)器使用的GCC資料類型之間有一些差別,例如char為16位元等等。此外,μ’nSP?GCC的float與double均為32位元浮點(diǎn)數(shù),而μ’nSP?組譯器(Assembly)的float與double
2、分別是32位與64位浮點(diǎn)數(shù)。表3.1、μ’nSP?GCC的基本資料類型資料類型資料長(zhǎng)度(位元數(shù))表示範(fàn)圍char16-32768~32767short16-32768~32767int16-32768~32767longint32-2147483648~2147483647unsignedchar160~65535unsignedshort160~65535unsignedint160~65535unsignedlongint320~4294967295float32以IEEE格式表示的32位浮點(diǎn)數(shù)double32以IEEE格
3、式表示的32位浮點(diǎn)數(shù)3.1.2常數(shù)、變數(shù)、運(yùn)算符號(hào)與運(yùn)算式在程式執(zhí)行過(guò)程中,其值不會(huì)改變的數(shù)稱為常數(shù)。程式中可以用一個(gè)常數(shù)名稱來(lái)代表一個(gè)看不出有什麼意義的數(shù)字,比如:#defineC_Fosc_49M0x0080這裏定義了一個(gè)常數(shù)名稱C_Fosc_49M,它的值為0x0080。在寫程式時(shí),我們就可以用C_Fosc_49M來(lái)代替0x0080。這樣的好處是顯而易見的,大家一眼就可以看出Fosc選擇了49MHz。在程式執(zhí)行過(guò)程中,其值可以改變的數(shù)稱為變數(shù)。下面就有符號(hào)/無(wú)符號(hào)(signed/unsigned)問(wèn)題作一些說(shuō)明。在寫程式
4、時(shí),如果使用signed和unsigned兩種資料類型,就得分別使用這兩種格式類型的函數(shù)庫(kù),這將使佔(zhàn)用的儲(chǔ)存空間成倍增長(zhǎng)。因此在寫程式時(shí),如果只強(qiáng)調(diào)程式的運(yùn)算速度而又不進(jìn)行負(fù)數(shù)運(yùn)算時(shí),最好採(cǎi)用unsigned格式。μ’nSP?GCC基本的算術(shù)運(yùn)算符和ANSI-C是一樣的,見表3.2。表3.2、μ’nSP?GCC基本的算術(shù)運(yùn)算符號(hào)運(yùn)算子作用+、-、*、/、%加、減、乘、除、餘數(shù)運(yùn)算&&、
5、
6、邏輯AND、OR&、
7、、^、<<、>>位元運(yùn)算AND、OR、XOR、左移、右移>,>=,<,<=,==,!=大於、不小於、小於、不大於、等於
8、、不等於=指定運(yùn)算?:條件運(yùn)算,逗號(hào)運(yùn)算*、&指標(biāo)運(yùn)算.分量運(yùn)算sizeof資料位元組數(shù)運(yùn)算[]陣列指標(biāo)運(yùn)算下面舉一個(gè)用使用位元運(yùn)算掃瞄鍵盤的例子。如圖3.1所示為SPCE061A與一個(gè)4×4鍵盤介面的電路圖。圖3.1電路直接掃描一個(gè)矩陣鍵盤。在這些按順序進(jìn)行掃描的鍵盤矩陣上,每次只有一行電位被拉低準(zhǔn)位。在每次掃描拉低這些行的同時(shí),去讀那些列的資訊,在被拉低的行上被按下的按鍵所對(duì)應(yīng)的列的電位值為0,其他列的電位值為1。如圖3.1所示,用SPCE061A的Aport低8位作為4×4鍵盤的介面,其中IOA4~I(xiàn)OA7作為行驅(qū)動(dòng)線,
9、IOA0~I(xiàn)OA3作為列讀入線。每隔約20ms行驅(qū)動(dòng)線被逐次拉至低電位,以避免鍵盤的抖動(dòng)干擾。接下來(lái)程式所要做的工作就是測(cè)試輸入的任何變化,包括新鍵的按下或舊鍵的釋放。使用位元運(yùn)算,可以很容易地將這些變化辨識(shí)出來(lái)。如表3.3所示,該表說(shuō)明了如何使用位元掃瞄來(lái)鑑別鍵盤的變化過(guò)程。圖3.1、鍵盤掃描原理圖表3.3表示IOA4~I(xiàn)OA7設(shè)為反相輸出埠的情況。設(shè)為反相輸出埠的意思是,我們?cè)谲涹w中送1到I/O腳,但I(xiàn)/O腳輸出的是0,兩者正好是反相的。表3.3使用位元檢測(cè)鍵盤值的變化IOA7IOA6IOA5IOA4IOA3IOA2IOA
10、1IOA0原鍵值(old)00101101新鍵值(new)01001110中間變數(shù)(temp=old^new)01100011新按鍵(temp&new)01000001釋放鍵(temp&old)00100010從表3.3可以看出,Aport原讀入值為00101101B,由於行驅(qū)動(dòng)線IOA4~I(xiàn)OA7為反相輸出,按1為低電位,0為高電位,此時(shí)硬體電路的第二行IOA5為低電位。由於IOA0~I(xiàn)OA3為列讀入值,按0為低電位,1為高電位,則第二列的鍵被按下,其鍵值為5。根據(jù)同樣的原理,對(duì)於新讀入的值01001110B,意味著,此時(shí)鍵
11、值為5的鍵被釋放,而第三行第一列鍵值為8的鍵被按下。下面所進(jìn)行的邏輯位元運(yùn)算也正好說(shuō)明了這一點(diǎn)。在表2.3中,IOA7~I(xiàn)OA4的新值0100B和原值0010B不同,說(shuō)明了掃描的行不同,而新按鍵欄和釋放鍵欄中IOA7~I(xiàn)OA4為1的是掃描的行。而對(duì)於讀回列資訊的IOA3~I(xiàn)O