📄 dio5812.c
字号:
/***************************************************************************
FILE NAME: DIO5812.C
FILE DESCRIPTION:
This file is a part of DM6430 driver. It contains functions that
implement digital I/O on DM6430 board.
PROJECT NAME: Part of DM6430 DOS Driver
DRIVER VERSION: 1.1
COMPILER: Borland C++ 3.1
TARGET: Real-Mode DOS
Copyright 2003 RTD Embedded Technologies
***************************************************************************/
#include <dos.h>
#include <stdio.h>
#include <string.h>
#include "DRVR6430.h"
#include "DIO5812.h"
#define r_PORT_0_5812 24 // Digital I/O Port 0 Register
#define r_PORT_1_5812 26 // Digital I/O Port 1 Register
#define r_PORT_DIR_5812 28 // Digital I/O Port 0 Direction Register
#define r_PORT_MASK_5812 28 // Digital I/O Port 0 Mask Register
#define r_PORT_COMP_5812 28 // Digital I/O Port 0 Compare Register
#define r_CLEAR_5812 28 // Digital I/O Clear Register
#define r_STATUS_5812 30 // Digital I/O Status Register
#define r_MODE_5812 30 // Digital I/O Mode Register
//*************************************************************************
// SelectRegister5812
//
// This routine picks the different registers on the selected DIO chip.
//
// Parameters:
// SelectedChip: 0, 1, 2 .....
// Select: 0 = Clear mode
// 1 = Port 0 direction
// 2 = Port 0 mask
// 3 = Port 0 compare
//*************************************************************************
void SelectRegister5812(uchar8 SelectedChip, uchar8 Select)
{
uchar8 Mode;
Mode = inp(BaseAddress + r_MODE_5812 + (SelectedChip * 4));
Mode &= 0xFC;
Mode |= Select;
outp(BaseAddress + r_MODE_5812 + (SelectedChip * 4),Mode); // send to board
} // SelectRegister5812
//*************************************************************************
// ClearChip5812
//
// This routine clears the selected DIO chip.
//
// Parameters:
// SelectedChip: 0, 1, 2 .....
//*************************************************************************
void ClearChip5812(uchar8 SelectedChip)
{
SelectRegister5812(SelectedChip, 0);
outp(BaseAddress + r_CLEAR_5812 + (SelectedChip * 4), 0);
} // ClearChip5812
//*************************************************************************
// ClearIrq5812
//
// This routine clears the selected DIO chips IRQ status bit.
//
// Parameters:
// SelectedChip: 0, 1, 2 .....
//*************************************************************************
void ClearIrq5812(uchar8 SelectedChip)
{
SelectRegister5812(SelectedChip, 0);
inp(BaseAddress + r_CLEAR_5812 + (SelectedChip * 4));
} // ClearIrq5812
//*************************************************************************
// EnableIrq5812
//
// This routine enables the selected DIO chips interrupt.
//
// Parameters:
// SelectedChip: 0, 1, 2 .....
// Enable: 0 = Disabled
// 1 = Enabled
//*************************************************************************
void EnableIrq5812(uchar8 SelectedChip, uchar8 Enable)
{
uchar8 Mode;
Mode = inp(BaseAddress + r_MODE_5812 + (SelectedChip * 4));
Mode &= 0xEF;
Mode |= (Enable << 4);
outp(BaseAddress + r_MODE_5812 + (SelectedChip * 4),Mode); // send to board
} // EnableIrq5812
//*************************************************************************
// SetPort1Direction5812
//
// This routine sets the selected DIO chips port 1 direction.
//
// Parameters:
// SelectedChip: 0, 1, 2 .....
// Direction: 0 = In
// 1 = Out
//*************************************************************************
void SetPort1Direction5812(uchar8 SelectedChip, uchar8 Direction)
{
uchar8 Mode;
Mode = inp(BaseAddress + r_MODE_5812 + (SelectedChip * 4));
Mode &= 0xFB;
Mode |= (Direction << 2);
outp(BaseAddress + r_MODE_5812 + (SelectedChip * 4),Mode); // send to board
} //SetPort1Direction5812
//*************************************************************************
// SetPort0Direction5812
//
// This routine sets the selected DIO chips port 0 direction.
//
// Parameters:
// SelectedChip: 0, 1, 2 .....
// Direction: 0 - 255
// 0 = In
// 1 = Out
//*************************************************************************
void SetPort0Direction5812(uchar8 SelectedChip, uchar8 Direction)
{
SelectRegister5812(SelectedChip, 1);
outp(BaseAddress + r_PORT_DIR_5812 + (SelectedChip * 4), Direction); // send to board
} //SetPort0Direction5812
//*************************************************************************
// LoadMask5812
//
// This routine loads the selected DIO chips mask register.
//
// Parameters:
// SelectedChip: 0, 1, 2 .....
// Mask: 0 - 255
//*************************************************************************
void LoadMask5812(uchar8 SelectedChip, uchar8 Mask)
{
SelectRegister5812(SelectedChip, 2);
outp(BaseAddress + r_PORT_MASK_5812 + (SelectedChip * 4), Mask); // send to board
} // LoadMask5812
//*************************************************************************
// LoadCompare5812
//
// This routine loads the selected DIO chips compare register.
//
// Parameters:
// SelectedChip: 0, 1, 2 .....
// Compare: 0 - 255
//*************************************************************************
void LoadCompare5812(uchar8 SelectedChip, uchar8 Compare)
{
SelectRegister5812(SelectedChip, 3);
outp(BaseAddress + r_PORT_COMP_5812 + (SelectedChip * 4), Compare); // send to board
} // LoadCompare5812
//*************************************************************************
// ReadDIO5812
//
// This routine reads the selected DIO chips port.
//
// Parameters:
// SelectedChip: 0, 1, 2 .....
// Port: 0, 1
//*************************************************************************
uchar8 ReadDIO5812(uchar8 SelectedChip, uchar8 Port)
{
return (inp(BaseAddress + r_PORT_0_5812 + (SelectedChip * 4) + (Port * 2)));
} // ReadDIO5812
//*************************************************************************
// ReadCompareRegister5812
//
// This routine reads the selected DIO chips compare register.
//
// Parameters:
// SelectedChip: 0, 1, 2 .....
//*************************************************************************
uchar8 ReadCompareRegister5812(uchar8 SelectedChip)
{
SelectRegister5812(SelectedChip, 3);
return (inp(BaseAddress + r_PORT_COMP_5812 + (SelectedChip * 4)));
} // ReadCompareRegister5812
//*************************************************************************
// SelectClock5812
//
// This routine sets the selected DIO chips clock source.
//
// Parameters:
// SelectedChip: 0, 1, 2 .....
// Clock: 0 = 8 MHz
// 1 = Programmable clock
//*************************************************************************
void SelectClock5812(uchar8 SelectedChip, uchar8 Clock)
{
uchar8 Mode;
Mode = inp(BaseAddress + r_MODE_5812 + (SelectedChip * 4));
Mode &= 0xDF;
Mode |= (Clock << 5);
outp(BaseAddress + r_MODE_5812 + (SelectedChip * 4),Mode); // send to board
} // SelectClock5812
//*************************************************************************
// SelectIrqMode5812
//
// This routine sets the selected DIO chips Irq mode.
//
// Parameters:
// SelectedChip: 0, 1, 2 .....
// IrqMode: 0 = Event mode
// 1 = Match mode
//*************************************************************************
void SelectIrqMode5812(uchar8 SelectedChip, uchar8 IrqMode)
{
uchar8 Mode;
Mode = inp(BaseAddress + r_MODE_5812 + (SelectedChip * 4));
Mode &= 0xF7;
Mode |= (IrqMode << 3);
outp(BaseAddress + r_MODE_5812 + (SelectedChip * 4),Mode); // send to board
} // SelectIrqMode5812
//*************************************************************************
// WriteDIO5812
//
// This routine writes the selected DIO chips port.
//
// Parameters:
// SelectedChip: 0, 1, 2 .....
// Port: 0, 1
// Data: 0 - 255
//*************************************************************************
void WriteDIO5812(uchar8 SelectedChip, uchar8 Port, uchar8 Data)
{
outp(BaseAddress + r_PORT_0_5812 + (SelectedChip * 4) + (Port * 2), Data);
} // WriteDIO5812
//*************************************************************************
// IsChipIRQ5812
//
// This routine checks to see if the selected DIO chip has generated
// an interrupt.
//
// Parameters:
// SelectedChip: 0, 1, 2 .....
// Returns: 1 if IRQ has been generated
// 0 if no IRQ
//*************************************************************************
uchar8 IsChipIrq5812(uchar8 SelectedChip)
{
uchar8 Status_Byte;
Status_Byte = inp(BaseAddress + r_STATUS_5812 + (SelectedChip * 4));
Status_Byte = (Status_Byte >> 7) && 1;
return(Status_Byte);
} // IsChipIRQ5812
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -