main.c

来自「F2812实现电机控制源程序.rar」· C语言 代码 · 共 114 行

C
114
字号
/*********************************************************************
**	Module Name:		Spi_LED 				    				**
**	Author:				Cbq  			    						**
**	Version:			1.0			    							**
**	CreateDate:			2008-05-15		    						**
**	Description:		            			    				**
**	Remark:				Huozq		    							**
**	Revision History:	2008-11-10			    					**
**********************************************************************/

/*********************************************************************
**	实验目的:通过学习本实验来掌握DSP的SPI工作原理                   **
**	实验说明:QQ2812通过SPI接口控制LED数码管                         **
**	         SPI是一高速同步的串行输入输出口,它的通信速率和通信数据 **
**           长度都是可编程的,可以接收和发送16位的数据位,并且带有双 **
**           缓冲的.SPI的4个外部引脚由:从输出主输入(SPISOMI),
**	         从输入主输出(SPISIMO),从发送使能(/SPISTE),串行时钟 **
**           引脚(SPICLK)组成。                                     **
**           主要硬件部分:DSP,CPLD,74HC595(串入并出的移位器), **
**           共阳数码管。SPIMOSI和SPICLK直接从DSPJIE接到了74HC595的 **
**           SER和SRCLK,作为数据和时钟信号的输入,SPICS由CPLD引出  **
**           来控制74HC595的选通。                          **
**	实验结果:可看到数码管从0~F循环显示                             **
**********************************************************************/

#include "DSP28_Device.h"

void WriteLED(unsigned char data);					//送给数码管的数据函数
//void delay(unsigned long t);

unsigned int * SPI_CS  = (unsigned int *) 0x4500;	//0X4500是CPLD的SPICS地址

unsigned long int a;

Uint16	SpiCode[]={0x7E7E,0x2929,0x2c2c,0x6666,0xa4a4,0xa0a0,0x3e3e,0x2020,0x2424,0x2222,0xe0e0,0xb1b1,0x6868,0xa1a1,0xa3a3,0xffff,0xdfdf};

//数码管的笔画对应关系如下:
//    6
// 3     7
//    4
// 2     0
//    1    5

//就是说0~7分别对应笔画的a~h,在原理图看就是分别连接的Q0~Q7
//这个数码管的型号是LG3611BH,是共阳级的,也就是说某个笔画为0的时候,
//这个笔画被点亮。

//我们以 "1",0x7E7E为例说明
//7E的二进制是01111110,对应点亮的就是Q0和Q7,也就是'1'了。
//其他的自己拿笔画一下就清楚了。



void main(void)
{   int k;
    

	/*初始化系统*/
	InitSysCtrl();
	
	/* 关中断 */
	DINT;
	IER = 0x0000;
	IFR = 0x0000;
	
	/* 初始化PIE控制寄存器 */
	InitPieCtrl();
	
	/* 初始化PIE参数表 */
	InitPieVectTable();	
	
	/* 初始化外设寄存器 */
	InitPeripherals();
   
	/*设置CPU*/
	
	EINT;   		// Enable Global interrupt INTM
	ERTM;			// Enable Global realtime interrupt DBGM

    *SPI_CS=0x00;	//写0,低电平选中

	for(;;)
	 { 
	  for(k=0;k<17;k++)			//循环发送16个数据
      	{WriteLED(SpiCode[k]);	//发送数据函数
		 for(a=0;a<500000;a++);
        }
	 }

} 	


void WriteLED(unsigned char data)
{
   
  if(Spi_TxReady() == 1)		//当检测到SPI发送准备信号致1时,开始发送数据
     SpiaRegs.SPITXBUF = data;	//把数据写如SPI发送缓冲区
  while( Spi_TxReady()!=1);		//没检测到发送准备信号
     *SPI_CS=0x01;				//关片选
  
  
  *SPI_CS=0x00;					//退出时开片选
}

/*void delay(unsigned long t)
{
 while(t>0)
    t--;
}*/

//===========================================================================
// No more.
//===========================================================================

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?