首页
基础教程 | 单片机设计实例 | 常用芯片 | 电子基础
当前位置:单片机教程 >> 单片机设计实例 >> 浏览文章 今天是:
单片机设计实例

基于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




 
发表评论】【告诉好友】【打印此文】【收藏此文】【关闭窗口
网友评论(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
 >> 推荐文章
单片机USB-ISP下载线制作
自制单片机实验板
单片机一键多功能按键识别设
 >> 阅读排行
keil教程
单片机电子时钟设计
单片机DS18B20水温控制系统
单片机交通灯设计
单片机课程设计
单片机时钟设计
单片机数字钟设计
单片机键盘程序(4×4矩阵式
单片机串口通讯
单片机秒表设计
 >> 相关文章
51学习板4*4键盘的c51与汇编程序
51单片机实验板DS18B20测温程序
单片机控制机械手设计论文
51单片机可调数码钟
c8051f系列单片机应用介绍
stc单片机下载协议研究
单片机控制LED按1闪1秒按2闪10秒
基于8051单片机采用VP1410的工业
基于8051单片机采用VP1410的工业
关于单片机复位电路原理的争论

站长:刘兴国 站长信箱:372xcom1@21cn.com
单片机教程 @ www.51hei.com 2007-2008