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

📄 lpc_rtc&spi.c

📁 Lpc2103的小程序
💻 C
字号:
/****************************************Copyright (c)**************************************************
**
**                                   北天星国际有限公司
**                                 http://www.po-star.com
**
********************************************************************************************************
**文件名称:LPC_RTC&SPI.C
**功    能:将实时时钟的秒数在数码管上显示,并且在串口上发送显示。每秒钟led交替闪烁
**说    明:把JP2连接上。JP7接到数码管的一边。
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include    "..\inc\config.h"
#define     UART_BPS     9600
U8 Send_BUF[16];                         // UART0数据接收缓冲区


/* 数据码显示控制对应表,如下:
                a
             -------
           |	     |
          f|	     |b
           |    g    |				
             -------
           |	     |
          e|	     |c
           |    d    |				
             -------  。h

Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0   DAT   HEX		OUT
h  f  g  e  d  c  b  a
0  0  1  1  1  1  1  1     0    3f		C0
0  0  0  0  0  1  1  0     1    06		F9
0  1  0  1  1  0  1  1     2    5b		A4
0  1  0  0  1  1  1  1     3    4f              B0	
0  1  1  0  0  1  1  0     4    66		99	
0  1  1  0  1  1  0  1     5    6d		92	
0  1  1  1  1  1  0  1     6    7d		82	
0  0  0  0  0  1  1  1     7    07		F8
0  1  1  1  1  1  1  1     8    7f		80
0  1  1  0  1  1  1  1     9    6f		90
0  1  1  1  0  1  1  1     A    77		88
0  1  1  1  1  1  0  0     B    7c		83
0  0  1  1  1  0  0  1     C    39		C6
0  1  0  1  1  1  1  0     D    5e		A1
0  1  1  1  1  0  0  1     E    79		86
0  1  1  1  0  0  0  1     F    71		8E

--注:请根据硬件的原理修改对应关系(Q0~Q7与a~h的关系)及输出值(OUT)*/

const U8  SEGMENT_DATA[16] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,
                                0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E };

/*****************************延时*******************************/
void  Delay(U32  dly)
{  U32  i;

   for(; dly>0; dly--)
      for(i=0; i<50; i++);
}
/****************************SPI初始化*******************************/
void SPI_Init()
{
  IO0DIR=SCLK|MOSI|RCK|LED_MASK;
  IO0CLR=SCLK|RCK;
}
/*******************************向SPI总线上写8位的数据******************/
void WriteByte(U8 data)
{
  U8 i;
  for(i=0;i<8;i++)
  {
    if(data&0x80)      IO0SET=MOSI;
    else      IO0CLR=MOSI;
    IO0SET=SCLK;
    data<<=1;
    IO0CLR=SCLK;
  }
}
/**************************把总线上的数据显示在数码管上******************/
void Display( U8 j)
{
  WriteByte(SEGMENT_DATA[j/10]);
  WriteByte(SEGMENT_DATA[j%10]);
  IO0SET=RCK;
  IO0CLR=RCK;
}
/*********************串口0初始化******************************/
void UART0_Init ()		
{
   U16 Fdiv;

   U0LCR = 0x83;		            // DLAB = 1,可设置波特率
   Fdiv = (Fpclk / 16)/ UART_BPS;           // 设置波特率
   U0DLM = Fdiv / 256;							
   U0DLL = Fdiv % 256;	
   U0LCR = 0x03;
}

/******************************向串口0发送数据**********************/

void UART0_PutChar ( U8 data)
{
  U0THR = data;		            // 发送数据
  while( (U0LSR&0x40)==0 );	    // 等待数据发送完毕
}

/*************将缓冲区的数据发送回主机********************************************/
void  ISendBuf(U8 const *buf, U8 no)
{
  U8  i;
  for(i=0; i<no; i++) UART0_PutChar(buf[i]);
}
/**************************************************************************
**读取RTC的时间值,并将读出的时分秒值由串口发送到上位机显示。
****************************************************************************/
void  SendTimeRtc(void)
{
  U8  const  MESSAGE[]= "RTC Time is : ";
  U32  times;
  U8  bak,bak1;
  times = CTIME0;			// 读取完整时钟寄存器0

  bak = (times>>16)&0x1F;		// 取得时的值
  Send_BUF[0] = bak/10+'0';
  Send_BUF[1] = bak%10+'0';		
  Send_BUF[2] = ':';

  bak = (times>>8)&0x3F;		// 取得分的值
  Send_BUF[3] = bak/10+'0';
  Send_BUF[4] = bak%10+'0';		
  Send_BUF[5] = ':';

  bak = times&0x3F;			// 取得秒的值
  bak1=bak;
  Send_BUF[6] = bak/10+'0';
  Send_BUF[7] = bak%10+'0';		
  Send_BUF[8] = '\n';

  ISendBuf(MESSAGE, 14);
  ISendBuf(Send_BUF, 9);// 发送数据
   Display(bak1);       //显示秒钟在数码管上
}
/*************初始化实时时钟****************************/
void  RTCInit(void)
{
  YEAR = 2006;				    // 初化年
  MONTH = 3;				    // 初化月
  DOM = 2;				    // 初化日
  HOUR = 12;
  MIN = 00;
  SEC = 00;
	
  CIIR = 0x01;				    // 设置秒值的增量产生一次中断
  CCR = 0x11;				    // 使用独立振荡器,启动RTC
}

/*****************************PLL初始化*********************************/
void PLL_Init()
{       PLLCON = 1;
	#if ((Fcclk / 4) / Fpclk) == 1
		VPBDIV = 0;
	#endif
	#if ((Fcclk / 4) / Fpclk) == 2
		VPBDIV = 2;
	#endif
	#if ((Fcclk / 4) / Fpclk) == 4
		VPBDIV = 1;
	#endif
	#if (Fcco / Fcclk) == 2
		PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
	#endif
	#if (Fcco / Fcclk) == 4
		PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
	#endif
	#if (Fcco / Fcclk) == 8
		PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
	#endif
	#if (Fcco / Fcclk) == 16
		PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
	#endif
		PLLFEED = 0xaa;
		PLLFEED = 0x55;
		while((PLLSTAT & (1 << 10)) == 0);
		PLLCON = 3;
		PLLFEED = 0xaa;
		PLLFEED = 0x55;
	
}
/****************************************************************************
* 名称:main()
* 功能:读取实时时钟的值,并从串口发送出去。在数码管上显示秒数
****************************************************************************/
void  main(void)
{
  PINSEL0 |= 0x00000005;            // 设置I/O连接到UART0
  PINSEL1 = 0x00000000;
  IO0DIR = LED_MASK;                 // 设置LED1控制口为输出,其它I/O为输入
  PLL_Init();
  UART0_Init();
  SPI_Init();
  U1FCR = 0x01; 	            // 使能FIFO
  RTCInit();                         // 初始化RTC

  while(1)
  {
    IO0SET = LED_MASK;		    // 熄灭LED
    while( (ILR&0x01)==0 );         // 等待RTC增量中断标志
    ILR = 0x01;		            // 清除中断标志
    SendTimeRtc();                  // 读取时钟值,并向UART0发送

    IO0CLR = LED_MASK;		    // 点亮LED
    while( (ILR&0x01)==0 );
    ILR = 0x01;
    SendTimeRtc();
  }
}

⌨️ 快捷键说明

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