//该程序用于开关量的输入,并显示在与D口相连的LED上,S1~S8分别控制Q1~Q8
//开关量采用SPI方式通过74HC165输入,在调试程序时必须把8位的
//拔码开关拔向相应的位置,即把8LED接到PORTD口上
#include    "p18f458.h"
volatile    unsigned    char    data;
/*系统初始化子程序*/
void    initial()
{
    PIR1=0;                            /*清除SSPIF标志*/
    SSPCON1=0x30;                    /* SSPEN=1;CKP=0FOSC/4 */
    SSPSTAT=0xC0;
    TRISC=0x10;                        /*SDI引脚为输入,SCK引脚为输出*/
    TRISA=0x00;                        /*A口为输出方式,用RA4作控制信号*/
    TRISD=0x00;                        /*D口为输出方式*/
    INTCON=0x00;                    /*关闭所有中断*/
}
/*SPI接收子程序*/
char    SPIIN()
{   
    PORTAbits.RA4=0;                    /*74HC165并行置数使能,将8位开关量置入器件*/
                                    /*(LOAD为低电平时8位并行数据置入74HC165)*/
    PORTAbits.RA4=1;                    /*74HC165移位置数使能(LOAD为高电平时芯*/
                                    /*片才能串行工作)*/
    SSPBUF=0;                        /*启动SPI,此操作只用于清除SSPSTAT*/
                                    /*BF位,因此W中的实际数据无关紧要*/
    do{
        ;
    }while(PIR1bits.SSPIF==0);            /*查询数据接收完毕否?*/
    PIR1bits.SSPIF=0;                    /*清除SSPIF标志*/
    data=SSPBUF;
    return(data);                        /*返回接收到的数据*/
}
/*switch语句c语言例子把SPI接收的数据通过D口显示在8个发光二极管上的子程序*/
void    SPIOUT(char data)
{
    PORTD=~data;                    /*因为LEDD口连接方式的要求,需把D口的*/
                                /*输入量取反后才送出*/
}
/*主程序*/
main( )
{
    initial();                        /*系统初始化*/
    while(1)
    {
        SPIIN();                    /*SPI接收外部数据*/
        SPIOUT(data);                /*送出数据显示*/
    }
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。