📄 psp-slave.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 + -