📄 its_digio.c
字号:
/***********************************************************************************
Filename: ITS_digio.c
Copyright 2007 Texas Instruments, Inc.
***********************************************************************************/
#include "ITS_types.h"
#include "ITS_defs.h"
#include "ITS_board.h"
#include "ITS_int.h"
#include "ITS_digio.h"
static ISR_FUNC_PTR port1_isr_tbl[8] = {0};
static ISR_FUNC_PTR port2_isr_tbl[8] = {0};
//----------------------------------------------------------------------------------
// uint8 ITSDigioConfig(const digioConfig* p)
//
// DESCRIPTION:
// Configure the pin as specified by p.
//----------------------------------------------------------------------------------
uint8 ITSDigioConfig(const digioConfig* p)
{
register volatile uint8* dir;
register volatile uint8* out;
register const uint8 bitmask = p->pin_bm;
// Sanity check
if ((bitmask == 0) || (bitmask != (uint8)BV(p->pin)))
{
return(HAL_DIGIO_ERROR);
}
switch(p->port)
{
case 1: P1SEL &= ~bitmask; out = &P1OUT; dir = &P1DIR; break;
case 2: P2SEL &= ~bitmask; out = &P2OUT; dir = &P2DIR; break;
default: return(HAL_DIGIO_ERROR);
}
if (p->dir == HAL_DIGIO_OUTPUT)
{
if (p->initval == 1)
{
*out |= bitmask;
}
else
{
*out &= ~bitmask;
}
*dir |= bitmask;
}
else // input
{
*out &= ~bitmask;
*dir &= ~bitmask;
}
return(HAL_DIGIO_OK);
}
//----------------------------------------------------------------------------------
// uint8 ITSDigioSet(digioConfig* p)
//----------------------------------------------------------------------------------
uint8 ITSDigioSet(const digioConfig* p)
{
if (p->dir == HAL_DIGIO_OUTPUT)
{
switch (p->port)
{
case 1: P1OUT |= p->pin_bm; break;
case 2: P2OUT |= p->pin_bm; break;
default: return(HAL_DIGIO_ERROR);
}
return(HAL_DIGIO_OK);
}
return(HAL_DIGIO_ERROR);
}
//----------------------------------------------------------------------------------
// uint8 ITSDigioClear(const digioConfig* p)
//----------------------------------------------------------------------------------
uint8 ITSDigioClear(const digioConfig* p)
{
if (p->dir == HAL_DIGIO_OUTPUT)
{
switch (p->port)
{
case 1: P1OUT &= ~p->pin_bm; break;
case 2: P2OUT &= ~p->pin_bm; break;
default: return(HAL_DIGIO_ERROR);
}
return(HAL_DIGIO_OK);
}
return(HAL_DIGIO_ERROR);
}
//----------------------------------------------------------------------------------
// uint8 ITSDigioToggle(const digioConfig* p)
//----------------------------------------------------------------------------------
uint8 ITSDigioToggle(const digioConfig* p)
{
if (p->dir == HAL_DIGIO_OUTPUT)
{
switch (p->port)
{
case 1: P1OUT ^= p->pin_bm; break;
case 2: P2OUT ^= p->pin_bm; break;
default: return(HAL_DIGIO_ERROR);
}
return(HAL_DIGIO_OK);
}
return(HAL_DIGIO_ERROR);
}
//----------------------------------------------------------------------------------
// uint8 ITSDigioGet(const digioConfig* p)
//----------------------------------------------------------------------------------
uint8 ITSDigioGet(const digioConfig* p)
{
if (p->dir == HAL_DIGIO_INPUT)
{
switch (p->port)
{
case 1: return (P1IN & p->pin_bm ? 1 : 0);
case 2: return (P2IN & p->pin_bm ? 1 : 0);
default: break;
}
}
return(HAL_DIGIO_ERROR);
}
//----------------------------------------------------------------------------------
// uint8 ITSDigioIntConnect(const digioConfig *p, ISR_FUNC_PTR func)
//----------------------------------------------------------------------------------
uint8 ITSDigioIntConnect(const digioConfig *p, ISR_FUNC_PTR func)
{
istate_t key;
HAL_INT_LOCK(key);
switch (p->port)
{
case 1: port1_isr_tbl[p->pin] = func; break;
case 2: port2_isr_tbl[p->pin] = func; break;
default: HAL_INT_UNLOCK(key); return(HAL_DIGIO_ERROR);
}
ITSDigioIntClear(p);
HAL_INT_UNLOCK(key);
return(HAL_DIGIO_OK);
}
//----------------------------------------------------------------------------------
// uint8 ITSDigioIntEnable(const digioConfig *p)
//----------------------------------------------------------------------------------
uint8 ITSDigioIntEnable(const digioConfig *p)
{
switch (p->port)
{
case 1: P1IE |= p->pin_bm; break;
case 2: P2IE |= p->pin_bm; break;
default: return(HAL_DIGIO_ERROR);
}
return(HAL_DIGIO_OK);
}
//----------------------------------------------------------------------------------
// uint8 ITSDigioIntDisable(const digioConfig *p)
//----------------------------------------------------------------------------------
uint8 ITSDigioIntDisable(const digioConfig *p)
{
switch (p->port)
{
case 1: P1IE &= ~p->pin_bm; break;
case 2: P2IE &= ~p->pin_bm; break;
default: return(HAL_DIGIO_ERROR);
}
return(HAL_DIGIO_OK);
}
//----------------------------------------------------------------------------------
// uint8 ITSDigioIntClear(const digioConfig *p)
//----------------------------------------------------------------------------------
uint8 ITSDigioIntClear(const digioConfig *p)
{
switch (p->port)
{
case 1: P1IFG &= ~p->pin_bm; break;
case 2: P2IFG &= ~p->pin_bm; break;
default: return(HAL_DIGIO_ERROR);
}
return(HAL_DIGIO_OK);
}
//----------------------------------------------------------------------------------
// uint8 ITSDigioIntSetEdge(const digioConfig *p, uint8 edge)
//----------------------------------------------------------------------------------
uint8 ITSDigioIntSetEdge(const digioConfig *p, uint8 edge)
{
switch(edge)
{
case HAL_DIGIO_INT_FALLING_EDGE:
switch(p->port)
{
case 1: P1IES |= p->pin_bm; break;
case 2: P2IES |= p->pin_bm; break;
default: return(HAL_DIGIO_ERROR);
}
break;
case HAL_DIGIO_INT_RISING_EDGE:
switch(p->port)
{
case 1: P1IES &= ~p->pin_bm; break;
case 2: P2IES &= ~p->pin_bm; break;
default: return(HAL_DIGIO_ERROR);
}
break;
default:
return(HAL_DIGIO_ERROR);
}
return(HAL_DIGIO_OK);
}
//----------------------------------------------------------------------------------
//----------------------------------------------------------------------------------
#pragma vector=PORT1_VECTOR
__interrupt void port1_ISR(void)
{
register uint8 i;
if (P1IFG)
{
for (i = 0; i < 8; i++)
{
register const uint8 pinmask = 1 << i;
if ((P1IFG & pinmask) && (P1IE & pinmask) && (port1_isr_tbl[i] != 0))
{
(*port1_isr_tbl[i])();
P1IFG &= ~pinmask;
}
}
__low_power_mode_off_on_exit();
}
}
//----------------------------------------------------------------------------------
//----------------------------------------------------------------------------------
#pragma vector=PORT2_VECTOR
__interrupt void port2_ISR(void)
{
register uint8 i;
if (P2IFG)
{
for (i = 0; i < 8; i++)
{
register const uint8 pinmask = 1 << i;
if ((P2IFG & pinmask) && (P2IE & pinmask) && (port2_isr_tbl[i] != 0))
{
(*port2_isr_tbl[i])();
P2IFG &= ~pinmask;
// P2IE &= ~pinmask;
}
}
__low_power_mode_off_on_exit();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -