一、GPIO口配置
MSP430F249有6組IO 端口,即P1~P6,每一組IO口都有8個可獨立編程引腳,比如P1有P1.0 ~ P1.7。在MSP430所有的端口都有控制輸入輸出方向和進行輸入、輸出的能力。其中P1、P2口具有外部中斷的功能,第二功能可通過寄存器進行控制,外部中斷有三個寄存器,中斷使能,中斷觸發控制,中斷標志位。
端口P1具有輸入/輸出、中斷和外部模塊功能,這些功能可通過7個控制寄存器的設置來實現。下面介紹
各控制寄存器特點及其使用:
1、PxDIR 輸入/輸出方向寄存器
輸入/輸出方向寄存器
相互獨立的8位分別定義了Px 口的8位的輸入輸出方向。
使用輸入/輸出功能時,應先定義端口方向。作為輸入時,只能讀;作為輸出時,可讀可寫。
PxDIR.x:端口輸入輸出方向控制
0:輸入模式
1:輸出模式
操作:
P1DIR |=0x10; // P1.4作輸出,其余各位端口方向不變。
P1DIR &=0x7f; // P1.7作輸入,其余各位端口方向不變。
2、PxIN 輸入寄存器
l 輸入寄存器
該寄存器是只讀寄存器。只能通過讀取該寄存器內容才能知道Px 口的輸入信號的狀態。
讀出此寄存器的內容中,只有Px口設為輸入的數據位有效。
對于 Px口設為輸出的那些位,一般來說,PxIN.x = PxOUT.x
PxIN.x:端口輸入的電平
0:端口輸入低電平
1:端口輸入高電平
操作:
unsigned char Temp;
P1DIR &=0x77 ; // P1.3和P1.7輸入
Temp = P1IN; // Temp為在已定義的一變量,Temp 中只要第7位和第四位有效。
3、PxOUT 輸出寄存器
輸出寄存器
該寄存器可讀可寫,讀取時,其內容與Px 口引腳定義無關。改變方向寄存器的內容,此寄存器內容不受
影響。
PxOUT.x:端口輸出的電平
0:端口輸出低電平
1:端口輸出高電平
注意:
P1OUT.0 = 1(P1.0輸出高),但是P1DIR.0 = 0(該引腳為輸入模式),則此時P1.0為輸入;
如果將P1DIR.0 = 1(該引腳為輸出模式),則此時P1.0為輸出,并且輸出為高電平。
操作:
P1DIR |=0x88; // P1.3和P1.7輸出
P1OUT |=0x88; // P1.3和P1.7輸出高電平
4、上下拉電阻配置
上下拉電阻是否開啟由PxREN寄存器決定,而上拉還是下拉是由PxOUT寄存器決定,在作為輸出時,隨著PxOUT的高低,自動選擇上下拉,所以平時我們沒有特別的去設置內部上下拉也可以輸出高電平的原因,但作為輸出的時候,這個配置就必需得有,可以人為的賦值PxOUT寄存器來得到上下拉,具體如下工作原理:
二、對寄存器的位操作
1、比如要設置
P1.0為高電平輸出
P1.1為低電平輸出
P1.2取反
P1.3讀取的數據
以下三種編寫方法:
(1)不依賴頭文件編寫
P1OUT | = 0X01;
P1OUT & = ~0X02;
P1OUT^ = 0X04;
if((P1OUT&0X08)==0)
{
//執行代碼
}
(2)在IAR環境下編寫,BIT0 ——BIT7 是 0x01——0x08 的宏定義。
P1OUT | = BIT0;
P1OUT & = ~BIT1;
P1OUT^ = BIT2;
if((P1OUT&BIT3)==0)
{
//執行代碼
}
(3)不依賴頭文件,移位的編寫方法
P1OUT | = (1<<0);
P1OUT & = ~(1<<1);
P1OUT^ = (1<<2);
if((P1OUT&(1<<3))==0)
{
//執行代碼
}
2、寫位操作
對某個字節直接使用“=”進行寫操作時,所有的位的值都將改變。如果先將原字節的值讀出來,使用位操作對原字節進行賦值,就可以“等效”實現對單個位的寫操作。
/* 設定P1OUT原始值為b'0101 1010 */
P1OUT |= 0x01; /* P1OUT = P1OUT | b'0000 0001
b'0101 1010 //P1OUT:0x5A
| b'0000 0001 //0x01
________________
b'0101 1011 //P1OUT:0x5B
或操作可以實現對特定位置1 */
P1OUT &= ~0x10; /* P1OUT = P1OUT & b'1110 1111
b'0101 1011 //P1OUT:0x5B
& b'1110 1111 //0xEF
_________________
b'0100 1011 //P1OUT:0x4B
與操作可以實現對特定位置0 */
P1OUT ^= 0x02; /* P1OUT = P1OUT ^ b'0000 0010
b'0100 1011 //P1OUT:0x4B
& b'0000 0010 //0x02
_________________
b'0100 1001 //P1OUT:0x49
異或操作可以實現對特定位取反*/
這樣可以實現只對特定位進行操作而不影響其他位的值。
3、依賴頭文件對位操作
另外為了方便操作在”msp430xxx.h"里還包含了各種宏定義來輔助位操作。
#define BIT0 (0x0001u)
#define BIT1 (0x0002u)
#define BIT2 (0x0004u)
#define BIT3 (0x0008u)
#define BIT4 (0x0010u)
#define BIT5 (0x0020u)
#define BIT6 (0x0040u)
#define BIT7 (0x0080u)
#define BIT8 (0x0100u)
#define BIT9 (0x0200u)
#define BITA (0x0400u)
#define BITB (0x0800u)
#define BITC (0x1000u)
#define BITD (0x2000u)
#define BITE (0x4000u)
#define BITF (0x8000u)
有了BIT0-BITF后,可以方便地對寄存器的各位進行設置,不用再一個一個去數二進制的位數了。上述代碼可以改寫為:
P1OUT |= BIT0; //P1.0 輸出高電平
P1OUT &= ~BIT4 //P1.4 輸出低電平
P1OUT ^= BIT1; //P1.1 電平取反
另外也可以多個位一起操作:
P1OUT | = BIT3 + BIT5 +BIT6; //P1.3 P1.5 P1.5 輸出高電平
P2OUT & = ~BIT2 + ~BIT4 + ~BIT7; //P2.2 P2.4 P2.7 輸出低電平
讀位操作
if((P1IN&BIT6) == BIT6) //如果P1.6輸入高電平 b'0100 1010 & b'0100 0000 = b'0100 0000
// b'0000 1010 & b'0100 0000 = b'0000 0000
P2OUT |= BIT0; //P2.0輸出高電平
else
P2OUT &= ~BIT0; //P2.0輸出低電平
原文鏈接
三、實戰例程
1、IO口控制LED燈
//IO口定義
#define LED_H P5OUT | = BIT7;//熄滅LED燈
#define LED_L P5OUT & = ~BIT7;//點亮LED燈
#define LED_HL P5OUT ^ = BIT7;//翻轉LED燈狀態
//函數聲明
void led_Init(void);
//LED燈初始化
void led_Init(void)
{
P5SEL & = ~BIT7;//設置P5.7IO為普通的I/O口
P5DIR | = BIT7;//設置P5.7IO口方向為輸出
P5OUT | = BIT7;//初始化設置P5.7IO口為高電平
}
2、按鍵輸入控制LED燈
void Key_Init(void)
{
P1SEL& = ~BIT0; //設置P1.0的IO口為普通IO口模式
P1DIR& = ~BIT0; //p1.0的IO口方向為輸入
P1REN | = BIT0; //使能P1.0內部電阻
P1OUT | = BIT0; //設置P1.0為內部上拉電阻為上拉方式
P6SEL& = ~BIT3; //設置P1.0的IO口為普通IO口
P6DIR& = ~BIT3; //設置P6.3的IO口方向為輸入
P6REN | = BIT3; //使能P6.3的內部電阻
P6OUT | = BIT3; //設置P6.3內部電阻為上拉電阻方式
}
//按鍵掃描
u8 Kek_Scan(void)
{
static u8 KeyUpFlag = 1;
if (KeyUpFlag && (!KEY1_I || !KEY2_I))
{
Delay_ms(10);//延時消抖
KeyUpFlag = 0;
if(!KEY1_I ) return 1;
if(!KEY2_I ) return 2;
}
else if (!KEY1_I || !KEY2_I))
KeyUpFlag = 1;
return 0;
}
//========外部中斷控制LED燈=========
//獨立按鍵底層驅動頭文件
#ifndef KEY_ Н
#define KEY_ H
#include "msp430type.h'
//IO口定義
#define KEY1_ _I (P1IN & BITO) //按鍵1輸入
#define KEY2_ _I (P6IN & ВIT3) //按鍵2輸入
//按鍵初始化
void Key_ Init(void);
//按鍵掃描
u8 Kek_ Scan(void);
# endif
//主程序
#include #include "msp430type.h" #include "system.h" #include "delay.h" #include "led.h" #include "key.h" //主函數 void main(void) { u8Key=0; Wdt_ _Off();/ /關閉看門狗 Clock_ Init();/ /系統時鐘初始化Led_ Init();/ /led燈初始化 Key_ Init();/ /按鍵初始化 while(1) { Key = Kek_ Scan(); // 按鍵掃描 switch(Key) { case 1 : LED_ L;// 點亮led燈break; case 2: LED_ H;/ /kéX led 'Jbreak; default: break; } } } 3、外部中斷控制LED燈狀態翻轉 **注意:**中斷函數的寫法: #pragma vector = 中斷想向, _interruot void + 函數名。
上一篇:MSP430單片機的中斷機制
下一篇:msp430單片機GPIO基礎理解
推薦閱讀
史海拾趣
EUPEC,全稱歐洲電力半導體與電子公司(European Semiconductors and Electronics Company),成立于1990年。它是由西門子和德國另一家大型電器公司AEG生產電力半導體器件的兩個部門合并而成。這次合并標志著EUPEC正式進入電力半導體領域,憑借其強大的技術背景和豐富的行業經驗,EUPEC迅速在市場中占據了一席之地。
二戰期間,Bliley迎來了其歷史上的一個重要時刻。由于戰爭對通信設備的巨大需求,Bliley的產品成為軍事通信領域的關鍵組件。政府的大量采購合同使得Bliley的銷售額直線上升,員工數量也急劇增加。為了滿足戰爭期間的巨大需求,Bliley不得不擴建工廠,并實行晝夜不停的生產制度。這段時期,Bliley不僅在軍事通信領域取得了顯著成就,同時也為其在戰后的發展奠定了堅實基礎。
在電子產品的保護領域,益升華(Essentra)公司一直走在行業前列。多年前,公司研發團隊發現市場上缺乏一種既輕便又耐用的塑料保護蓋。于是,他們投入大量資源進行研發,經過數百次的試驗和改進,最終成功開發出一種新型的塑料保護蓋,它不僅具備優異的抗沖擊性和耐磨損性,還能有效隔絕外界環境中的靜電和塵埃。這一創新產品迅速獲得市場的認可,為益升華(Essentra)公司帶來了可觀的收益。
隨著全球市場的不斷變化和競爭的加劇,Curtis不斷加強全球布局和戰略合作。公司與多家國際知名企業建立了長期合作關系,共同開發新產品、拓展新市場。此外,Curtis還積極參與國際展覽和交流活動,展示公司的最新技術和產品成果,提高品牌知名度和影響力。這些全球布局和戰略合作有助于Curtis更好地應對市場挑戰、把握發展機遇。
飛翼股份在綠色礦山建設領域取得了顯著成就。作為國內礦山綠色開采行業的龍頭企業,飛翼股份與多家頂尖高校及行業權威專家緊密合作,自主創新了多項技術、裝備,填補了國內行業空白,達到國際先進水平。公司自主研發的膏體充填技術,實現了從源頭解決充填中各子系統間不兼容的難題,確保了系統運行的可靠性和高效性。飛翼股份不僅為礦山行業提供了綠色、環保的解決方案,還積極參與國際交流,推動了全球礦山綠色開采技術的進步。
BREL International Components公司自創立之初,就致力于電子元件的技術創新。在早期階段,公司研發出一款高性能的集成電路,其穩定性和耐用性遠超市場同類產品。這一創新為BREL贏得了眾多客戶的青睞,公司迅速在電子元件市場占據了一席之地。隨著技術的不斷進步,BREL持續推出創新產品,如低功耗的芯片和高速傳輸的連接器,進一步鞏固了其在行業內的領先地位。
現在我想把2410的I2C的兩根線直接和一個16位MCU的I2C連接起來,ARM做主,MCU做從,這樣可以通信嗎?,如可以,哪么這個MCU的地址怎么得到呢?是程序設置的,還是芯片自身固定的? 謝謝。… 查看全部問答∨ |
我曾經借過一個yc2440和sky2440,他們的bsp都不支持kitl調試,還有友善之臂的micro2440,好像也不支持kitl調試?現在找到一個立宇泰 2440 5.0 BSP SMDK2440A的,據說能夠支持kitl調試,但是我是菜鳥,不會移植(也不知道能不能移植到smdk2440上去, ...… 查看全部問答∨ |
最近做時序仿真時,一直出現 Warning: (vsim-SDF-3445) Failed to parse SDF file "edge_dect_v.sdo". 錯誤。之前的時候沒出現過, 加載SDF 時,勾了下面兩個選項,工程建立在 simulation 下面,求指導,… 查看全部問答∨ |
help2416_JSON_Transmit_如何使用開源代碼 replyreload += \',\' + 1730295;一、JSON入門 JSON即JavaScript Object Natation,它是一種輕量級的數據交換格式,非常適合于服務器與JavaScript的交互. 盡管有許多宣傳關于XML如何擁有跨平臺,跨語言的優勢. 然而,除非應用于Web Services,否則在 ...… 查看全部問答∨ |