按下按键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
时间: 2024-12-24 16:38:22