📄 lpc_rtc&spi.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 + -