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

📄 iooperate.c

📁 Keil平台
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "config.h"
/*********************************************************************************************************
** 函数名称: SetIO_Func
** 功能描述: 设置IO口引脚的功能  
** 输 入:   IoPort:高8位中高4字节表示该IO口在P口为Pn,低4位表示该定义包含IO口上下拉状态(0:上拉,1:保留,2:悬空,3:下拉
),其中低8位表示IO口在IO组中的位置, InOut当作为IO口时的输入输出控制 0:输入 1:输出)
** 输 出:   ERR_OP           //操作失败      NO_ERR          //操作成功
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 单长城
** 日 期: 2007-6-21
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/

uint8 SetIO_Func(uint16 IoPort ,uint8 Fuct,uint8 InOut)
{
    uint8   PortNum,err;
    uint32  Pull,Sift;
//                OS_ENTER_CRITICAL();
    err=NO_ERR;
    PortNum=IoPort>>12;                  //取出IO口选项
    Pull=(IoPort&0x0F00)>>8;            //取出连续IO口上下拉状态
    if(Pull==1) Pull=0x02;              //禁止设置保留状态
    IoPort=IoPort&0x001F;               //取出IO的位置
    switch(PortNum)
    {
        case 0:             //P0口
        {   
//            SCS |= FAST_PORT;     //设定为高速口
            if(IoPort<16)        //低16个IO口
            {
                Sift=IoPort<<1;
                PINMODE0=(PINMODE0 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift);   //上下拉状态
                PINSEL0=(PINSEL0 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift);     //IO 功能
            }
            else
            {
                Sift=(IoPort-16)<<1;
                PINMODE1=(PINMODE1 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift);   //上下拉状态
                PINSEL1=(PINSEL1 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift);    //IO 功能
            }            
            if(Fuct==0)
            {
                if(InOut==DIR_IN)
                {
                    FIO0DIR =FIO0DIR&(~((uint32)(0x1)<<IoPort));
                }
                else
                {
                    FIO0DIR =FIO0DIR|((uint32)(0x1)<<IoPort);
                }
            }
        }break;
        case 1:             //P1口
        {
//            SCS |= FAST_PORT;     //设定为高速口
            if(IoPort<16)        //低16个IO口
            {
                Sift=IoPort<<1;
                PINMODE2=(PINMODE2 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift);   //上下拉状态
                PINSEL2=(PINSEL2 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift);     //IO 功能
            }
            else
            {
                Sift=(IoPort-16)<<1;
                PINMODE3=(PINMODE3 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift);   //上下拉状态
                PINSEL3=(PINSEL3 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift);    //IO 功能
            }            
            if(Fuct==0)
            {
                if(InOut==DIR_IN)
                {
                    FIO1DIR =FIO1DIR&(~((uint32)(0x1)<<IoPort));
                }
                else
                {
                    FIO1DIR =FIO1DIR|((uint32)(0x1)<<IoPort);
                }
            }
        }break;
        case 2:             //P2口
        {
            if(IoPort<16)        //低16个IO口
            {
                Sift=IoPort<<1;
                PINMODE4=(PINMODE4 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift);   //上下拉状态
                PINSEL4=(PINSEL4 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift);     //IO 功能
            }
            else
            {
                Sift=(IoPort-16)<<1;
                PINMODE5=(PINMODE5 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift);   //上下拉状态
                PINSEL5=(PINSEL5 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift);    //IO 功能
            }            
            if(Fuct==0)
            {
                if(InOut==DIR_IN)
                {
                    FIO2DIR =FIO2DIR&(~((uint32)(0x1)<<IoPort));
                }
                else
                {
                    FIO2DIR =FIO2DIR|((uint32)(0x1)<<IoPort);
                }
            }
        }break;
        case 3:             //P3口
        {
            if(IoPort<16)        //低16个IO口
            {
                Sift=IoPort<<1;
                PINMODE6=(PINMODE6 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift);   //上下拉状态
                PINSEL6=(PINSEL6 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift);     //IO 功能
            }
            else
            {
                Sift=(IoPort-16)<<1;
                PINMODE7=(PINMODE7 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift);   //上下拉状态
                PINSEL7=(PINSEL7 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift);    //IO 功能
            }            
            if(Fuct==0)
            {
                if(InOut==DIR_IN)
                {
                    FIO3DIR =FIO3DIR&(~((uint32)(0x1)<<IoPort));
                }
                else
                {
                    FIO3DIR =FIO3DIR|((uint32)(0x1)<<IoPort);
                }
            }
        }break;
        case 4:             //P4口
        {
            if(IoPort<16)        //低16个IO口
            {
                Sift=IoPort<<1;
                PINMODE8=(PINMODE8 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift);   //上下拉状态
                PINSEL8=(PINSEL8 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift);     //IO 功能
            }
            else
            {
                Sift=(IoPort-16)<<1;
                PINMODE9=(PINMODE9 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift);   //上下拉状态
                PINSEL9=(PINSEL9 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift);    //IO 功能
            }            
            if(Fuct==0)
            {
                if(InOut==DIR_IN)
                {
                    FIO4DIR =FIO4DIR&(~((uint32)(0x1)<<IoPort));
                }
                else
                {
                    FIO4DIR =FIO4DIR|((uint32)(0x1)<<IoPort);
                }
            }
        }break;
        default:            //错误设置
        {
            err=ERR_OP;
        }break;
    }
//                OS_EXIT_CRITICAL();
    return err;
}

/*********************************************************************************************************
** 函数名称: SetIO
** 功能描述: 置位IO口引脚的  高8位中高4字节表示该IO口在P口为Pn,低4位表示该定义包含IO口上下拉状态(0:上拉,1:保留,2:悬
空,3:下拉),其中低8位表示IO口在IO组中的位置
** 输 入:   
** 输 出:   ERR_OP           //操作失败      NO_ERR          //操作成功 
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 单长城
** 日 期: 2007-6-22
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
uint8 SetIO(uint16 IoPort)
{
    uint8  PortNum,err;
    PortNum=IoPort>>12;
    IoPort&=0x1F;
    err=NO_ERR;
    switch(PortNum)
    {
        case 0:
        {
            FIO0SET=(uint32)(0x01)<<IoPort;
        }break;
        case 1:
        {
            FIO1SET=(uint32)(0x01)<<IoPort;
        }break;
        case 2:
        {
            FIO2SET=(uint32)(0x01)<<IoPort;
        }break;
        case 3:
        {
            FIO3SET=(uint32)(0x01)<<IoPort;
        }break;
        case 4:
        {
            FIO4SET=(uint32)(0x01)<<IoPort;
        }break;
        default:
        {
            err=ERR_OP;
        }break;
    }
    return err;
}
/*********************************************************************************************************
** 函数名称: ClrIO
** 功能描述: 清零IO口引脚的  高8位中高4字节表示该IO口在P口为Pn,低4位表示该定义包含IO口上下拉状态(0:上拉,1:保留,2:悬
空,3:下拉),其中低8位表示IO口在IO组中的位置
** 输 入:   
** 输 出:   ERR_OP           //操作失败      NO_ERR          //操作成功 
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 单长城
** 日 期: 2007-6-22
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:

⌨️ 快捷键说明

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