⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi_drive.c

📁 一个基于LPC214X的SPI 总线驱动程序
💻 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 + -