本問主要介紹了CC2530處理器的通用輸入/輸出接口(GPIO),以及GPIO的位操作,理解GPIO的基本原理和功能,最后使用C語言驅動CC2530的GPIO實現對信號燈的控制。
CC2530的GPIO引腳有3個8位端口,分別是端口0,端口1和端口2,分別表示位P0,P1,P2,其中P0和P1是8位端口,而P2只有5位可用,所有端口均可以通過SFR寄存器來進行位尋址和字節尋址。
寄存器PxSEL中的x表示端口0~2,用來設置端口的每個引腳位GPIO(0)或者外部設備輸入信號(1),在默認情況下,當復位之后,所有的數字輸入/輸出引腳都設置為通用輸入引腳。
寄存器PxDIR用來改變一個端口引腳的方向,0設置為輸入,1設置為輸出。
GPIO一般是通過位操作完成寄存器設置的,而常用的位操作符有按位與“&”,按位或“|”,按位取反“~”,按位異或“^”,以及左移“<<”和右移“>>”操作。值得注意的是常使用按位或運算符將一個數據位置1,比如將P0端口方向寄存器的第一位和第二位置1(P0端口的0和1引腳置為輸出模式),可以寫為P0DIR |= 0x03;常使用按位與“&”將一個數據位置0,比如P0SEL &= ~0x03;,表示將將端口0和1配置位GPIO模式。
通過查看電路圖,實現CC2530微處理器開發板上的紅燈亮,只需使P0_1為0即可。
驅動程序如下:
1 #include "iocc2530.h" 2 3 #define uint unsigned int 4 #define uchar unsigned char 5 6 #define Rled P1_1 7 #define Gled P1_0 8 #define ON 0 9 #define OFF 1 10 #define Key1 P1_4 11 12 void delay(uint n){//定義延時函數 13 uint i, j; 14 for(i = 0; i < n; i++) 15 for(j = 500; j >= 0; j--); 16 } 17 void key_init(){ 18 P1SEL &= 0x10;//GPIO模式 19 P1DIR &= 0x10;//輸出模式 20 } 21 void led_init(){ 22 P1SEL &= ~0x03;//GPIO模式 23 P1DIR |= 0x03; //輸出模式 24 25 Rled = OFF; 26 Gled = OFF; 27 } 28 void main() 29 { 30 led_init();//led初始化 31 key_init();//案件初始化 32 Rled = ON;//打開紅燈 33 34 while(1){ 35 if(Key1 == ON){ 36 delay(1000); //消抖 37 if(Key1 == ON){ 38 while(Key1 == ON);//松手檢測 39 40 Rled = ~Rled; 41 } 42 } 43 } 44 }
燒寫完成后,可以看到綠燈常亮,按鍵被按下之后紅燈改變一次狀態,功能完成。
需要思考的是有時按鍵控制led時不太準確,后者說不太靈敏,從而引入下一節,通過中斷使得按鍵控制led更加準確。
編輯:hfy
-
處理器
+關注
關注
68文章
19259瀏覽量
229653 -
led
+關注
關注
242文章
23252瀏覽量
660590 -
寄存器
+關注
關注
31文章
5336瀏覽量
120232
發布評論請先 登錄
相關推薦
評論