?? led8disp.c
字號:
/*******************************************************************
實驗四
實驗名稱: SPI接口實險,LED數(shù)據(jù)管顯示。
實驗?zāi)康? 學習AVR單片機的SPI功能
實驗現(xiàn)象: 1、程序通過SPI接口輸出數(shù)據(jù)到HC595芯片驅(qū)動LED數(shù)據(jù)管簡單顯示。
2、內(nèi)部1 M晶振,程序采用單任務(wù)方式,軟件延時。
環(huán) 境: ICCAVR6.31A
設(shè) 計 者: shinea8868
說 明: 部分程序原型源自網(wǎng)絡(luò),經(jīng)本人修改調(diào)試可用,請尊重知識產(chǎn)權(quán),如
作商業(yè)用途請保留本段文字
完成日期: 2007年4月9日
*******************************************************************/
#include "iom16v.h"
#include "macros.h"
#include "..\ICC_H\SOFTWARE.h"
unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
/*-----------------------------------------------------------------
延時程序計算方法
計數(shù)個數(shù)j = 延時時間/6*晶振頻率 - 1
函數(shù)名稱: void DelayMs(uchar i)
函數(shù)功能: 毫秒延時
參 數(shù):
返 回 值: 無
-----------------------------------------------------------------*/
void DelayMs(uchar i)
{
uchar j;
while(i--)
{
j = 167;//1mhz 1ms延時
while(j--);
}
}
/*-----------------------------------------------------------------
函數(shù)名稱: void SPIMasterInit(void)
函數(shù)功能: SPI初始化為主機
參 數(shù):
返 回 值: 無
-----------------------------------------------------------------*/
void SPIMasterInit(void)
{
// MOSI,MISO,SCK等都需要設(shè)計的數(shù)據(jù)方向定義
DDRB |= (1<<PB5) | (1<<PB7); // 設(shè)置MOSI 和SCK 為輸出,其他為輸入 M16
// DDRB |= (1<<PB2) | (1<<PB3); // 設(shè)置MOSI 和SCK 為輸出,其他為輸入 M64
// SPI控制寄存器
// SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
// SPIE 中斷使能 SPE SPI使能 DORD 數(shù)據(jù)次序 1為LSB首先發(fā)送,0為MSB首先發(fā)送
// MSTR 主從選擇 1為主,0為從MSTR置位時選擇主機模式,否則為從機.如果MSTR為"1",
// SS配置為輸入,但被拉低,則MSTR 被清零,寄存器SPSR 的SPIF 置位.用戶必須重新設(shè)置
// MSTR 進入主機模式。
// CPOL: 時鐘極性見ATMEGA16L(中文)P130
// CPHA: 時鐘相位
// SPR1, SPR0: SPI 時鐘速率選擇1 與0 SPR1 和SPR0 對從機沒有影響。
// 使能SPI 主機模式,設(shè)置時鐘速率為fck/128 */
SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0);
}
/*-----------------------------------------------------------------
函數(shù)名稱: void SPIMasterTransmit(unsigned char i)
函數(shù)功能: SPI數(shù)據(jù)發(fā)送
參 數(shù):
返 回 值: 無
-----------------------------------------------------------------*/
void SPIMasterTransmit(uchar TranData)
{
SPDR = TranData; // 啟動數(shù)據(jù)傳輸
while (!(SPSR & (1<<SPIF))); // 等待傳輸結(jié)束
}
/*-----------------------------------------------------------------
函數(shù)名稱: void SPISlaveInit(void)
函數(shù)功能: SPI初始化為從機
參 數(shù):
返 回 值: 無
-----------------------------------------------------------------/
void SPISlaveInit(void)
{
DDR_SPI = (1<<DD_MISO); // 設(shè)置MISO 為輸出,其他為輸入
SPCR = (1<<SPE);// 使能 SPI
}
/*-----------------------------------------------------------------
函數(shù)名稱: SPISlaveReceive(uchar & RecvData)
函數(shù)功能: SPI從機接收數(shù)據(jù)
參 數(shù):
返 回 值: 無
-----------------------------------------------------------------
void SPISlaveReceive(uchar & RecvData)
{
while(!(SPSR & (1<<SPIF)));// 等待接收結(jié)束
RecvData = SPDR;//返回接收到的數(shù)據(jù)
}*/
/*-----------------------------------------------------------------
函數(shù)名稱: void SPI595Out(unsigned char i)
函數(shù)功能: 595數(shù)據(jù)輸出顯示
參 數(shù):
返 回 值: 無
-----------------------------------------------------------------*/
void SPI595Out(unsigned char i)
{
PORTB &= ~(1 << 4); /*準備鎖存*/
SPIMasterTransmit(i);
PORTB |= (1 << 4); /*鎖存數(shù)據(jù)*/
}
void main(void) {
unsigned char i = 0;
DDRA = 0x00; /*方向輸入*/
PORTA = 0xFF; /*打開上拉*/
DDRB = 0xFF; /*方向輸出*/
PORTB = 0xF0; /*電平設(shè)置*/
DDRC = 0x00;
PORTC = 0xFF;
DDRD = 0xFF;
PORTD = 0xFF;
SPIMasterInit();
while (1)
{
i ++;
if (i > 9)
{
i = 0;
}
DelayMs(250);
DelayMs(250);
SPI595Out(disp[i]);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -