基于宏定義的超強avr單片機io口操作
本章重點講述avr單片機的io口操作,為從51單片機走向嵌入式系統(tǒng)碼農(nóng)的福音,經(jīng)歷了51->MPS430或51->pic 51->avr,這樣一些轉(zhuǎn)換,本人粗略學了51,后直接專攻avr,為此有一些心得,和一些雕蟲小技的小伎倆,希望能拋磚引玉,引發(fā)同行反思,在工作中提供舉一反三后的便利。
想像51一樣,在winavr中直接寫上sbit KEY1 = p1^1,
然后用下列語句掃描鍵盤嗎??
if(KEY1==0) keyval=1;
請看下面的宏定義,其中位段的手法來源于網(wǎng)絡,本人純屬借鑒。之后的##,宏鏈接符,純屬自創(chuàng),
各位先行使用以下宏后,有問題直接聯(lián)系本人qq21332560討論:注明驗證信息:io口
//定義新的數(shù)據(jù)類型,方便進行IO端口操作。
typedef struct{
unsigned char bit0:1 ;
unsigned char bit1:1 ;
unsigned char bit2:1 ;
unsigned char bit3:1 ;
unsigned char bit4:1 ;
unsigned char bit5:1 ;
unsigned char bit6:1 ;
unsigned char bit7:1 ;
}bit_field;
#define GET_BIT(adr) (*(( volatile bit_field * )(&adr)))
////////////////////////////////////////
#define AUTOINIT 1 //自動初始化IO方向寄存器無需在初始化程序中用PORTA=0X..;形式來初始化io控制寄存器,同時也不爭的證明了avr單片機的端口輸入/出切換功能
#if AUTOINIT==1
#define PORT(m,n) GET_BIT(DDR##m).bit##n=1;\
GET_BIT(PORT##m).bit##n
#else
#define PORT(m,n) GET_BIT(PORT##m).bit##n
#endif
////////////////////////////////////////
#if AUTOINIT==1
#define PIN(m,n)
(!(u08)(GET_BIT(DDR##m).bit##n=0)
&&\
(u08)(GET_BIT(PORT##m).bit##n=1)
&&\
GET_BIT(PIN ##m).bit##n )
#else
#define PIN(m,n) GET_BIT(PIN##m).bit##n
#endif
//方便直觀操作 自由設定單個io口的方向
#define DRA(n) GET_BIT(DDRA).bit##n
#define DRB(n) GET_BIT(DDRB).bit##n
#define DRC(n) GET_BIT(DDRC).bit##n
#define DRD(n) GET_BIT(DDRD).bit##n
#define DDR(m,n) GET_BIT(DDR##m).bit##n
在我們實際項目中,需要用到按鍵輸入,繼電器,SPI器件輸出,
兩者分別為輸入,和輸出之用,這時候可以方面的在各自c文件對應的.h文件中寫下如下語句:
#define KEY1 PIN(C,3)//定義三個按鍵,使能上拉
#define KEY2 PIN(C,4)
#define KEY3 PIN(C,5)
#define SCLK_SPI PORT(B,5)//定義spi口的兩個控制引腳
#define CS_SPI PORT(C,0)
上述PIN PORT 自動化定義的方法中,有些不足,如:在DS18B20這樣的應用中,需要切換引腳的輸入輸出,就必須為18B20的引腳安排兩套定義,
類似于:#define DS18B20_IN PIN(A,1)
#define DS18B20_OUT PORT(A,1)
此外:PORT和PIN的自動化定義中,含有DDR的操作,凡是用到PIN和PORT定義過的端口的地方都需要重復DDR操作,帶來冗余代碼。
編輯:admin 最后修改時間:2018-12-27