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

📄 psp-slave.c

📁 北航出版社《PIC18FXXX单片机程序设计及应用》所有章节源代码
💻 C
字号:
/* ****************************************************************
** 功能描述: 从并行从动口接收到数据后,将此字节数据显示在两个数码管上。向从单片机读操作时将预行准备好的数据送到主机
*************************************************************** */
#include	"pic18.h"			/* PIC18系列的头文件 */
unsigned	int	indata;			/* 从动口接收数据 */
unsigned	int	outdata;		/* 从动口输出数据 */
unsigned	int	Input_Data_Flag;/* 从动口接收到数据标志 */
const	char	table[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80, 0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
								/* 不带小数点的显示段码表,依顺序为0-F共16个 */
const	char	table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};
								/* 带小数点的0-9显示段码表 */

/* ****************************************************************
** 函 数 名: initial()
** 功能描述: 系统初始化子程序,放在程序首部
*************************************************************** */
void	initial()
{
	INTCON=0x00;				/* bit7-bit0:关总中断 */
	ADCON1=0X07;				/* 设置数字输入输出口 */
	PIE1=0;						/* PIE1 的中断不使能 */			
	PIE2=0;						/* PIE2 的中断不使能 */
}

/* ****************************************************************
** 函 数 名: SPIinitial()
** 功能描述: SPI输出初始化子程序
*************************************************************** */
void	SPIinitial()
{
	TRISA=TRISA&0xdf;			/* 设置RA5输出74HC595锁存信号 */
	TRISC=TRISC&0xd7;			/* SDO(RC5)引脚为输出,SCK(RC3)引脚为输出 */
	SSPCON1=0x30;				/* SSPEN=1;CKP=1,FOSC/4 */
	SSPSTAT=0xC0;				/* 时钟下降沿发送数据 */
	SSPIF=0;					/* 清除SSPIF标志 */
}

/* ****************************************************************
** 函 数 名: SPILED()
** 功能描述: SPI传输数据(发送数据)子程序
*************************************************************** */
void  	SPILED(char	data)
{
	SSPBUF=data;				/* 启动 SPI 发送 */
	do
	{
	  ;
	}while(SSPIF==0);			/* 等待SPI 发送完成 */
	SSPIF=0;					/* 清SPI 发送完成标志 */
}

/* ****************************************************************
** 函 数 名: display()
** 功能描述: 8个数码管显示数据子程序 
*************************************************************** */
void	display()
{
	unsigned  char  data;

	RA5=0;						/* 准备锁存显示数据 */
	data=table[indata&0x0f];	/* 查与低位显示数据对应的段码 */
	SPILED(data);				/* 发送显示段码 */
	data=table[(indata>>4)&0x0f];	/* 查与高位显示数据对应的段码 */
	SPILED(data);				/* 发送显示段码 */
	RA5=1;						/* 给锁存信号,显示数字 */
}

/* ****************************************************************
** 函 数 名: psp_Slave_initial()
** 功能描述: 并行从动口初始化程序
*************************************************************** */
void	psp_Slave_initial()
{
	TRISE=0x17;					/* TRISE<bit4>=1,选择D口为并行从动口方式;
设置RE0(RD)、RE1(WR)、RE2(CS)为输入口 */
	PSPIE=1;					/* 允许并行从动口读写中断 */
}

/* ****************************************************************
** 函 数 名: interrupt	HI_ISR()
** 功能描述: 高优先级中断子程序:并行从动口中断
*************************************************************** */
void	interrupt HI_ISR()
{
	if(1==PSPIF)				/* 并行从动口中断 */
	{
		PSPIF=0;				/* 清中断标志 */
		if(1==IBF)				/* 并行从动口写操作中断 */
		{
			indata=PORTD;		/* 并行从动口读数据 */
			Input_Data_Flag=1;	/* 置从动口接收到数据标志 */
			outdata=indata;		/* 并行从动口输出初始数据 */
			PORTD=outdata++;	/* 从动口输出数据写到总线上,供主机读取,
输出数据加1作为下次输出数据 */
		}
		if(0==OBF)				/* 并行从动口写操作中断 */
		{
			PORTD=outdata++;	/* 输出数据写到总线上,供主机下次读取,输出数据
加1作为再下次输出数据 */
		}
		if(1==IBOV)				/* 并行从动口溢出操作中断 */
		{
			indata=indata;		/* 用户可在此编程进行处理 */
		}	
	}
}

main()					
{
	initial();					/* 系统初始化 */
	CMCON=0x07;  		/* 关比较器 */
	SPIinitial();				/* SPI初始化子程序 */
	psp_Slave_initial();		/* 并行从动口初始化程序 */
	INTCON=INTCON|0xc0;			/* 开总中断、开外围接口中断 */
	while(1)
	{
		if(1==Input_Data_Flag)	/* PSP是否接收到数据 */
		{
			Input_Data_Flag=0;	/* 清接收到数据标志 */
			display();			/* 数码管显示数据 */
		}
	}
}

⌨️ 快捷键说明

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