⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpio.cpp

📁 蓝宇BBPC-SOM2496嵌入式主板 GPIO实例代码与函数库
💻 CPP
字号:
#include <dos.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "GPIO.h"

/***************************************************************************
片上通用IO方向配制函数:		PIODirCfg
入口参数:	int		PIO_BIT_INDEX  cpu 上双向IO索引号
		char		Dir		=0,表示输入,=1表示输出,=2表示正常功能
返回值	:	char		=0,表示成功,非零表示失败

****************************************************************************/
char 	 PIODirCfg(int PIO_BIT_INDEX,  char Dir )
{
	unsigned int PIOBitMask=1;			/*PIO_BIT_INDEX,对应的掩码*/
	unsigned int PIOModeR;				/*模式寄存器的IO地址*/
	unsigned int PIODirR;				/*方向寄存器的IO地址*/
	if(PIO_BIT_INDEX>15)
	{
		PIO_BIT_INDEX-=16;
		PIOBitMask<<=PIO_BIT_INDEX;
		PIOModeR=OFFS_PIOMODE1+CTL_OFF;
		PIODirR =OFFS_PIODIR1 +CTL_OFF;		
	}	
	else
	{	
		PIOBitMask<<=PIO_BIT_INDEX;
		PIOModeR=OFFS_PIOMODE0+CTL_OFF;
		PIODirR =OFFS_PIODIR0 +CTL_OFF;
	}
	if(Dir==0)	/*表示配制为输入*/
	{		  
    		 outport( PIOModeR,inport (PIOModeR)& ~PIOBitMask);/*模式寄存器相应的位清零*/
    		 outport( PIODirR ,inport (PIODirR) |  PIOBitMask);/*模式寄存器相应的位置1*/
	}	
	else if(Dir==1)
	{
			 outport( PIOModeR,inport (PIOModeR)|PIOBitMask);/*模式寄存器相应的位置1*/
			 outport( PIODirR ,inport (PIODirR) &~PIOBitMask);/*模式寄存器相应的位清零*/
	}
	else if(Dir==2)
	{
			 outport( PIOModeR,inport (PIOModeR)&~PIOBitMask);/*模式寄存器相应的位清零*/
			 outport( PIODirR ,inport (PIODirR) &~PIOBitMask);/*模式寄存器相应的位清零*/
	}		
	return 0;	
}               
/***************************************************************************
片上通用IO写函数:		PIOWrite
入口参数:	int		PIO_BIT_INDEX  cpu 上双向IO索引号
		char		Val		=0,表示输出低电平,非零表示输出高电平
返回值	:	char		=0,表示成功,非零表示失败,方向设置有错
注意:		函数功能,只有在相应的位方向设置为输出时,才是有效的 		
****************************************************************************/
char 	PIOWrite(int PIO_BIT_INDEX,  char Val ) 
{
	unsigned int PIOBitMask=1;			/*PIO_BIT_INDEX,对应的掩码*/
	unsigned int PIOModeR;				/*模式寄存器的IO地址*/
	unsigned int PIODirR;				/*方向寄存器的IO地址*/
	unsigned int PIODataR;				/*数据口寄存器*/
	if(PIO_BIT_INDEX>15)
	{
		PIO_BIT_INDEX-=16;
		PIOBitMask<<=PIO_BIT_INDEX;
		PIOModeR=OFFS_PIOMODE1+CTL_OFF;
		PIODirR =OFFS_PIODIR1 +CTL_OFF;	
		PIODataR=OFFS_PIODATA1+CTL_OFF;
	}	
	else
	{	
		PIOBitMask<<=PIO_BIT_INDEX;
		PIOModeR=OFFS_PIOMODE0+CTL_OFF;
		PIODirR =OFFS_PIODIR0 +CTL_OFF;
		PIODataR=OFFS_PIODATA0+CTL_OFF;
	}	
	if((inport (PIOModeR)&PIOBitMask)==0)	/*检查有效性*/
	{
		return 1;		/*表示方向不对*/	
    	}	 
	if((inport (PIODirR)&PIOBitMask)!=0)	/*检查有效性*/
	{
		return 1;		/*表示方向不对*/	
    	}	     	
	if(Val==0)
		outport( PIODataR,inport (PIODataR)& ~PIOBitMask);/*模式寄存器相应的位清零*/
	else
		outport( PIODataR,inport (PIODataR)|PIOBitMask);/*模式寄存器相应的位置1*/
	return 0;	

}
/***************************************************************************
片上通用IO读函数:		PIORead
入口参数:	int		PIO_BIT_INDEX  cpu 上双向IO索引号
		char		Val		
返回值	:	char		=0,表示输入为低电平,=1表示输入高电平,=3,表示失败,方向设置有错
注意:		函数功能,只有在相应的位方向设置为输入时,才是有效的 		
****************************************************************************/
char PIORead(int PIO_BIT_INDEX ) 
{
	unsigned int PIOBitMask=1;			/*PIO_BIT_INDEX,对应的掩码*/
	unsigned int PIOModeR;				/*模式寄存器的IO地址*/
	unsigned int PIODirR;				/*方向寄存器的IO地址*/
	unsigned int PIODataR;				/*数据口寄存器*/
	char val;					/*读的值*/
	if(PIO_BIT_INDEX>15)
	{
		PIO_BIT_INDEX-=16;
		PIOBitMask<<=PIO_BIT_INDEX;
		PIOModeR=OFFS_PIOMODE1+CTL_OFF;
		PIODirR =OFFS_PIODIR1 +CTL_OFF;	
		PIODataR=OFFS_PIODATA1+CTL_OFF;
	}	
	else
	{	
		PIOBitMask<<=PIO_BIT_INDEX;
		PIOModeR=OFFS_PIOMODE0+CTL_OFF;
		PIODirR =OFFS_PIODIR0 +CTL_OFF;
		PIODataR=OFFS_PIODATA0+CTL_OFF;
	}	
	if((inport (PIOModeR)&PIOBitMask)!=0)	/*检查有效性*/
	{
		return 3;		/*表示方向不对*/	
    	}	 
	if((inport (PIODirR)&PIOBitMask)==0)	/*检查有效性*/
	{
		return 3;		/*表示方向不对*/	
    	}	     	
	if(inport (PIODataR)& PIOBitMask)
		val=1;				/*输入高电平*/
	else		
		val=0;				/*输入低电平*/		
	return val;	
}
/***************************************************************************
扩展板上单向IO读函数:		EXTGPIORead
扩展IO输入,对应信号线GP17,GP16,GP15,GP14,GP13,GP12,GP11,GP10
入口参数:	
返回值	:	char		相应数据位等于0,表示输入为低电平,=1表示输入高电平
****************************************************************************/
unsigned char EXTGP1Read(void) 
{
	return inportb (GPIO1_PORT);
}
/***************************************************************************
扩展板上单向IO读函数:		EXTGP2WRITE
扩展IO输出,对应信号线GP25,GP24,GP23,GP22,GP21,GP20的数据位BIT5.....BIT0
入口参数:
返回值	:	VOID
****************************************************************************/
void  EXTGP2WRITE(unsigned char Val)
{
	 outportb(GPIO2_PORT, (inportb (GPIO2_PORT)&0xC0)|Val);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -