閒來沒事,將自己以前學習AVR單片機的一些筆記給大家整理出來,方便大家來一起學習。也爭取每週能整理幾篇出來。
此處我使用的單片機是AVR系列的,芯片為Atmega328p,具體資源請查看官網上的該芯片的datasheet。
好的,閒話就不說了,直接上正題,對於單片機來說,可能對io口的操作是最基本的能力了。
首先我們來看一下位的操作
按位或
其實就是置位
例如:PORTA |= 0x80;
只要有一個為1就為1了,是不是最高位置位了
按位取反
其實就是清位
例如:PORTA &= ~0x80;
兩個全為1才為1 ,是不是最高位清位了
按位異或
其實就是實現位的翻轉
例子:PORTA ^= 0x80
相同為0,不同為1, 是不是最高位翻轉了
按位與
其實可以用來檢測某一位是不是為1
例子:if(PINA & 0x80)
就可以用來檢測PA.7是不是為1了
下面來看幾個簡單的程序例子:
哦,在寫demo程序之前,可能還需要來講一點別的,
我用的開發環境時winavr,然後使用usbasp將hex燒寫進板子裡面,不同的開發環境,可能使用的頭文件有一些出入,後期我可能只展示一些核心代碼了。
可能還要講一下控制io的寄存器
atmega328p 這個mcu的io口都是標準的雙向口,這個和51是有區別的。
在復位時,所有的端口都是高阻態,啥是高阻態,不知道可以度娘了。
每一個端口,都對應3個寄存器,分別是:DDRx PORTx PINx
來看看這三個寄存器的控制作用:
DDR : 選擇引腳是輸入還是輸出
PORT : 當io口是輸入的時候,它控制有無上拉電阻,當io口是輸出的時候,它控制的輸出的電平情況。
PIN :讀管腳的電平
總結一下:io口初始化三部曲:
使用DDR來設置端口是輸入還是輸入
要是輸出的話,使用PORT來設置輸出的是高電平還是低電平
要是輸入的話,使用PINx來讀取管腳的輸入值,同時可使用PORT來設置管腳是不是有上來電阻。不清楚上、下拉電阻的,以後我再出一個教程。
閱讀更多 小5嵌入式 的文章