📄 main.c
字号:
#include "config.h"
#define TM1629C_CS 0x00000080
uint8 BCD2SEG[10] = {0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b};
uint8 data1[14] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
uint8 timebuf[12]={0,0,0,0,0,0,0,0,0,0,0,0};
/******************************************************************************************/
void delay(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<50000; i++);
}
/******************************************************************************************/
void mspi_ini(void)
{
PINSEL0 =PINSEL0&(0xFFFF00FF)|0x00001500;
SPI_SPCCR = 0x52; //设置SPI时钟分频
SPI_SPCR = (0<<3)| //CPHA=0,数据在SCK的第一个时钟采样
(1<<4)| //CPOL=1,SCK低电平有效
(1<<5)| //MSTR=1,SPI处于主模式
(0<<6)| //LSBF=0,SPI数据传输MSB(bit7)在先
(0<<7); //SPIE=0,SPI中断禁止
}
/******************************************************************************************/
void RTCInit (void)
{
PREINT = Fpclk / 32768 - 1; /* 设置基准时钟分频器 */
PREFRAC = Fpclk - (Fpclk / 32768) * 32768;
CCR = 0x00; /* 禁止时间计数器 */
YEAR = 2009;
MONTH = 05;
DOM = 17;
// DOW = 4;
HOUR = 19;
MIN = 30;
SEC = 30;
CIIR = 0x02; /* 设置分值的增量产生1次中断 */
CCR = 0x01; /* 启动RTC */
}
/******************************************************************************************/
void TimeRtc (void)
{
uint32 uiDatas;
uint32 uiTimes;
uint32 bak;
uiTimes = CTIME0; /* 读取完整的时钟寄存器 */
uiDatas = CTIME1;
bak = (uiDatas >> 16) & 0xfff; /* 获取 年 */
timebuf[0]=bak / 1000;
bak = bak % 1000;
timebuf[1]=bak / 1000;
bak = bak % 100;
timebuf[2]=bak / 10;
timebuf[3]=bak % 10;
bak = (uiDatas >> 8) & 0x0f;
timebuf[4]=bak / 10;
timebuf[5]=bak % 10; /* 获取 月 */
bak = uiDatas & 0x1f;
timebuf[6]=bak / 10;
timebuf[7]=bak % 10;
/* 获取 日 */
bak = (uiTimes >> 16) & 0x1f;
timebuf[8]=bak / 10;
timebuf[9]=bak % 10;
/* 获取 小时 */
bak = (uiTimes >> 8) & 0x3f;
timebuf[10]=bak / 10;
timebuf[11]=bak % 10;
/* 获取 分钟 */
// bak = uiTimes & 0x3f;
// timebuf[10]=bak / 10;
// timebuf[11]=bak % 10; /* 获取 秒 */
}
/******************************************************************************************/
uint8 msend_data(uint8 data)
{
SPI_SPDR = data;
while( 0==(SPI_SPSR&0x80) ); //等待SPIF置位,即等待数据发送完毕
return(SPI_SPDR);
}
/******************************************************************************************/
void TM1629C_init(void)
{
IO0DIR = TM1629C_CS;
IO0SET = TM1629C_CS;
IO0CLR = TM1629C_CS;
msend_data(0x02);
IO0SET = TM1629C_CS;
IO0CLR = TM1629C_CS;
msend_data(0x03);
IO0SET = TM1629C_CS;
IO0CLR = TM1629C_CS;
msend_data(0x40);
IO0SET = TM1629C_CS;
IO0CLR = TM1629C_CS;
msend_data(0xc0);
}
/******************************************************************************************/
void led1629_sendbcd(uint8 a, uint8 bit)
/* 从BCB码中分离出显示的码值, 12位分别为1,2,3,4,5,6,7,8,12,10,13,11BCD码的低位转为显示码的高位 */
{
uint8 i = 0, j = 0, tmp = 0, tmpl = 0;
tmp = BCD2SEG[a];
if(bit < 8)
{
for(i = 0; i < 7; i++)
{
j = i * 2;
tmpl = tmp;
if(tmpl & 0x01)
data1[j] |=( 0x80 >> bit);
tmp = tmp >> 1;
}
}
else if(bit==8 )
{
//bit = bit -4;
for(i=0; i < 7; i++)
{
j = i*2+1;
tmpl = tmp;
if(tmpl & 0x01)
data1[j] |= (0x80 >>4);
tmp = tmp >> 1;
}
}
else if(bit==9 )
{
//bit = bit -8;
for(i=0; i <7; i++)
{
j = i*2+1;
tmpl = tmp;
if(tmpl & 0x01)
data1[j] |= (0x80 >> 1);
tmp = tmp >> 1;
}
}
else if(bit ==10)
{
//bit = bit -7;
for(i=0; i < 7; i++)
{
j = i*2+1;
tmpl = tmp;
if(tmpl & 0x01)
data1[j] |= (0x80 >>3);
tmp = tmp >> 1;
}
}
else
// if(bit ==11 )
{
//bit = bit -9;
for(i=0; i < 7; i++)
{
j = i*2+1;
tmpl = tmp;
if(tmpl & 0x01)
data1[j] |= (0x80 >> 2);
tmp = tmp >> 1;
}
}
}
/******************************************************************************************/
void TM1629send(uint8 *ptchar) /* 发送前8位,和后四位7段数码管的显示代码 */
{
uint8 i = 0;
TM1629C_init();
for(i = 0; i < 14; i++)
{
msend_data(*ptchar);
ptchar++;
}
}
/******************************************************************************************/
void SendTimeRtc(void)
{
unsigned char i;
TimeRtc ();
for(i=0;i<12;i++)
{
led1629_sendbcd(timebuf[i], i);
}
data1[3]=data1[3]|0x80; /* 添加四个点的算法 00110110 放到高位 */
data1[5]=data1[5]|0x80;
data1[9]=data1[9]|0x80;
data1[11]=data1[11]|0x80;
TM1629C_init();
TM1629send(data1);
IO0SET = TM1629C_CS;
IO0CLR = TM1629C_CS;
msend_data(0x11);
IO0SET = TM1629C_CS;
for(i=0;i<14;i++)
{
data1[i]=0;
}
}
/******************************************************************************************/
int main(void)
{
RTCInit ();
TimeRtc ();
mspi_ini();
SendTimeRtc();
while (1){
while (0 == (ILR & 0x01)); /* 等待RTC增量中断 */
ILR = 0x01; /* 清除中断标志 */
SendTimeRtc(); /* 发送到串口显示 */
}
return 0;
}
/******************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -