?? spi_drive.c
字號:
/*******************************************************************************************************
* 文件名:Spi_Drive.c
* 功 能:SPI 總線配置 驅動HC595工作實現SPI串行數據傳輸
* 作 者:Windows
* 日 期:2006年10月12號
* 說明: 顯示函數void SUMLED_Show(uint8 *disp_buf,uint16 dly)的入口參數為disp_buf在應用程序中給出
********************************************************************************************************/
#define Spi_H
#include "config.h"
#define HC595_CS ((uint32)0x01<<29)
#define HC595_CS_H() IO0SET=HC595_CS
#define HC595_CS_L() IO0CLR=HC595_CS //HC595片選
#define SMG_1 ((uint32)0x01<<24) // P1.24引腳作為數碼管1的位選
#define SMG_2 ((uint32)0x01<<23) // P1.23引腳作為數碼管2的位選
#define SMG_3 ((uint32)0x01<<22) // P1.22引腳作為數碼管3的位選
#define SMG_4 ((uint32)0x01<<21) // P1.21引腳作為數碼管4的位選
#define SMG_5 ((uint32)0x01<<19) // P1.19引腳作為數碼管5的位選
#define SMG_6 ((uint32)0x01<<18) // P1.18引腳作為數碼管6的位選
#define SMG_7 ((uint32)0x01<<17) // P1.17引腳作為數碼管7的位選
#define SMG_8 ((uint32)0x01<<16) // P1.16引腳作為數碼管8的位選
#define H_SMG_1() IO1SET=SMG_1 // 數碼管1的位選置高
#define L_SMG_1() IO1CLR=SMG_1 // 數碼管1的位選置低
#define H_SMG_2() IO1SET=SMG_2 // 數碼管2的位選置高
#define L_SMG_2() IO1CLR=SMG_2 // 數碼管2的位選置低
#define H_SMG_3() IO1SET=SMG_3 // 數碼管3的位選置高
#define L_SMG_3() IO1CLR=SMG_3 // 數碼管3的位選置低
#define H_SMG_4() IO1SET=SMG_4 // 數碼管4的位選置高
#define L_SMG_4() IO1CLR=SMG_4 // 數碼管4的位選置低
#define H_SMG_5() IO1SET=SMG_5 // 數碼管5的位選置高
#define L_SMG_5() IO1CLR=SMG_5 // 數碼管5的位選置低
#define H_SMG_6() IO1SET=SMG_6 // 數碼管6的位選置高
#define L_SMG_6() IO1CLR=SMG_6 // 數碼管6的位選置低
#define H_SMG_7() IO1SET=SMG_7 // 數碼管7的位選置高
#define L_SMG_7() IO1CLR=SMG_7 // 數碼管7的位選置低
#define H_SMG_8() IO1SET=SMG_8 // 數碼管8的位選置高
#define L_SMG_8() IO1CLR=SMG_8 // 數碼管8的位選置低
uint8 Spi_SendData(uint8 Data); //函數聲明
/********************************************************************************************
* 函數名稱:Delay()
* 功 能:軟件延時
* 入口參數:count 延時參數,值越大,延時越長
* 出口參數:無
*********************************************************************************************/
/*void Delay(uint32 count)
{
uint32 i;
for(;count>0;count--)
for(i=0;i<5000;i++);
}*/ // 8位數碼管顯示緩沖區
/********************************************************************************************
* 函數名稱:SUMLED_ALLON()
* 功 能:選中全部8位數碼管
* 入口參數:無
* 出口參數:無
*********************************************************************************************/
void SUMLED_ALLON(void)
{
L_SMG_1();
L_SMG_2();
L_SMG_3();
L_SMG_4();
L_SMG_5();
L_SMG_6();
L_SMG_7();
L_SMG_8();
}
/********************************************************************************************
* 函數名稱:SUMLED_ALLOFF()
* 功 能:禁用全部8位數碼管
* 入口參數:無
* 出口參數:無
*********************************************************************************************/
void SUMLED_ALLOFF(void)
{
H_SMG_1();
H_SMG_2();
H_SMG_3();
H_SMG_4();
H_SMG_5();
H_SMG_6();
H_SMG_7();
H_SMG_8();
}
/********************************************************************************************
* 函數名稱:SUMLED_PINInit()
* 功 能:8位數碼管位選引腳初始化
* 入口參數:無
* 出口參數:無
*********************************************************************************************/
void SUMLED_PINInit(void)
{
PINSEL2&=~((uint32)0x01<<3); // P1.16~P1.25作為GPIO
/* 設置數碼管的8個位選線連接的GPIO方向為輸出 */
IO1DIR|=(SMG_1 | SMG_2 | SMG_3 | SMG_4 | SMG_5 | SMG_6 | SMG_7 | SMG_8);
SUMLED_ALLOFF(); // 8個數碼管全都不選中
}
/********************************************************************************************
* 函數名稱:SUMLED_Show()
* 功 能:8位數碼管動態掃描顯示
* 入口參數:disp_buf,8位數碼管顯示緩沖區
* dly,延時參數
* 出口參數:無
*********************************************************************************************/
void SUMLED_Show(uint8 *disp_buf,uint16 dly)
{
uint8 i;
for(i=0;i<dly;i++)
{
SUMLED_ALLOFF();
Spi_SendData(disp_buf[0]);
L_SMG_1();
// Delay(4);
OSTimeDlyHMSM(0 , 0 , 0 , 4);
SUMLED_ALLOFF();
Spi_SendData(disp_buf[1]);
L_SMG_2();
//Delay(4);
OSTimeDlyHMSM(0 , 0 , 0 , 4);
SUMLED_ALLOFF();
Spi_SendData(disp_buf[2]);
L_SMG_3();
//Delay(4);
OSTimeDlyHMSM(0 , 0 , 0 , 4);
SUMLED_ALLOFF();
Spi_SendData(disp_buf[3]);
L_SMG_4();
//Delay(4);
OSTimeDlyHMSM(0 , 0 , 0 , 4);
SUMLED_ALLOFF();
Spi_SendData(disp_buf[4]);
L_SMG_5();
//Delay(4);
OSTimeDlyHMSM(0 , 0 , 0 , 4);
SUMLED_ALLOFF();
Spi_SendData(disp_buf[5]);
L_SMG_6();
//Delay(4);
OSTimeDlyHMSM(0 , 0 , 0 , 4);
SUMLED_ALLOFF();
Spi_SendData(disp_buf[6]);
L_SMG_7();
//Delay(4);
OSTimeDlyHMSM(0 , 0 , 0 , 4);
SUMLED_ALLOFF();
Spi_SendData(disp_buf[7]);
L_SMG_8();
//Delay(4);
OSTimeDlyHMSM(0 , 0 , 0 , 4);
SUMLED_ALLOFF();
}
}
/*****************************************************************************
**函數名稱:Spi_Init
**函數功能:對SPI總線進行初始化
**函數入口參數:無
**函數出口參數:無
*****************************************************************************/
void Spi_Init(void)
{
PINSEL1=0x00000000;
PINSEL0&=~((uint32)0x3f<<8);
PINSEL0|=((uint32)0x15<<8); //設置為SPI
IO0DIR=HC595_CS;//HC595_CS為輸出
SPCCR = 0x52;
SPCR=(0x00<<3)| //CPHA=0
(0x01<<4)| //CPOL=1
(0x01<<5)| //MSTR=1
(0x00<<6)| //LSBF=0 SPI數據傳輸MSB(BIT7? 在先
(0x00<<7); //SPIE=0 spi中斷被禁止
}
/*****************************************************************************
**函數名稱:Spi_SendData()
**函數功能:向SPI總線發送數據
**函數入口參數:DATA
**函數出口參數:返回值為發送讀取的數據
*****************************************************************************/
uint8 Spi_SendData(uint8 Data)
{
HC595_CS_L();
SPI_SPDR=Data;
while((SPI_SPSR&0x80)==0);//等待SPIF位置位(發送數據完畢?
HC595_CS_H();
return(SPI_SPDR);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -