2、按下按键S1控制LED1.LED2.LED3实现跑马灯效果(CC2540开发寄存器设置)


 

按下按键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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM