给你一个成功的例子比看好吧.
#include "LPC2103.h"
#define HC595_RCK 0x01<<7 //74HC595锁存位
const unsigned char SEGMENT_DATA[16] = {
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,
0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E };
void Delay(int count)
{
unsigned short k;
while(count--)
{
for(k=0; k<1000; k++);
}
}
/***************************************************************************
* 函数名称:void SPI_Init(void)
* 功能描述:SPI接口初始化。
* 入口参数:无
* 出口参数:无
* 全局变量: IO0DIR,IO0CLR
* 调用模块: 无
***************************************************************************/
void SPI_Init(void)
{
PINSEL0=(PINSEL0&(~(1<<8)))|(1<<8); //p0.4 设置为SCK0
PINSEL0=(PINSEL0&(~(1<<12)))|(1<<12); //p0.6 设置为MOSI0
IODIR|=HC595_RCK ;//P0.7 设为74HC595锁存位为输出
IOCLR|=HC595_RCK; //不锁存
S0SPCCR=0x10;//设置速率(864000)为最高速度即PFCLK的8分之一
S0SPCR=(0 << 3) | // CPHA = 0, 数据在SCK 的第一个时钟沿采样
(0 << 4) | // CPOL = 0, SCK 为低有效
(1 << 5) | // MSTR = 1, SPI 处于主模式
(0 << 6) | // LSBF = 0, SPI 数据传输MSB (位7)在先
(0 << 7); // SPIE = 0, SPI 中断被禁止
}
/***************************************************************************
* 函数名称:void WriteByte(U8 data)
* 功能描述:向SPI总线上写一个字节的数据。
* 入口参数:U8 data
* 出口参数:无
* 全局变量: IO0SET,IO0CLR
* 调用模块: 无
***************************************************************************/
/*74HC595上升沿存数据,*/
void WriteByte(unsigned char data)
{
IOCLR|=HC595_RCK; //不锁存,存数据,
S0SPDR=data;
while((S0SPSR&0x80)==0) ; //等待发送完成
IOSET|=HC595_RCK; //锁存数据
}
/***************************************************************************
* 函数名称:void PLL_Init(void)
* 功能描述:向SPI总线上写一个字节的数据。
* 入口参数:无
* 出口参数:无
* 全局变量: IO0SET,IO0CLR
* 调用模块: 无
***************************************************************************/
void PLL_Init(void)
{
//倍频M为5,分频P为是2 ,CCLK =11059200 *5=55296000 pclk=11059200 *5/4=13824000 用到串口通信M倍频最好是4;
PLLCON = 1;
APBDIV = 0; //VPB总线时钟Pclk为1/4 CCLk(处理器时钟)
PLLCFG = 0x24; // //倍频M为5,分频P为是2
PLLFEED = 0xaa;
PLLFEED = 0x55;
while((PLLSTAT & (1 << 10)) == 0); PLLCON = 3;
PLLFEED = 0xaa;
PLLFEED = 0x55;
}
/********************************************************************************************************
*
* 函数名称:DataDisp(uint8 data,uint8 n)
*
* 功能描述:数据字符显示控制。显两位16进制数
*
* 入口参数:data 要显示的数据,取值0~15,n 选择第n个数码管,取值0~3
* 出口参数:无
*
* 全局变量: 无
* 调用模块: HC595_SendData(uint8 data);
*
********************************************************************************************************/
void DataDisp(unsigned char data,unsigned char n)
{
if(data<16)
{
WriteByte(~SEGMENT_DATA[data]); //数据选择
WriteByte(~(1<<n)); //位选择
}
}
/******ARM查询方式SPI总线输出到74HC595驱动数码管*******/
int main(void )
{
PLL_Init(); //锁相环初始化
SPI_Init(); //SPI端口初始化
while(1)
{
DataDisp(5,0); // 第一个数码管显示5
Delay(2); // 延时
DataDisp(2,1); // 第二个数码管显示‘1’
Delay(2); // 延时
DataDisp(3,2); // 第三个数码管显示‘2’
Delay(2); // 延时
DataDisp(4,3); // 第四个数码管显示‘3’
Delay(2); // 延时
}
}
|