?? spi-in-out.c
字號:
/* ****************************************************************
** 功能描述: SPI串行輸入外部8位開關量并以數碼管程序
*************************************************************** */
#include "pic18.h" /* 所有PIC18系列的頭文件 */
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顯示段碼表 */
unsigned char SPI_data=0; //SPI中行輸入的8位開關量數據
/* ****************************************************************
** 函 數 名: initial()
** 功能描述: 系統初始化子程序,放在程序首部
*************************************************************** */
void initial()
{
INTCON=0x00; /* bit7-bit0:關總中斷 */
ADCON1=0X07; /* 設置數字輸入輸出口 */
PIE1=0; /* PIE1 的中斷不使能 */
PIE2=0; /* PIE2 的中斷不使能 */
PIE3=0; /* PIE3 的中斷不使能 */
}
/* ****************************************************************
** 函 數 名: 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 k;
unsigned char data;
SPIinitial(); //調SPI輸出初始化子程序
RA5=0; //準備鎖存
/* 顯示8位開關量(占用2個數碼管分別為0-F)*************** */
data=SPI_data&0x0f; //SPI的8位開關量輸入數據低4位
data=table[data]; //個位不需要顯示小數點
SPILED(data); //發送開關量輸入數據顯示段碼
data=(SPI_data&0xf0)>>4;//SPI的8位開關量輸入數據高4位
data=table[data]; //高位不需要顯示小數點
SPILED(data); //發送開關量輸入數據顯示段碼
/* 顯示8位開關量(占用2個數碼管分別為0-F)*************** */
for(k=0;k<6;k++)
{
data=0xFF;
SPILED(data); // 連續發送6個DARK
}
RA5=1; // 給鎖存信號
}
/* ****************************************************************
** 函 數 名: SPI_In_initial()
** 功能描述: SPI輸入初始化子程序
*************************************************************** */
void SPI_In_initial()
{
PIR1=PIR1&0xf7; /* 清除SSPIF標志*/
SSPCON1=0x30; /* SSPEN=1;CKP=0,FOSC/4 */
SSPSTAT=0xC0;
TRISC=TRISC|0x10; /* SDI(RC4)引腳為輸入 */
TRISC=TRISC&0xf7; /* SCK(RC3)引腳為輸出 */
TRISA=TRISA&0xef; /* RA4為輸出方式,用作串行輸入74HC165芯片控制信號*/
}
/* ****************************************************************
** 函 數 名: SPIIN()
** 功能描述: SPI輸入接收外部8位開關量子程序
*************************************************************** */
char SPIIN()
{
unsigned char data;
SPI_In_initial(); /* SPI輸入初始化子程序*/
RA4=0; /* 74HC165并行置數使能,將8位開關量置入器件*/
RA4=1; /* 74HC165移位置數使能,芯片串行工作 */
SSPBUF=0; /* 啟動SPI,此操作用于清除SSPSTAT的BF位 */
do
{
;
}while(SSPIF==0); /*查詢數據接收完畢否?*/
SSPIF=0; /*清除SSPIF標志*/
data=SSPBUF;
return(data); /*返回接收到的數據*/
}
main()
{
initial(); /* 系統初始化子程序 */
SPI_In_initial(); /* SPI初始化子程序 */
SPIinitial(); // spi顯示初始化
while(1)
{
SPI_data=SPIIN(); /* SPI接收8位開關量輸入數據 */
display(); /* 數碼管顯示數據子程序 */
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -