回首頁   上一頁   通用輸出入控制    異常向量與外部中斷控制   計時器控制

串列埠UART控制    串列埠SPI控制    串列埠I2C控制    RTC控制控制    FLASH記憶體控制    uCOS-II系統程式

SPI界面控制實習                SPI界面中斷控制實習 

       . SPI七段顯示器控制電路

 

/*******************SPI界面控制範例**********************************
*檔名︰SPI1.C
*功能︰使用SPI界面輸出經74HC595控制七段顯示器顯示,同時由LED輸出。
*模擬:開啟SPI視窗,單步執行,觀察SPI視窗內暫存器的變化
* 開啟Logic Analyzer視窗,快速執行觀察SPI輸出串列資料與LED輸出
**********************************************************************/
#include "LPC2106.h"
const uint8 DISP_TAB[16] = //七段顯示器數碼0~F高電位輸出
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*********************************************************************
* 名稱︰Spi_Init()
* 功能︰初始化SPI界面,設定為主機。
**********************************************************************/
void Spi_Init(void)
{
PINSEL0 =SCK+MOSI; // 設定SPI接腳
SPCCR =0x52; // 設定SPI時脈除頻,傳輸速率為Fpclk/SPCCR
SPCR = CPOL+MSTR; /* 設定SPI界面模式
CPHA=0,時脈相位控制,0=SCK在第一個CK時取樣
CPOL=1,時脈極性控制,1=SCK為0時資料有效
MSTR=1,選擇SPI為主模式(Master)
LSBF=0,MSB(bit7)先傳輸
SPIE=0,禁能中斷*/
}
/***********************************************************************
* 名稱︰MSendData()
* 功能︰向SPI匯流排發射資料。
* 進入參數︰data 待發射的資料
***********************************************************************/
void MSendData(uint8 data)
{
IOCLR = SPI_CS; // SPI_CS = 0開啟晶片
SPDR = data; // 發射資料
while((SPSR & SPIF)==0); // 若旗標SPIF=0表示未發射完畢,空轉等待
IOSET = SPI_CS; // SPI_CS = 1關閉晶片
}
/*********************************************************************
* 名稱︰main()
* 功能︰使用SPI界面輸出0~F的資料,由七段顯示器顯示。
***********************************************************************/
int main(void)
{
uint8 i; // 資料計數
IODIR =LED1+LED2+LED3+LED4+SPI_CS; // 設定輸出腳
Spi_Init(); // 初始化SPI界面
while(1)
{
for(i=0; i<16; i++) //發射16byte資料
{
IOCLR =~(i<<10); // 清除LED4-1該位元為0
IOSET = i<<10; // LED4-1高電位輸出
//IOSET =~(i<<10); // 設定LED4-1該位元為1
//IOCLR = i<<10; // LED4-1低電位輸出
MSendData(DISP_TAB[i]); // 發射顯示資料
Delay_ms(500); // 延時0.5秒
}
}

/*******************SPI界面中斷控制範例**********************************
*檔名︰SPI2.C
*功能︰使用SPI中斷輸出經74HC595控制七段顯示器顯示,同時由LED輸出。
*模擬:開啟SPI視窗,單步執行,觀察SPI視窗內暫存器的變化
* 開啟Logic Analyzer視窗,快速執行觀察SPI輸出串列資料與LED輸出
**********************************************************************/
#include "LPC2106.h"
const uint8 DISP_TAB[16] = //七段顯示器數碼0~F高電位輸出
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint8 i=0; // 資料計數
/*********************************************************************
* 名稱︰Spi_Init()
* 功能︰初始化SPI界面,設定為主機。
**********************************************************************/
void Spi_Init(void)
{
PINSEL0 =SCK+MOSI; // 設定SPI接腳
SPCCR =0x52; // 設定SPI時脈除頻,傳輸速率為Fpclk/SPCCR
SPCR = CPOL+MSTR+SPIE; /* 設定SPI界面模式
CPHA=0,時脈相位控制,0=SCK在第一個CK時取樣
CPOL=1,時脈極性控制,1=SCK為0時資料有效
MSTR=1,選擇SPI為主模式(Master)
LSBF=0,MSB(bit7)先傳輸
SPIE=1,致能中斷*/
}
/***********************************************************************
* 名稱︰SPI_ISR()
* 功能︰SPI的IRQ中斷服務程式,SPI發射資料完畢顯示出來
***********************************************************************/
void SPI_ISR (void) __irq
{
IOSET = SPI_CS; // SPI_CS = 1關閉晶片
IOCLR =~(i<<10); // 清除LED4-1該位元為0
IOSET = i<<10; // LED4-1高電位輸出
//IOSET =~(i<<10); // 設定LED4-1該位元為1
//IOCLR = i<<10; // LED4-1低電位輸出
Delay_ms(500); // 延時0.5秒
i++; if(i>15) i=0; // 換下一筆資料計數
IOCLR = SPI_CS; // SPI_CS = 0開啟晶片
SPDR=DISP_TAB[i]; // 發射顯示下一筆資料
VICVectAddr = 0x00000000; // 清除中斷位址
}
/*********************************************************************
* 名稱︰main()
* 功能︰使用SPI界面輸出0~F的資料,由七段顯示器顯示。
***********************************************************************/
int main(void)
{
IODIR =LED1+LED2+LED3+LED4+SPI_CS; // 設定輸出腳
Spi_Init(); // 初始化SPI界面
VICVectCntl0 =CntlSPI; // 選擇SPI通道為最高優先中斷
VICVectAddr0 =(unsigned)SPI_ISR; // 設定SPI的IRQ中斷服務程式位址
VICIntEnable =IntSPI; // 致能SPI中斷
IOCLR = SPI_CS; // SPI_CS = 0開啟晶片
SPDR = DISP_TAB[i]; // 發射第一筆資料
while(1); // 空轉,等待SPI發射完畢中斷
}