對于單片機的學習,很多人都是從點燈程序開始的,這里我找到
了一個之前做實驗的小板子,MCU是STC8H1K08,P54引腳接了一個
發(fā)光管經(jīng)過電阻到地。由于P54引腳要拉高才能點亮發(fā)光管,所以端
口模式要設置成推挽模式,因此最最最簡單的C語言點燈程序是下面的
樣子:
看起來是不是很簡單?全部加起來包括花括號只有7行代碼,其中第一
行是文件包含偽指令,它把STC公司提供的對應“頭文件”包含到此程序
中來,下面六行是一個C語言函數(shù)的標準寫法,只是名為“main”的函
數(shù)很特殊,它是必須的,不能被別的函數(shù)調(diào)用,所以沒有返回值,也不
需要參數(shù)。“void”是C語言中“無類型”關鍵字,“main”左邊的
“void”代表“main”函數(shù)的返回值是“無類型”。“main”右邊的
小括號中的“void”是它的參數(shù)的類型。緊跟著的一對“花括號”中間
裝的是“main”函數(shù)的具體內(nèi)容,它里面有三個分號,C語言語句以分
號結尾,前兩句用于設置P54端口為推挽模式,第三句才是拉高P54引腳
真正實現(xiàn)點亮發(fā)光管的語句,當然也可以在前兩句中把端口設置為準雙
向口模式也是可以點亮的,但是沒有前兩句的話則是不能點亮的。經(jīng)過編
譯,上圖中可以看到生成了24字節(jié)的代碼,沒有錯誤和警告,下載到實驗
板上實測能點亮發(fā)光管。
再來看這三句C語言語句,中間都有“等號”,它可不是我們生活中
的“等于”的意思。“等號”右邊就是數(shù)字,只是它的寫法不常見,“等號”
左邊是STC8H1K08這個芯片中寄存器的名字,它們都是在“頭文件”中定
義的,大家可以用記事本或其它程序打開“頭文件”仔細研究研究。什么是
寄存器?我們可以很形象的打個比方,說墻上有很多燈開關,其中一個叫
“P54”,我們在程序中把數(shù)字“1”寫進“P54”這個開關中,然后燈這亮了,
也可以把數(shù)字“0”寫進“P54”中,然后燈就滅了,所以這三個語句都是
把“等號”右邊的數(shù)字寫進左邊的寄存器中,從而實現(xiàn)我們想要的結果。
除了頭文件外,單片機的制造商還會提供對應單片機的參考手冊和數(shù)據(jù)
手冊,STC則很獨特的把這兩個文件外加例程都寫進了一個PDF文件中,目前
這個“STC8H技術參考手冊”達到了1640頁。想要學好用好這個單片機就要
認真閱讀此手冊。
再來看一看“0x10”這個數(shù)字,其前綴“0x”代表它是16進制的數(shù)字,
翻譯成常見的十進制的寫法是“16”這個數(shù)字,同樣的“0x00”就是十進制
的“0”,寫成那樣有強調(diào)它是一個8位數(shù)的意思,因為“等號”左邊的
“P5M1”寄存器有8個位,語句的結果是要把8個位都寫成“0”,而實際上
只需要把它的“4位”寫成“0”就行了,其它的7個位最好是“保持原樣”,
但是很遺憾,“等號”這種直接賦值的方式不能使其左邊寄存器內(nèi)的其它位
“保持原樣”,必須得換一種寫法才行,雖然“P54”可以直接賦值而不影響
其它“位”,但為了適應其它不支持“位操作”的單片機,我盡量少用這種
“位操作”的寫法。同樣的程序我改成了如下的樣子:
#include "STC8Hxx.h"
#define BIT4 (0x10)//定義“4位”,注意這句沒有分號!!
void main(void)
{
P5M1 &=~(BIT4);//拉低復位
P5M0 |= BIT4;//拉高置位
P5 |= BIT4;//P54拉高置位
}
其中“BIT4”對于單片機來說就是數(shù)字“0x10”,但是我們在讀這個程
序的時候一眼就能看出是要對寄存器的哪一位做怎樣的處理而不需要特別注明
語句的具體含義。我們要特別的記住“|=”是拉高某位(或某幾位)而其它位保
持原樣,“&=~”則是拉低某位(或某幾位同時拉低的話要加圓括號括起來)而
其它位保持原樣。
當然,實際的程序不可能只是這么簡單,比如“#define”這樣的位定義就
有8行(或更多),
#define BIT0 (0x01)
#define BIT1 (0x02)
#define BIT2 (0x04)
#define BIT3 (0x08)
#define BIT4 (0x10)
#define BIT5 (0x20)
#define BIT6 (0x40)
#define BIT7 (0x80)
我們可把這些(或更多的內(nèi)容)寫進我們自己的“Ext.h”這樣一個頭文件中,
然后包含進程序中,當然還要加上傳說中的“大循環(huán)”:
#include "STC8Hxx.h"
#include "Ext.h"
void main(void)//程序從主函數(shù)開始執(zhí)行
{
P5M1 &=~(BIT4);//只運行一次的程序
P5M0 |= BIT4; //寫這這里,
P5 |= BIT4; //比如初始化程序
while(1)//大循環(huán)
{
;//要循環(huán)運行的語句寫這里
}
}//主程序結束
//中斷函數(shù)可以寫在下面
今天就聊到這里,不足之處,歡迎指正。
|