?? main.c
字號(hào):
#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; //設(shè)置SPI時(shí)鐘分頻
SPI_SPCR = (0<<3)| //CPHA=0,數(shù)據(jù)在SCK的第一個(gè)時(shí)鐘采樣
(1<<4)| //CPOL=1,SCK低電平有效
(1<<5)| //MSTR=1,SPI處于主模式
(0<<6)| //LSBF=0,SPI數(shù)據(jù)傳輸MSB(bit7)在先
(0<<7); //SPIE=0,SPI中斷禁止
}
/******************************************************************************************/
void RTCInit (void)
{
PREINT = Fpclk / 32768 - 1; /* 設(shè)置基準(zhǔn)時(shí)鐘分頻器 */
PREFRAC = Fpclk - (Fpclk / 32768) * 32768;
CCR = 0x00; /* 禁止時(shí)間計(jì)數(shù)器 */
YEAR = 2009;
MONTH = 05;
DOM = 17;
// DOW = 4;
HOUR = 19;
MIN = 30;
SEC = 30;
CIIR = 0x02; /* 設(shè)置分值的增量產(chǎn)生1次中斷 */
CCR = 0x01; /* 啟動(dòng)RTC */
}
/******************************************************************************************/
void TimeRtc (void)
{
uint32 uiDatas;
uint32 uiTimes;
uint32 bak;
uiTimes = CTIME0; /* 讀取完整的時(shí)鐘寄存器 */
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;
/* 獲取 小時(shí) */
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置位,即等待數(shù)據(jù)發(fā)送完畢
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碼的低位轉(zhuǎn)為顯示碼的高位 */
{
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) /* 發(fā)送前8位,和后四位7段數(shù)碼管的顯示代碼 */
{
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; /* 添加四個(gè)點(diǎn)的算法 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; /* 清除中斷標(biāo)志 */
SendTimeRtc(); /* 發(fā)送到串口顯示 */
}
return 0;
}
/******************************************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -