/*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;
}
}