专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

基于SPI总线单片机开关量的输入程序设计

作者:佚名   来源:本站原创   点击数:  更新时间:2008年07月13日   【字体:

//该程序用于开关量的输入,并显示在与D口相连的LED上,S1~S8分别控制Q1~Q8
//开关量采用SPI方式通过74HC165输入,在调试程序时必须把8位的
//拔码开关拔向相应的位置,即把8个LED接到PORTD口上

#include "p18f458.h"
volatile  unsigned  char  data;

/*系统初始化子程序*/
void initial()
{
 PIR1=0;       /*清除SSPIF标志*/
 SSPCON1=0x30;     /* SSPEN=1;CKP=0,FOSC/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);      /*返回接收到的数据*/
}

/*把SPI接收的数据通过D口显示在8个发光二极管上的子程序*/
void SPIOUT(char data)
{
 PORTD=~data;     /*因为LED与D口连接方式的要求,需把D口的*/
        /*输入量取反后才送出*/
}

/*pic单片机主程序*/
main( )
{
 initial();      /*系统初始化*/
 while(1)
 {
  SPIIN();     /*SPI接收外部数据*/
  SPIOUT(data);    /*送出数据显示*/
 }
}


------------------汇编语言版本的SPI总线单片机开关量的输入程序设计------------------
;该程序用于开关量的输入,并显示在与D口相连的LED上,S1~S8分别控制Q1~Q8
;该代码由http://www.51hei.com 单片机网调试并运行成功
;开关量采用SPI方式通过74HC165输入,在调试程序时必须把8位的
;拔码开关拔向相应的位置,即把8个LED接到PORTD口上

  LIST  P=18F458
  INCLUDE  "P18F458.INC"
 
  ORG   0X00
  GOTO  MAIN
  ORG   0X30
;*****************单片机初始化子程序*****************
INITIAL
  BCF   TRISA,4    ;置RA4为输出方式,以输出开关量输入的锁存信号
  BSF   TRISC,4   ;设置SDI引脚为输入
  BCF   TRISC,3   ;设置SCK引脚为输出 
  CLRF      TRISD       ;设置D口为输出方式
  BCF   INTCON,GIE  ;关闭所有中断
  MOVLW  0XC0
  MOVWF  SSPSTAT   ;设置SSPSTAT寄存器
  MOVLW  0X30
  MOVWF  SSPCON1   ;设置SPI的控制方式,允许SSP方式,
  RETURN      ;返回
;*********该子程序将通过SPI方式接收外部的一组串行信号********
SPIIN
  BCF   PORTA,4     ;74HC165并行置数使能,将8位开关量置入器件
         ;(LOAD为低电平时8位并行数据置入74HC165)
  NOP
  NOP 
  BSF   PORTA,4   ;74HC165移位使能(LOAD为高时芯片才能串行工作)
  NOP
  NOP
  MOVWF  SSPBUF   ;启动SPI,此操作只用于清除SSPSTAT的BF位,因
         ;此W中的实际数据无关紧要
LOOP15 BTFSS  SSPSTAT,BF  ;查询数据接收完毕否?
  GOTO  LOOP15
  BCF   PIR1,SSPIF  ;清SPI中断标志
  MOVF    SSPBUF,0  ;SSPBUF中内容送W单元    
  RETURN      ;子程序返回
;****************************************
MAIN NOP
  CALL  INITIAL   ;初始化
LOOP CALL  SPIIN   ;通过SPI方式把开关量存入W寄存器
  XORLW  0XFF   ;因为LED与D口连接方式的要求,需把D口的
         ;输入量取反后才送出
  MOVWF  PORTD   ;送D口显示在LED上
  NOP
  GOTO  LOOP   ;反复输入开关量
  END
 

关闭窗口