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

📄 time_show.c

📁 用proteus和Keil做的基于ARM的实时时钟。初始化一个初始时钟就可以一直正确运行
💻 C
字号:
/****************************************************************************
 名称:time_show.c	
****************************************************************************/
#include  "config.h" 

#define    T     3;							 //定义切换显示内容时间间隔,单位为S
											
int i = 0;
int time[6] = {0,0,0,0,0,0};				 //定义存放时间的数组

int ReadRtc(void);

/****************************************************************************
 名称:Convert()		  功能:显示方式
****************************************************************************/
 unsigned char Convert(int n)			  
 {	   
   	int h;
 	switch(n)
	{
		case 0: 
			h=0x3f;	break;
		case 1:
			h=0x06;	break;
		case 2:
			h=0x5b;	break;		
		case 3:
			h=0x4f;	break;		
		case 4:
			h=0x66;	break;		
		case 5:
			h=0x6d;	break;		
		case 6:
			h=0x7D;	break;		
		case 7:
			h=0x07;	break;		
		case 8:
			h=0x7f;	break;		
		case 9:
			h=0x6f;	break;
		default:
		    h=0x3f;   break;							
	}
	return (h);
 }

/****************************************************************************
* 名称:Delay()		* 功能:延时 
****************************************************************************/
void  Delay(uint8  dly)
{  uint16  i;
   for(; dly>0; dly--) 
      for(i=0; i<10000; i++);
}               

/****************************************************************************
 名称:Display1()		  功能:显示年月日 
****************************************************************************/
void Disp1()
{
	int yearh,yearl,monthh,monthl,dayh,dayl;  	

	PINSEL0 = 0x00000000;	
	PINSEL1 = 0x00000000;	
	IODIR = 0x0000FFFF;	

	ReadRtc(); 						//读时间
				
	yearl = time[5]%10;
	yearh = (time[5]/10)%10;
	monthl = time[4]%10;
	monthh = (time[4]/10)%10;
	dayl = time[3]%10;
	dayh = (time[3]/10)%10;

	IOSET = Convert(yearh);
	IOCLR = 0x00000100;
	Delay(1);
	IOSET = 0x0000FF00;
	IOCLR = 0x000000FF;
	IOSET = Convert(yearl);
	IOCLR = 0x00000200;
	Delay(1);
	IOSET = 0x0000FF00;
	IOCLR = 0x000000FF;
	IOSET = Convert(monthh);
	IOCLR = 0x00000800;
	Delay(1);
	IOSET = 0x0000FF00;
	IOCLR = 0x000000FF;
	IOSET = Convert(monthl);
	IOCLR = 0x00001000;
	Delay(1);
	IOSET = 0x0000FF00;
	IOCLR = 0x000000FF;
	IOSET = Convert(dayh);
	IOCLR = 0x00004000;
	Delay(1);
	IOSET = 0x0000FF00;
	IOCLR = 0x000000FF;
	IOSET = Convert(dayl);
	IOCLR = 0x00008000;
	Delay(1);
	IOSET = 0x0000FF00;
	IOCLR = 0x000000FF;			
							   
	if(time[0]%2!=0)						 //控制“-”1秒闪烁
	{
		IOCLR = 0x00002400;
		IOSET = 0x00000040;
		Delay(1);
		IOSET = 0x0000FF00;
		IOCLR = 0x000000FF;	
	}
	else
	{			
	}
	
}

/****************************************************************************
 名称:Display2()		  功能:显示时分秒 
****************************************************************************/
void Disp2()
{
	int hourh,hourl,minuteh,minutel,secondh,secondl;

	PINSEL0 = 0x00000000;	
	PINSEL1 = 0x00000000;	
	IODIR = 0x0000FFFF;	

	ReadRtc();								 //读时间
				
	hourl = time[2]%10;
	hourh = (time[2]/10)%10;
	minutel = time[1]%10;
	minuteh = (time[1]/10)%10;
	secondl = time[0]%10;
	secondh = (time[0]/10)%10; 

	IOSET = Convert(hourh);
	IOCLR = 0x00000100;
	Delay(1);
	IOSET = 0x0000FF00;
	IOCLR = 0x000000FF;
	IOSET = Convert(hourl);
	IOCLR = 0x00000200;
	Delay(1);
	IOSET = 0x0000FF00;
	IOCLR = 0x000000FF;
	IOSET = Convert(minuteh);
	IOCLR = 0x00000800;
	Delay(1);
	IOSET = 0x0000FF00;
	IOCLR = 0x000000FF;
	IOSET = Convert(minutel);
	IOCLR = 0x00001000;
	Delay(1);
	IOSET = 0x0000FF00;
	IOCLR = 0x000000FF;
	IOSET = Convert(secondh);
	IOCLR = 0x00004000;
	Delay(1);
	IOSET = 0x0000FF00;
	IOCLR = 0x000000FF;
	IOSET = Convert(secondl);
	IOCLR = 0x00008000;
	Delay(1);
	IOSET = 0x0000FF00;
	IOCLR = 0x000000FF;			

	if(time[0]%2!=0)							  //控制“-”1秒闪烁
	{
		IOCLR = 0x00002400;
		IOSET = 0x00000040;
		Delay(1);
		IOSET = 0x0000FF00;
		IOCLR = 0x000000FF;	
	}
	else
	{			
	} 
}

/****************************************************************************
 名称:IRQ_Timer0()    功能:中断服务程序 控制显示
****************************************************************************/
void   __irq IRQ_Timer0(void)
{
  	i++;

	T0IR = 0x01;	    			            // 清除中断标志

	VICVectAddr = 0x00;						 	// 通知VIC中断处理结束    				
}

/****************************************************************************
 名称:ReadRtc()		  功能:读取RTC的时间值
****************************************************************************/
int ReadRtc(void)
{  
   time[5] = YEAR;
   time[4] = MONTH;
   time[3] = DOM;
   time[2] = HOUR;
   time[1] = MIN;
   time[0] = SEC;

   return(0);
}
		
/****************************************************************************
 名称:TargetInit()			 功能:初始化定时器0, 实现5S定时
****************************************************************************/
void Timer0Init(void)
{
	T0PR = 99;			    	// 设置定时器分频为100分频,得110592Hz
	T0MCR = 0x03;		   	 	// 匹配通道0匹配中断并复位T0TC
	T0MR0 = 110592*T;	   		// 比较值
	T0TCR = 0x02;		    	// 复位定时器0
	T0TCR = 0x01;				// 启动定时器0
}

/****************************************************************************
 名称:RTCIni()			 功能:初始化RTC
****************************************************************************/
void  RTCInit(void)
{  PREINT = Fpclk / 32768 - 1;	// 设置基准时钟分频器
   PREFRAC = Fpclk - (Fpclk / 32768) * 32768;
   
   YEAR = 2009;				    // 初始化年
   MONTH = 5;				    // 初始化月
   DOM = 24;				    // 初始化日
   HOUR = 16;					// 初始化小时
   MIN = 56;					// 初始化分
   SEC = 11;					// 初始化秒 
      
   CCR = 0x01;				    // 启动RTC
} 

/****************************************************************************
 名称:main()	  功能:初始化系统,初始化定时器,初始化RTC,初始化中断
****************************************************************************/
int  main(void)
{  
	PINSEL0 = 0x00000000;	
	PINSEL1 = 0x00000001;	
	IODIR = 0x0000FFFF;
			   
   	Timer0Init();						//初始化定时器0
	   	
	RTCInit();							//初始化RTC
	
	VICIntSelect = 0x00000000;			// 设置所有通道为IRQ中断

	VICVectCntl0 = 0x24;				// 定时器0通道分配到IRQ slot 0
	VICVectAddr0 = (int)IRQ_Timer0;		// 设置Timer0向量地址

	VICIntEnable = 0x00000010;			// 使能Timer0中断
	
	while(1)
	{
	 	if(i%2==0)
			Disp1();
		else
			Disp2();	
	}		
}

⌨️ 快捷键说明

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