微控制器C語言學習心得

2022-02-08 01:17:46 字數 1098 閱讀 1206

今天寫這一篇文章並不是因為已經想好了一篇文章才寫下來,而是我要將這一篇文章作為乙個長期的筆記來寫,我會一直更新。在進行微控制器開發時,經常都會出現一些很不起眼的問題,這些問題其實都是很基礎的c語言知識點,是一些小細節。但是正是因為很基礎,又都是小細節,所以我們往往容易忽視它們。

結果有時候我們會花很長的時間糾結乙個問題,遲遲找不到問題的所在。當發現原因竟然是這麼的簡單和不起眼時,我想不單是我,大家都會感到痛不欲生。筆者今天又碰到了這樣的問題,實在忍不住了。

因為這些問題都是小的知識點,考慮到之前也遇到好多這種問題,於是決定每次遇到問題就記錄下來,時刻提醒自己。

1. !和 ~ 不一樣

! 是邏輯非符號,~ 是位取反符號。

對io口某個管腳賦值時不要錯用 !,如

2.《和》的優先順序低於+、-

比如要實現c=x*2+1,沒有加括號會出錯

3.移位要防止溢位

其實用移位代替乘除法是個不錯的方法,筆者很喜歡拿到一段**後用移位代替乘除法來進行優化。不過有時候卻會出現問題,比如溢位問題。當很明顯可能溢位的話我們是會注意的,比如

但是有時候這個問題是不明顯的,比如當移位出現在陣列索引或函式引數時,有段用液晶顯示字元的**如下

我們可以用左移運算來代替乘法進行優化,如

這本是乙個好方法,但是事實上上面的**是錯的。當執行c<<4時,因為沒有明顯的賦值過程,我們可能認為沒問題,而事實上c的高位已經丟失了,所以得到錯誤的結果。乙個可行的做法是先進行強制轉換,如

4.無符號數和有符號數混合運算都會被強制轉換為無符號數運算

當乙個有符號數和乙個無符號數進行算術運算時,系統會自動將有符號數強制轉換為無符號數再進行運算(即使你使用有符號數強制型別轉換),如下面兩種寫法的運輸結果是一樣的

5.區域性變數要初始化

區域性變數沒有初始化的話,因為微控制器每次為他分配的是同乙個記憶體區域,當你在函式中是這麼使用區域性變數時,就可能出問題:

如果第一次呼叫fun時,a傳遞的值為0,那麼flag = 0x01;執行if(flag&0x01)後面的**。以後再呼叫fun時,即使a不為0,但flag依然使用之前的記憶體區域,所以其值一直為0x01,一直執行的是if後面的**,而不是else後面的。

如果要避免這個錯誤,平時要養成對區域性變數初始化的習慣。

微控制器C語言學習好

前言 2 基礎知識 微控制器程式設計基礎 2 第一節 單數碼管按鍵顯示 4 第二節 雙數碼管可調秒錶 6 第三節 十字路 通燈 6 第四節 數碼管驅動 7 第五節 鍵盤驅動 8 第六節 低頻頻率計 14 第七節 電子錶 17 第八節 序列口應用 17 微控制器的外部結構 1 dip40雙列直插 2 ...

C語言學習心得

第一層 初學c語言,基本上是隨便拿一本c語言入門,從helloworld開始了。學完後,能記住一些最簡單的語法,勤奮者,照書畫貓敲幾個例程體驗一把。但大部分工科生應付完考試,也就止於此了,等大四找工作時,c語言基礎語法早就丟到了爪哇國了,這也是為何招聘時我們發現很多人一問三不知的原因了。第二層 學習...

c語言學習心得

摘要 林林總總的計算機語言,林林總總的計算機技術,林林總總的計算機書籍讓我們初入計算機的菜鳥一次就嚇的沒有勇氣。迷茫和徘徊讓我們喪失了時間和信心。沒有訣竅嗎?有的,看你怎麼把握了,接下來我就以c語言為例子,講一下有關學習的方法和技巧,同時也分享一下我學c的感想。林林總總的計算機語言,林林總總的計算機...