⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi.c

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 C
字号:
/*****************************************************************************
 *   SPI.c:  Fast I/O module file for NXP LPC24xx Family Microprocessors
 *
 *   Copyright(C) 2006, NXP Semiconductor
 *   All rights reserved.
 *
 *   History
 *   2007.12.28  ver 1.00    Prelimnary version, first Release
 *
******************************************************************************/
#include "LPC2468.h"				/* LPC24xx definitions */
#include "type.h"
#include "irq.h"
#include "timer.h"
#include "SPI.h"
#include "target.h"

BYTE seg_buf[7];
/*
SPI测试数码管函数
*/
/*****************************************************************************
** Function name:		SpI_Init
**
** Descriptions:		initialize SPI port
**
** parameters:			fdiv设置SPI工作频率
** 				
** Returned value:		None
**
*****************************************************************************/
void SPI_Init(char fdiv)
{
  PINSEL0 |= 0xc0000000;        // 引脚配置
  PINSEL1 |= 0x3c;

  FIO0MASK = 0xffffbfff;        // FIO屏蔽和方向设置
  FIO0DIR = 0x4000;

  if(fdiv < 8) fdiv = 8;        // 速率最高为Fpclk八分频
  S0SPCCR = fdiv & 0xFE;
  S0SPCR = SPI_MODE;
}

/*****************************************************************************
** Function name:		MSendData
**
** Descriptions:		向SPI端口传送一个字节数据
**
** parameters:			data
** 				
** Returned value:		None
**
*****************************************************************************/
char MSendData(char data)
{
  FIO0CLR = 0x4000;
  S0SPDR = data;
  while(0==(S0SPSR&0x80));
  FIO0SET = 0x4000;
  return(S0SPDR);
}

/*****************************************************************************
** Function name:		SegDisplay
**
** Descriptions:		单个数码管显示数字0~9
**
** parameters:			data显示数字,
** 			        segnum需要显示数码管编号	
** Returned value:		None
**
*****************************************************************************/
void SegDisplay(BYTE data,BYTE segnum)
{
  char word[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  // 七段数码管的0~9数字编码

  if(segnum > 6)
    return;
  if(data > 9)data %= 10;

  FIO3PIN = segnum << 19;

  MSendData(word[data]);
}

/******************************************************************************
** Function name:		Timer2Handler
**
** Descriptions:		Timer2中断服务函数,刷新六个数码管的显示
**
** parameters:			None
** Returned value:		None
**
******************************************************************************/
__irq __arm void Timer2Handler (void)
{
  unsigned int i,j;

  T2IR = 1;			/* clear interrupt flag */
  __enable_interrupt();		/* handles nested interrupt */

  for(i=1;i<7;i++)
  {
    SegDisplay(seg_buf[i],i);
    if(i<6)delayMs(0,4);          // 节省最后一个管的延时时间
//    for(j=0;j<30000;j++)j=j;    // 作实验测出的合适的延时时间
  }

  __disable_interrupt();

  VICVectAddr = 0;	/* Acknowledge Interrupt */
}

/*****************************************************************************
** Function name:		Seg_Init
**
** Descriptions:		数码管初始化,利用Timer2定时刷新数码管的显示数据
**
** parameters:			refresh 刷新时间,单位为毫秒	
** Returned value:		None
**
*****************************************************************************/
//DWORD Seg_Init( BYTE refresh )
DWORD Seg_Init(void)
{
        PCONP |= (1 << 22);	                // 使用Timer2
//        T2MR0 = refresh*(Fpclk/1000) - 1;       // 设置计时初值,计数pclk脉冲个数
        T2MR0 = 23*(Fpclk/1000) - 1;            // 20ms刷新一次数码管
	T2MCR = 3;				// 计数器的值与MR值匹配时的动作:发生中断、TC复位
        T2TCR = 1;                              // Timer2使能

	if ( install_irq( TIMER2_INT, (void *)Timer2Handler, HIGHEST_PRIORITY ) == FALSE )
	{
	  return (FALSE);
	}

        return (TRUE);

}

⌨️ 快捷键说明

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