LPC ARM使用SPI總線控制8個(gè)LED燈
電路圖如下:
本文引用地址:http://m.butianyuan.cn/article/201611/316724.htm 開發(fā)板通過SPI總線控制74HC595驅(qū)動(dòng)8盞LED燈。
程序清單如下:
#include "config.h"
#define SPI_CS (1 << 16) // P0.16口為片選腳
#define CE_Low() (IO0CLR |= SPI_CS) // 選中從器件
#define CE_High() (IO0SET |= SPI_CS)
/* 流水燈花樣,低電平點(diǎn)亮,注意調(diào)用時(shí)候用了取反操作 */
const uint32 LED_TBL[] =
{
0x00, 0xFF, // 全部熄滅后,再全部點(diǎn)亮
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, // 依次逐個(gè)點(diǎn)亮
0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, // 依次逐個(gè)疊加
0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, // 依次逐個(gè)遞減
0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81, // 兩個(gè)靠攏后分開
0x81, 0xC3, 0xE7, 0xFF, 0xFF, 0xE7, 0xC3, 0x81 // 從兩邊疊加后遞減
};
/***********************************************************
** 函數(shù)名稱: Delay
** 函數(shù)功能: 長軟件延時(shí)
** 入口參數(shù): dly 延時(shí)參數(shù),值越大,延時(shí)越久
** 出口參數(shù): 無
************************************************************/
void Delay(uint32 dly)
{
uint32 i = 0;
for (; dly > 0; dly--)
for (i = 0; i < 50000; i++);
}
/**********************************************************
** 函數(shù)名稱: SPIInit
** 功能說明: 初始化LPC2300系列ARM的SPI引腳及寄存器
** 入口參數(shù): 無
** 出口參數(shù): 無
************************************************************/
void SPIInit(void)
{
/* 初始化SPI引腳 */
PINSEL0 = 0;
IO0DIR |= SPI_CS; // 設(shè)置SPI的片選引腳
PINSEL0 |= 0xc0000000; // 設(shè)置P0.15腳為SCK腳
PINSEL1 = (0x03 << 2) | (0x03 << 4); // 設(shè)置P0.17、P0.18引腳為SPI引腳
/* 初始化SPI寄存器 */
S0SPCCR = 0x48; // 設(shè)置SPI時(shí)鐘分頻
S0SPCR = (0 << 2) | // SPI控制器每次傳輸發(fā)送和接收8位數(shù)據(jù)。
(0 << 3) | // CPHA = 0, 數(shù)據(jù)在SCK 的第一個(gè)時(shí)鐘沿采樣
(0 << 4) | // CPOL = 0, SCK 為高有效
(1 << 5) | // MSTR = 1, SPI 處于主模式
(1 << 6) | // LSBF = 0, SPI 數(shù)據(jù)傳輸MSB (位7)在先
(0 << 7); // SPIE = 0, SPI 中斷被禁止
}
/************************************************************************
** 函數(shù)名稱: SPISndByte
** 函數(shù)功能: 通過硬件SPI接口發(fā)送一個(gè)字節(jié)
** 入口參數(shù): data
** 出口參數(shù): 無
************************************************************************/
void SPISndByte(uint8 data)
{
uint32 temp = 0;
CE_Low();
S0SPDR = data;
while (0 == (S0SPSR & 0x80)); // 等待SPIF置位,即等待數(shù)據(jù)發(fā)送完畢
temp = S0SPSR; // 通過讀S0SPSR,清除SPIF標(biāo)志
CE_High();
}
/**************************************************************
** 函數(shù)名稱: main
** 函數(shù)功能: 用SPI驅(qū)動(dòng)流水燈顯示
** 入口參數(shù): 無
** 出口參數(shù): 返回0則表明程序出錯(cuò)
** 調(diào)試說明: 需用杜邦線將P0.15~P0.18分別與SCLK、/CS、MISO、MOSI短接。
***************************************************************/
int main(void)
{
uint32 i = 0;
SPIInit();
while (1)
{
for (i = 0; i < 42; i++)
{
Delay(20);
SPISndByte(LED_TBL[i]);
}
}
return (0);
}
評論