按下按鍵S1控制LED1.LED2.LED3實現跑馬燈效果
1 /**************************************************************************** 2 * 文 件 名: main.c 3 * 作 者: Amo [ www.amoMcu.com 阿莫單片機] 4 * 修 訂: 2014-04-08 5 * 版 本: 1.0 6 * 描 述: 按下按鍵S1控制LED1.LED2.LED3實現跑馬燈效果 7 ****************************************************************************/ 8 #include <ioCC2540.h> 9 10 typedef unsigned char uchar; 11 typedef unsigned int uint; 12 13 #define LED1 P1_0 // 定義P1.0口為LED1控制端 14 #define LED2 P1_1 // 定義P1.1口為LED2控制端 15 #define LED3 P1_4 // 定義P1.4口為LED3控制端 16 #define KEY1 P0_1 // 定義P0.1口為S1控制端 17 #define ON 1 18 #define OFF 0 19 20 /**************************************************************************** 21 * 名 稱: DelayMS() 22 * 功 能: 以毫秒為單位延時,系統時鍾不配置時默認為16M(用示波器測量相當精確) 23 * 入口參數: msec 延時參數,值越大,延時越久 24 * 出口參數: 無 25 ****************************************************************************/ 26 void DelayMS(uint msec) 27 { 28 uint i,j; 29 30 for (i=0; i<msec; i++) 31 for (j=0; j<535; j++); 32 } 33 34 /**************************************************************************** 35 * 名 稱: LedOnOrOff() 36 * 功 能: 點亮或熄滅所有LED燈 37 * 入口參數: mode為1時LED燈亮 mode為0時LED燈滅 38 * 出口參數: 無 39 ****************************************************************************/ 40 void LedOnOrOff(uchar mode) 41 { 42 LED1 = mode; 43 LED2 = mode; 44 LED3 = mode; 45 } 46 47 /**************************************************************************** 48 * 名 稱: InitLed() 49 * 功 能: 設置LED相應的IO口 50 * 入口參數: 無 51 * 出口參數: 無 52 ****************************************************************************/ 53 void InitLed(void) 54 { 55 P1DIR |= 0x13; // P1.0、P1.1、P1.4定義為輸出 56 LedOnOrOff(0); // 使所有LED燈默認為熄滅狀態 57 } 58 59 /**************************************************************************** 60 * 名 稱: InitKey() 61 * 功 能: 設置按鍵相應的IO口 62 * 入口參數: 無 63 * 出口參數: 無 64 ****************************************************************************/ 65 void InitKey(void) 66 { 67 P0SEL &= ~0x02; //設置P0.1為普通IO口 68 P0DIR &= ~0x02; //按鍵接在P0.1口上,設P0.1為輸入模式 69 P0INP &= ~0x02; //打開P0.1上拉電阻 70 } 71 72 /**************************************************************************** 73 * 名 稱: KeyScan() 74 * 功 能: 讀取按鍵狀態 75 * 入口參數: 無 76 * 出口參數: 0為抬起 1為按鍵按下 77 ****************************************************************************/ 78 uchar KeyScan(void) 79 { 80 if (KEY1 == 0) 81 { 82 DelayMS(10); //延時10MS去抖 83 if (KEY1 == 0) 84 { 85 while(!KEY1); //松手檢測 86 return 1; //有按鍵按下 87 } 88 } 89 90 return 0; //無按鍵按下 91 } 92 93 /**************************************************************************** 94 * 程序入口函數 95 ****************************************************************************/ 96 void main(void) 97 { 98 InitLed(); //設置LED燈相應的IO口 99 InitKey(); //設置按鍵S1相應的IO口 100 101 while(1) 102 { 103 DelayMS(2); 104 if (KeyScan()) //掃描按鍵當前狀態,按下時執行跑馬燈效果 105 { 106 LED1 = ON; //點亮LED1 107 DelayMS(500); 108 LED1 = OFF; //熄滅LED1 109 LED2 = ON; 110 DelayMS(500); 111 LED2 = OFF; 112 LED3 = ON; 113 DelayMS(500); 114 LED3 = OFF; 115 } 116 } 117 }
這里的引腳使用要經過配置,這是和51不同之處,這個和寄存器有關!!!
一個端口對應幾個寄存器來對其屬性進行說明:
按照表格寄存器的內容, 對 P1.0、 P1.1 、 P1.4 進行配置, 當 IO 口輸出高電平時 Led 被點亮。
所以配置如下:
P1SEL &=~0x13; //配置 P1.0、 P1.1 、 P1.4 為通用 IO 口
P1DIR |= 0x13; //配置 P1.0、 P1.1 、 P1.4 為輸出
由於 CC2540 寄存器初始化時默認值為(詳細說明請參考 CC2530 數據手冊(中文) .pdf,適用於 CC2540 和 CC2541 ):
P1SEL = 0x00;
P1DIR |= 0xff;
P1INP = 0x00;
所以 IO 口配置可簡化為:
53 void InitLed(void) 54 { 55 P1DIR |= 0x13; // P1.0、P1.1、P1.4定義為輸出 56 LedOnOrOff(0); // 使所有LED燈默認為熄滅狀態 57 }
P0.1 要設成輸入:
65 void InitKey(void) 66 { 67 P0SEL &= ~0x02; //設置P0.1為普通IO口 68 P0DIR &= ~0x02; //按鍵接在P0.1口上,設P0.1為輸入模式 69 P0INP &= ~0x02; //打開P0.1上拉電阻 70 }
資料:http://pan.baidu.com/s/1z503W