LPC2124--GPIO按键控制LED灯的闪烁

实例目的

实例目的:掌握Proteus软件的使用及调试方法,学习IO编程。
实例内容:
 学习使用Proteus、ADS、Keil for ARM软件,掌握绘制原理及编译程序。
 键盘输入,当检测到有按键输入时,对发光二极管进行取反控制。使用
I/O口输入方式对按键进行扫描。
实例步骤:
 在Proteus中绘制原理图。
 在Keil for ARM中输入程序,并编译通过。
 加载ELF程序,观察仿真结果。
 采用KEIL for ARM与PROTEUS的整合方式联调。

知识点概括

LPC2000系列作为 “微控制器”,其GPIO特性就显得很
重要。它具有如下的特性:
①可以独立控制每个GPIO口的方向(输入/输出模式);
②可以独立设置每个GPIO的输出状态(高/低电平);
③所有GPIO口在复位后默认为输入状态。

LPC2114/2124微控制器具有两个端口--P0和P1,可以作为GPIO使用的引脚数为46个。
LPC2210/2212/2214微控制器还包含另外两个端口--P2和P3,这个两个端口与外部存储器总线复用,当它们全部作为GPIO使用时,GPIO引脚数多达112个

GPIO与控制寄存器的关系


相关寄存器描述



GPIO引脚值寄存器-IOxPIN


GPIO方向控制寄存器-IOxDIR:


GPIO输出置位寄存器-IOxSET:


GPIO输出清零寄存器-IOxCLR:


注意

①引脚设置为输出方式时,输出状态由IOxSET和IOxCLR中最后操作的寄存器决定;
②大部分GPIO输出为推挽方式(个别引脚为开漏输出),正常拉出/灌入电流均为4mA(短时间极限值40mA);
③复位后默认所有GPIO为输入模式。。

实例描述

功能:键盘输入.当检测到有按键输入时,对发光二极管进行取反控制 使用I/O口输入方式对按键进行扫描

平台:NXP-LPC2124

环境:Keil4 + Proteus7

要求如图


/******************************************************************************/
/*  This file is part of the uVision/ARM development tools                    */
/*  Copyright KEIL ELEKTRONIK GmbH 2002-2004                                  */
/*******************************************************************************       
*File:Main.c
*功能: 键盘输入.当检测到有按键输入时,对发光二极管进行取反控制
*      使用I/O口输入方式对按键进行扫描
*******************************************************************************/

#include   "config.h"


#define     LEDCON           0x00000200   // P0.9引脚控制LED,低电平点亮
#define     KEY              0x00008000   // P0.15引脚连接按键

/*******************************************************************************
*名称:WaitKey()
*功能:等待一个有效按键.本函数有去抖功能
*******************************************************************************/

void WaitKey(void)
{  
    uint32 i;
    while(1)
    { 
		// 当按下P0.15以后会输出低电平, P0.15位为0
        while((IO0PIN & KEY) != 0);          // 等待按键按下, IO0PIN & KEY) != 0表示IO0PIN的P0.15不是0, 标识没有按下
        
		for(i = 0; i < 50000; i++);          // 延时消抖 
		// 电路中的脉冲可能不稳定, 也就是说可能出现, 电平瞬时反转的情况
		// 而且按下的过程, 由于两块电极有一定的抖动, 这段时间电平不稳定, 
		// 因此应该写程序消除电极抖动产生的影响
		// 
		// 我们开始先判断电极P0.15是不是按下了, 如果按下了, 就延时一定时间再判断P0.15是不是按下了[p0.15 == 0]
		// 如果两次检测都P0.15 == 0我们才认为是一个有效的按下事件
        
		if((IO0PIN & KEY) == 0)				 // 如果IO0PIN的P0.15位引脚为0, 说明按下了P0.15
		{	
			break;				 			// 停止等的闪烁
    	}
	}
   
    // 只有当用户松开以后, LED灯才应该亮
    while((IO0PIN & KEY) == 0);              // 等待按键放开
}

/*******************************************************************************
*名称:main()
*功能:读取按键,控制LED闪烁
*******************************************************************************/
int main(void)
{ 
    PINSEL0 = 0x00000000;                  	// 设置所有引脚连接GPI0[功能选择]
    PINSEL1 = 0x00000000;					// 

    IO0DIR  |= LEDCON;                       // 设置LED控制口为输出,其它I/O为输入[将P0.9置1, P0.9用于输出]
    
	while( 1 )
    { 
        IO0SET |= LEDCON;					// 将P0.9引脚设置为输出高电平 = 1[LED灯暗]
        WaitKey( );
										    // 	将P0.9引脚设置为输出低电平 = 0[LED灯亮]
        IO0CLR = LEDCON;
        WaitKey( );

    }
 }


  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值