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

📄 main.c

📁 philips LPC2103 ARM7 + TM1629C,利用SPI接口驱动TM1629C
💻 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 + -