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

📄 dio5812.c

📁 rt采集卡dos下dm6430驱动源代码
💻 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 + -