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

📄 rtc.c

📁 实时时钟,U/COSII操作系统,ARM板为LPC2103
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:    实时时钟
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
#include "stdlib.h"
#include <stdio.h>

#define	TaskStkLengh	128	//Define the Task0 stack length 定义用户任务0的堆栈长度

OS_STK	RTCTaskStk [TaskStkLengh];  //Define the Task0 stack 定义用户任务0的堆栈
OS_STK	DispTaskStk [TaskStkLengh];
//OS_STK	KeyTaskStk [TaskStkLengh];
//OS_STK	UARTTaskStk [TaskStkLengh];


void 	RTCTask(void *pdata);	        //实时时钟任务,掉电保护任务
void 	DispTask(void *pdata);	        //LED显示任务
//void 	KeyTask(void *pdata);	        //按键任务
//void 	UARTTask(void *pdata);	        //PC显示任务

void    MDisp_Byte(uint32); 

#define key1 (1 << 14)
#define key2 (1 << 16)
#define key3 (1 << 15)


uint32 MNBuff[18] = {        //静态显示码
0x7E,0x30,0x6D,0x79,		//0,1,2,3
0x33,0x5B,0x5F,0x70,		//4,5,6,7
0x7F,0x73,0x77,0x1F,		//8,9,A,B
0x4E,0x3D,0x4F,0x47,0x00,0x01			//C,D,E,F,灭0,'-'
};    //静态显示码


uint8 RTCBuff0[6] = {0};  //显示时间缓存
uint8 RTCBuff1[8] = {0};
uint8 YHFlag = 0;   //年、时切换标志
//uint8 BatFlag = 0;  //防连击标志
/*typedef struct 
{
     uint8 Rsec;
     uint8 Rmin;
     uint8 Rhour;  
     uint8 Rdat;   //月日期
     uint8 Rweek;  //星期
     uint8 Rmon;
     uint16 Ryear;
}DATA;
*/

/*********************************************************************************************************
**                            主函数main
********************************************************************************************************/
int main (void)
{
	OSInit ();	

	OSTaskCreate (RTCTask,(void *)0, &RTCTaskStk [TaskStkLengh-1], 2);		
	OSTaskCreate (DispTask,(void *)0, &DispTaskStk [TaskStkLengh-1], 4);	
    //OSTaskCreate (KeyTask,(void *)0, &KeyTaskStk [TaskStkLengh-1], 6);	
	//OSTaskCreate (UARTTask,(void *)0, &UARTTaskStk [TaskStkLengh-1], 8);	
	
	OSStart ();
	
	return 0;															
}


/*********************************************************************************************************
**                            RTCTask 任务2
********************************************************************************************************/

void  RTCTask	(void *pdata)
{	
	uint32 timreg0;
	uint32 timreg1;    //读出完整时间寄存器
	
    pdata = pdata;
	TargetInit ();
	
	 PREINT = Fpclk / 32768 - 1;     //时钟分频整数部分
     PREFRAC = Fpclk - (Fpclk / 32768) * 32768;   //时钟分频小数部分
     CCR = 0;
     SEC = 55;   //分别为秒,分,时,日期月,星期,月,年,
     MIN = 20;
     HOUR = 8;
     DOM = 20;
     DOW = 5;
     MONTH = 10;
     YEAR = 2008;
     CIIR = 0x01;   //设置秒中断
     ILR = 0x01;
     CCR = 0x01;

	while (1)
	{ 
         
         timreg0 = CTIME0;    //读出完整时间寄存器
         timreg1 = CTIME1;
	     
         RTCBuff0[0] = (timreg0 & 0x3F) % 10;    //秒个位
         RTCBuff0[1] = (timreg0 & 0x3F) / 10;    //秒十位;
         RTCBuff0[2] = ((timreg0 & 0x3F00) >> 8) % 10;  //分个位
         RTCBuff0[3] = ((timreg0 & 0x3F00) >> 8) / 10;  //分十位
         RTCBuff0[4] = ((timreg0 & 0x1F0000) >> 16) % 10; //时个位
         RTCBuff0[5] = ((timreg0 & 0x1F0000) >> 16) / 10;  //时十位
         
         timreg1 = CTIME1;
     
         RTCBuff1[0] = (timreg1 & 0x1F) % 10;    //日个位 
         RTCBuff1[1] = (timreg1 & 0x1F) / 10;    //日十位 
         RTCBuff1[2] = ((timreg1 & 0xF00) >> 8) % 10;  //月个位 
         RTCBuff1[3] = ((timreg1 & 0xF00) >> 8) / 10;  //月十位
         RTCBuff1[4] = ((timreg1 & 0xFFF0000) >> 16) % 1000 % 100 % 10; //年个位
         RTCBuff1[5] = ((timreg1 & 0xFFF0000) >> 16) % 1000 % 100 / 10; //年十位
         RTCBuff1[6] = ((timreg1 & 0xFFF0000) >> 16) % 1000 / 100; //年百位
         RTCBuff1[7] = ((timreg1 & 0xFFF0000) >> 16) / 1000; //年千位     
         
         OSTimeDlyHMSM(0,0,1,0); 
         
	}
}

/*********************************************************************************************************
**                            DispTask 任务4
********************************************************************************************************/


void  DispTask	(void *pdata)
{		
     uint32 cound;
     pdata = pdata;
     
	 PINSEL0 = PINSEL0 & (~0x0F);  //选择P0.0,P0.1分别作SCK和SDA
     IO0DIR = IO0DIR & (~0x03) | 0x03;   //选择为输出
     IO0SET = 1 | (1 << 1);

		
	while (1)
	{
        switch(YHFlag)
        {
             case 0:
                 cound = RTCBuff0[0];    //秒个位
                 MDisp_Byte(MNBuff[cound]);
                 cound = RTCBuff0[1];    //秒十位
                 MDisp_Byte(MNBuff[cound]);
     
                 MDisp_Byte(MNBuff[17]);
                 cound = RTCBuff0[2];  //分个位
                 MDisp_Byte(MNBuff[cound]);
                 cound = RTCBuff0[3];  //分十位
                 MDisp_Byte(MNBuff[cound]);
     
                 cound = RTCBuff0[4]; //时个位
                 MDisp_Byte(MNBuff[cound]);
                 cound = RTCBuff0[5];  //时十位
                 MDisp_Byte(MNBuff[cound]);
     
                 MDisp_Byte(MNBuff[16]);
                 MDisp_Byte(MNBuff[16]);
                 MDisp_Byte(MNBuff[16]);
                 break;
        
             case 1:

                 cound = RTCBuff1[0];    
                 MDisp_Byte(MNBuff[cound]);   //日个位
                 cound = RTCBuff1[1];    
                 MDisp_Byte(MNBuff[cound]);  //日十位
                 MDisp_Byte(MNBuff[17]);
     
                 cound = RTCBuff1[2];   
                 MDisp_Byte(MNBuff[cound]);  //月个位
                 cound = RTCBuff1[3];   
                 MDisp_Byte(MNBuff[cound]);  //月十位
                 cound = RTCBuff1[4];   
     
                 MDisp_Byte(MNBuff[cound]);  //年个位
                 cound = RTCBuff1[5];   
                 MDisp_Byte(MNBuff[cound]);  //年十位
                 cound = RTCBuff1[6];   
                 MDisp_Byte(MNBuff[cound]);  //年百位
                 cound = RTCBuff1[7];   
                 MDisp_Byte(MNBuff[cound]);  //年千位
                 MDisp_Byte(MNBuff[16]);
                 break;
            default:  break;
       }
        
        OSTimeDlyHMSM(0,0,1,0); 
	}
}

/*********************************************************************************************************
**                            KeyTask 任务6
********************************************************************************************************/


void KeyTask	(void *pdata)
{	
	uint8 keyvalue;
	pdata = pdata;
	
	PINSEL0 = PINSEL0 & (0x0FFFFFFF);   //P0.15,P0.14作IO端品
	PINSEL1 = PINSEL1 & (~0x03);       //P0.16作IO端口
	IO0DIR = IO0DIR & (~key1) & (~key2) & (key3);   //作输入口
		
	while (1)
	{
        	    
        OSTimeDlyHMSM(0,0,0,70);  
	}
}

/*********************************************************************************************************
**                            UARTTask 任务8
********************************************************************************************************/
void UARTTask	(void *pdata)
{	
	uint8 i;
	pdata = pdata;
	
		
	while (1)
	{
		i++;  	    
        OSTimeDlyHMSM(0,0,01,0);  
	}
}

/************************************************************************************************
** Function name:MN_Send_Byte
** Descriptions: 模拟I2C静态显示一个字节
** input parameters:  无
** output parameters: 无
** Returned value:    无
************************************************************************************************/
void MDisp_Byte(uint32 d)   //模拟I2C发送一个显示码
{
    uint8 i = 8;
    while( i-- )
    {
        IO0CLR = 0x01;   //P0.0为SCK,P0.1为SDA
        IO0PIN = IO0PIN & (~0x02) | ((d & 0x01) << 1); 
        d = d >> 1; 
        IO0SET = 0x01; 
    }
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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