对LPC1752的GPIO模块的函数式封装

/*File Name:GPIO.h*/

#ifndef _GPIO_H_
#define _GPIO_H_
#include "..\config.h"
/*GPIO相关函数*/
void gpio_out(INT32U port,INT32U data);//指定的GPIO口输出相应的电平信号
INT8U gpio_in(INT32U port);//读取指定GPIO口的数据
void gpio_set(INT32U port,INT32U dir);//设置指定GPIO口的方向
void gpio_inter(INT32U port,INT32U inter);//设置指定GPIO口的中断方式
INT32U gpio_get_inter_sign(INT32U port,INT32U inter);//读取指定GPIO口的中断标记
void gpio_clr_inter_sign(INT32U port);//清除指定GPIO口的中断标记
#endif

/*File Name:GPIO.c*/

/*GPIO相关函数*/
/*
port:端口号例如P1.25口写做:125
inter:中断标记类型
00 无中断
01 下降沿中断
10 上升沿中断
11 边沿中断
*/
#include "gpio.h"
void gpio_out(INT32U port,INT32U data)//使指定的GPIO口输出相应的电平信号
{
 INT32U p,x;
 p=port/100;
 x=port%100;
 switch(p)
 {
  case 0 : if(data==1){FIO0SET|=(1<<x);}else{FIO0CLR|=(1<<x);}break;
  case 1 : if(data==1){FIO1SET|=(1<<x);}else{FIO1CLR|=(1<<x);}break;
  case 2 : if(data==1){FIO2SET|=(1<<x);}else{FIO2CLR|=(1<<x);}break;
  case 4 : if(data==1){FIO4SET|=(1<<x);}else{FIO4CLR|=(1<<x);}break;
  default: break;
 }
}
INT8U gpio_in(INT32U port)//读取指定GPIO口的数据
{
 INT32U p,x,data;
 p=port/100;
 x=port%100;
 switch(p)
 {
  case 0 : data=FIO0PIN&(1<<x);break;
  case 1 : data=FIO1PIN&(1<<x);break;
  case 2 : data=FIO2PIN&(1<<x);break;
  case 4 : data=FIO4PIN&(1<<x);break;
  default: break;
 }
 if(data==0)
 {
  return 0;
 }
 else
 {
  return 1;
 }
}
/* dir=1为输出,dir=0为输入*/
void gpio_set(INT32U port,INT32U dir)//设置指定GPIO口的方向
{
 INT32U p,x;
 p=port/100;
 x=port%100;
 switch(p)
 {
  case 0 : if(dir==1){FIO0DIR|=(1<<x);}else{FIO0DIR&=(~(1<<x));}break;
  case 1 : if(dir==1){FIO1DIR|=(1<<x);}else{FIO1DIR&=(~(1<<x));}break;
  case 2 : if(dir==1){FIO2DIR|=(1<<x);}else{FIO2DIR&=(~(1<<x));}break;
  case 4 : if(dir==1){FIO4DIR|=(1<<x);}else{FIO4DIR&=(~(1<<x));}break;
  default: break;
 }
 
}
/*
inter:中断标记类型
0 无中断
1 下降沿中断
2 上升沿中断
3 边沿中断
*/
void gpio_inter(INT32U port,INT32U inter)//设置指定GPIO口的中断方式
{
 INT32U p,x,up,down;
 p=port/100;
 x=port%100;
 up=inter>>1;
 down=inter&0x01;
 switch(p)
 {
  case 0 : if(up==1){IO0IntEnr|=(1<<x);}else{IO0IntEnr&=(~(1<<x));}if(down==1){IO0IntEnf|=(1<<x);}else{IO0IntEnf&=(~(1<<x));}break;
  case 1 : break;
  case 2 : if(up==1){IO2IntEnr|=(1<<x);}else{IO2IntEnr&=(~(1<<x));}if(down==1){IO2IntEnF|=(1<<x);}else{IO2IntEnF&=(~(1<<x));}break;
  case 4 : break;
  default: break;
 }
}
INT32U gpio_get_inter_sign(INT32U port,INT32U inter)//读取指定GPIO口的中断标记
{
 INT32U p,x;
 INT32U data=0;
 p=port/100;
 x=port%100;
 switch(p)
 {
  case 0 : if(inter==2){data=(IO0IntStatr&(1<<x));}//上升沿
     if(inter==1){data=(IO0IntStatf&(1<<x));}//下降沿
     break;
  case 1 : break;
  case 2 : if(inter==2){data=(IO2IntStatr&(1<<x));}
     if(inter==1){data=(IO2IntStatF&(1<<x));}
     break;
  case 4 : break;
  default: break;
 }
 return data;
}
void gpio_clr_inter_sign(INT32U port)//清除指定GPIO口的中断标记
{
 INT32U p,x;
 p=port/100;
 x=port%100;
 switch(p)
 {
  case 0 : IO0IntClr=(1<<x);break;
  case 1 : break;
  case 2 : IO2IntClr=(1<<x);break;
  case 4 : break;
  default: break;
 }
 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值