📄 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 + -