LPC1788通用IO口的控制包含了一些基本的组件,比如设置推挽输出,开漏输出,上拉电阻等,我们今天来看看.

  首先使用GPIO要打开GPIO的系统时钟

   

  LPC_SC->PCONP |= (1<<15);//gpio 时钟

  然后需要选择我们选定引脚的功能,有些引脚有多个功能,通过寄存器可以从中选择一个

   

  之后是设置相关引脚的外部电阻状态pinmode寄存器

   

  然后设置开漏方式pinmode_od

  

  到这里,引脚的基本功能就OK了,此时要操作GPIO还需要设置几个东西

  1. 输入输出方向FIODIR

  1. 方向设置之后就可以输入输出了,注意gpio的输入输出是通过三个寄存器完成,输出设置寄存器功能是将io口电平设置为高

  输出为低电平用输出清除寄存器

  

  获取输出状态使用端口值寄存器

  

  另外,当我们想要禁用某些端口的时候可以使用屏蔽寄存器

  

  我们可以看到,寄存器的访问都是三十二位的不是很方便,幸好lpc1768是支持位段操作的,我们可以将寄存器的位段定义成这个样子

//位带操作,实现51类似的GPIO控制功能

//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).

//IO口操作宏定义

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))

#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))

#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))

//IO口地址映射

//输出寄存器

#define GPIO0_ODR_Addr    (LPC_GPIO0_BASE+0x18) //0x2009C018

#define GPIO1_ODR_Addr    (LPC_GPIO1_BASE+0x18) //0x2009C038

#define GPIO2_ODR_Addr    (LPC_GPIO2_BASE+0x18) //0x2009C058

#define GPIO3_ODR_Addr    (LPC_GPIO3_BASE+0x18) //0x2009C078

#define GPIO4_ODR_Addr    (LPC_GPIO4_BASE+0x18) //0x2009C098

//输入寄存器

#define GPIO0_IDR_Addr    (LPC_GPIO0_BASE+0x14) //0x2009C014

#define GPIO1_IDR_Addr    (LPC_GPIO1_BASE+0x14) //0x2009C034

#define GPIO2_IDR_Addr    (LPC_GPIO2_BASE+0x14) //0x2009C054

#define GPIO3_IDR_Addr    (LPC_GPIO3_BASE+0x14) //0x2009C074

#define GPIO4_IDR_Addr    (LPC_GPIO4_BASE+0x14) //0x2009C094

//方向寄存器

#define GPIO0_DIR_Addr    (LPC_GPIO0_BASE+0x00) //0x2009C000

#define GPIO1_DIR_Addr    (LPC_GPIO1_BASE+0x00) //0x2009C020

#define GPIO2_DIR_Addr    (LPC_GPIO2_BASE+0x00) //0x2009C040

#define GPIO3_DIR_Addr    (LPC_GPIO3_BASE+0x00) //0x2009C060

#define GPIO4_DIR_Addr    (LPC_GPIO4_BASE+0x00) //0x2009C080

//清零寄存器

#define GPIO0_CLS_Addr    (LPC_GPIO0_BASE+0x1C) //0x2009C01C

#define GPIO1_CLS_Addr    (LPC_GPIO1_BASE+0x1C) //0x2009C03C

#define GPIO2_CLS_Addr    (LPC_GPIO2_BASE+0x1C) //0x2009C05C

#define GPIO3_CLS_Addr    (LPC_GPIO3_BASE+0x1C) //0x2009C07C

#define GPIO4_CLS_Addr    (LPC_GPIO4_BASE+0x1C) //0x2009C09C

//IO口操作,只对单一的IO口!

//确保n的值小于32!

#define P0high(n)  BIT_ADDR(GPIO0_ODR_Addr,n)  //输出  0输出不变 1输出为1

#define P0low(n)   BIT_ADDR(GPIO0_CLS_Addr,n)  // 清除   0输出不变 1输出0

#define P0in(n)    BIT_ADDR(GPIO0_IDR_Addr,n)  //输入

#define P0dir(n)   BIT_ADDR(GPIO0_DIR_Addr,n)  //方向 0输入1输出

#define P1high(n)  BIT_ADDR(GPIO1_ODR_Addr,n)  //输出  0输出不变 1输出为1

#define P1low(n)   BIT_ADDR(GPIO1_CLS_Addr,n)  // 清除   0输出不变 1输出0

#define P1in(n)    BIT_ADDR(GPIO1_IDR_Addr,n)  //输入

#define P1dir(n)   BIT_ADDR(GPIO1_DIR_Addr,n)  //方向 0输入1输出

#define P2high(n)  BIT_ADDR(GPIO2_ODR_Addr,n)  //输出  0输出不变 1输出为1

#define P2low(n)   BIT_ADDR(GPIO2_CLS_Addr,n)  // 清除   0输出不变 1输出0

#define P2in(n)    BIT_ADDR(GPIO2_IDR_Addr,n)  //输入

#define P2dir(n)   BIT_ADDR(GPIO2_DIR_Addr,n)  //方向 0输入1输出

#define P3high(n)  BIT_ADDR(GPIO3_ODR_Addr,n)  //输出  0输出不变 1输出为1

#define P3low(n)   BIT_ADDR(GPIO3_CLS_Addr,n)  // 清除   0输出不变 1输出0

#define P3in(n)    BIT_ADDR(GPIO3_IDR_Addr,n)  //输入

#define P3dir(n)   BIT_ADDR(GPIO3_DIR_Addr,n)  //方向 0输入1输出

#define P4high(n)  BIT_ADDR(GPIO4_ODR_Addr,n)  //输出  0输出不变 1输出为1

#define P4low(n)   BIT_ADDR(GPIO4_CLS_Addr,n)  // 清除   0输出不变 1输出0

#define P4in(n)    BIT_ADDR(GPIO4_IDR_Addr,n)  //输入

#define P4dir(n)   BIT_ADDR(GPIO4_DIR_Addr,n)  //方向 0输

这样就可以很方便的控制IO口的输入输出方向和设置值以及获取值了(否则在某些io口模仿iic的应用中烦得要死啊).

给一个相关的代码

//led为p2.0

void LedInit(void)

{

LPC_SC->PCONP |= (1<<15);//打开GPIO时钟

LPC_PINCON->PINSEL4 &= ~(0X03L<<0);//gpio功能

LPC_PINCON->PINMODE4 &= ~(0X03L<<0);//上拉电阻

LPC_PINCON->PINMODE_OD2 &= ~(0X01<<0);//推挽模式

P2dir(0) = 1;//输出

P2high(0) = 1;//初始化高电平,灯灭

}

void LedSet(u8 set)

{

if(set)P2high(0) = 1;

else P2low(0) = 1;

}

最新文章

  1. [连载]《C#通讯(串口和网络)框架的设计与实现》- 7.外部接口的设计
  2. DIV+CSS布局
  3. win32程序通过LPCREATESTRUCT中的lpCreateParams传递参数给窗口过程函数
  4. 54B
  5. C语言修炼-第2天
  6. Javascript DOM基础(二) childNodes、children
  7. android 实现2张图片层叠效果
  8. hdu - 1829 A Bug&#39;s Life (并查集)&amp;&amp;poj - 2492 A Bug&#39;s Life &amp;&amp; poj 1703 Find them, Catch them
  9. asp.net 通过ajax方式调用webmethod方法使用自定义类传参及获取返回参数
  10. 第三方类AFNetworking
  11. js 比较两个日期的大小的例子
  12. Java当中的运算符
  13. java环境变量设置--编写一年java,竟不会配变量了
  14. 何为PostgreSQL?
  15. 操作系统--进程管理1--单个CPU情况
  16. MAC - PhpStorm安装调试环境xdebug
  17. 用 fhq_Treap 实现可持久化平衡树
  18. Mysql-表的完整性约束
  19. vue 特点
  20. 用java输入分数,得出分数等级

热门文章

  1. easyui实现权限管理
  2. 空指针错误 java.lang.NullPointerException
  3. UVALive 2403 77377解题报告(深搜)
  4. 从内存溢出看Java 环境中的内存结构(转)
  5. R语言——绘图函数深入学习
  6. 【linux系统学习】计算机硬件核心知识
  7. discuz 添加板块失败解决办法
  8. spring,hibernate配置事务
  9. codeforces 369 div2 C dp
  10. Sichuan State Programming Contest 2012 C。Counting Pair