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

📄 main.c.bak

📁 基于UCOS的万年历
💻 BAK
📖 第 1 页 / 共 2 页
字号:
/*
*********************************************************************************************************
			 XX电子实业有限公司技术部
		      版权所有(c)2006.12.16--2006.12.18
			    http://www.XX.cn

********************************************************************************************************
文件  名:main.C
创建  人:许 文
创建日期:2008.05.29
版    本:万年历V01
描   述:
========================================================================================================
修改  人:
修改时间:
版    本:
描   述:
*********************************************************************************************************
*/

#include "config.h"

#define     BUZZER                  1 << 7               // P0.7控制蜂鸣器,低电平蜂鸣
#define     BUZZER_Set()            PINSEL0 &= (~(INT32U)(1 << 7)), IO0DIR|=(1<<7),IO0CLR|=(1<<7)  // 开蜂鸣器
#define     BUZZER_Clr()            IO0SET|=(1<<7) 

#define TASKKEY_STACK_SIZE    256     		                            /*  TaskKey定义用户堆栈长度      */

#define TASKDISP_STACK_SIZE   128     		                            /*  TaskDisp定义用户堆栈长度     */   

#define TASKSET_STACK_SIZE    128     		                            /*  TaskSet定义用户堆栈长度      */ 

static OS_EVENT  		*KeyBox; 
static OS_EVENT  		*RtcBox; 

OS_STK  TASKKEY_STACK[TASKKEY_STACK_SIZE];
OS_STK  TASKDISP_STACK[TASKDISP_STACK_SIZE];
OS_STK  TASKSET_STACK[TASKSET_STACK_SIZE];

#define     KEY1    1 << 16                                             /*  P0.16为KEY1输入脚             */
#define     KEY2    1 << 17						/*  P0.17为KEY2输入脚             */
#define     KEY3    1 << 18						/*  P0.18为KEY3输入脚             */
#define     KEY4    1 << 19						/*  P0.19为KEY3输入脚             */
uint8 const SHOWTABLE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void TaskKey(void *pdata);
void TaskDisp(void *pdata);
void TaskSet(void *pdata);

/*
*********************************************************************************************************
* Function name:      rtcException
* Descriptions:       RTC的中断服务函数
* Input parameters:   无
* Output parameters:  无			    
*********************************************************************************************************
*/
void rtcException(void)
{
    static INT32U time[2];
    ILR |= 0x01;							/*  清除RTC增量中断标志          */
    time[0] = CTIME0; 
    time[1] = CTIME1;
    OSMboxPost(RtcBox,(void*)time);
    VICVectAddr = 0;                                 	                /*  通知中断控制器中断结束       */

}

/*
*********************************************************************************************************
* Function name:     gpioInit
* Descriptions:      GPIO的初始化
* Input parameters:  无
* Output:            无 
*********************************************************************************************************
*/
void gpioInit(void)
{
     PINSEL0 &= (~(uint32)(1 << 7));
     IO0DIR|=(1<<7);
     IO0SET|=(1<<7);
}

/*
*******************************************************************************************************
* Function name:     rtcInit
* Descriptions:      按照默认值初始化实时时钟.RTC被初始化为时钟源选择Fpclk,秒值增加一次后产生中断.
* Input parameters:  time:初始化时间指针
* Output:            无
*******************************************************************************************************
*/
void rtcInit(uint16 *time)
{
    PREINT = Fpclk / 32768 - 1;	// 设置基准时钟分频器
    PREFRAC = Fpclk - (Fpclk / 32768) * 32768;
	
    CCR   = 0x00;	// 禁止时间计数器
	
    YEAR 	= time[0];							                        /*  初始化时间寄存器             */
    MONTH	= time[1];
    DOM 	= time[2];
    DOW 	= time[3];
    HOUR	= time[4];
    MIN 	= time[5];
    SEC		= time[6];
    
    CIIR = 0x01;				    // 设置秒值的增量产生一次中断
    ILR = 0x03;						// 清除RTC增量和报警中断标志
    CCR = 0x01;				        // 启动RTC
    
    VICVectAddr0 = (INT32U)rtcException;	// 设置中断服务程序地址
    VICIntEnable = (1 << 13);		// 使能RTC中断
}


/*********************************************************************************************************
** Function name:     keyIn
** Descriptions:      查询按键的输入
** Input parameters:  无
** Returned value:    有效键按下时,返回对应的键值,否则返回0;			    
********************************************************************************************************/
INT32U keyIn(void)
{ 
    INT32U i,uiKey;
    uiKey = KEY1;
    for (i=1;i<5;i++) {
        if ((uiKey&IO0PIN) == 0) {
            break;
        } else {
            uiKey<<=1;
        }
    }
	
    if (i >=5 ) {
    uiKey = 0;
    }
    return uiKey;
}

/*******************************************************************************************
** Function name:      timeDisp
** Descriptions:       将RTC的数据发送到PC机上显示
** Input parameters:   uiTimes  RTC的CTIME0的值
                       uiDates  RTC的CTIME1的值
** Output parameters:  无 
*******************************************************************************************/
void timeDisp(INT32U uiTimes,INT32U uiDates)
{   
    INT32U uiTimedata;
   
    uiTimedata = (uiDates >> 16) & 0xfff;	                            /*  发送年                       */
    pcDispChar(0, SHOWTABLE[uiTimedata / 1000]);
    uiTimedata = uiTimedata % 1000;
    pcDispChar(1, SHOWTABLE[uiTimedata / 100]);
    uiTimedata = uiTimedata % 100;
    pcDispChar(2, SHOWTABLE[uiTimedata / 10]);
    pcDispChar(3, SHOWTABLE[uiTimedata % 10]);
	
    uiTimedata = (uiDates >> 8) & 0x0f;		                            /*  发送月                       */
    pcDispChar(4, SHOWTABLE[uiTimedata / 10]);
    pcDispChar(5, SHOWTABLE[uiTimedata % 10]);
	
    uiTimedata = uiDates & 0x1f;				                        /*  发送日                       */
    pcDispChar(6, SHOWTABLE[uiTimedata / 10]);
    pcDispChar(7, SHOWTABLE[uiTimedata % 10]);
	
    uiTimedata = (uiTimes >> 24) & 0x07;		                        /*  发送星期                     */
    pcDispChar(8, SHOWTABLE[uiTimedata]);
		
    uiTimedata = (uiTimes >> 16) & 0x1f;		                        /*  发送小时                     */
    pcDispChar(9, SHOWTABLE[uiTimedata / 10]);
    pcDispChar(10, SHOWTABLE[uiTimedata % 10]);
	
    uiTimedata = (uiTimes >> 8) & 0x3f;		                            /*  发送分钟                     */
    pcDispChar(11, SHOWTABLE[uiTimedata / 10]);
    pcDispChar(12, SHOWTABLE[uiTimedata % 10]);
	
    uiTimedata = uiTimes & 0x3f;				                        /*  发送秒钟                     */
    pcDispChar(13, SHOWTABLE[uiTimedata / 10]);
    pcDispChar(14, SHOWTABLE[uiTimedata % 10]);
}

/*******************************************************************************************
** Function name:      timeGet
** Descriptions:       根据输入的编号,获得对应编号的数据位的值。
** Input parameters:  n  PC的万年历窗口中时间数据位对应的编号。
** Output parameters: 无
** Returned value:     输入编号对应的时间数据位的值
*******************************************************************************************/
INT32U timeGet(INT32U n)
{	
    INT32U uiTimedata,uiTimes,uiDates;
    uiTimes = (INT32U)CTIME0;					                        /*  读取完整的时钟寄存器         */
    uiDates = (INT32U)CTIME1;
    switch(n) {
    case 0:
        uiTimedata = (uiDates >> 16) & 0xfff;	                        /*  获取年的千位数据             */
        uiTimedata = uiTimedata / 1000;
        break;
    case 1:
        uiTimedata = (uiDates >> 16) & 0xfff;	                        /*  获取年的百位数据             */
        uiTimedata = uiTimedata % 1000;
        uiTimedata = uiTimedata / 100;
        break;
    case 2:                                                             /*  获取年的十位数据             */
        uiTimedata = (uiDates >> 16) & 0xfff;
        uiTimedata = uiTimedata % 100;
        uiTimedata = uiTimedata / 10;
        break;
    case 3:                                                             /*  获取年的个位数据             */
        uiTimedata = (uiDates >> 16) & 0xfff;
        uiTimedata = uiTimedata % 10;
        break;
	case 4:
        uiTimedata = (uiDates >> 8) & 0x0f;		                        /*  获取月的十位数据             */ 
        uiTimedata = uiTimedata / 10;
        break;
	case 5:
        uiTimedata = (uiDates >> 8) & 0x0f;		                        /*  获取月的个位数据             */
        uiTimedata = uiTimedata % 10;
        break;
    case 6:
        uiTimedata = uiDates & 0x1f;				                    /*  获取日的十位数据             */
        uiTimedata = uiTimedata / 10;
        break;
    case 7:
        uiTimedata = uiDates & 0x1f;				                    /*  获取日的个位数据             */
        uiTimedata = uiTimedata % 10;
        break;
    case 8:
        uiTimedata = (uiTimes >> 24) & 0x07;		                    /*  获取星期数                   */
        break;
    case 9:
        uiTimedata = (uiTimes >> 16) & 0x1f;		                    /*  获取小时的十位数据           */
        uiTimedata = uiTimedata / 10;
        break;
    case 10:
        uiTimedata = (uiTimes >> 16) & 0x1f;		                    /*  获取小时的个位数据           */  
        uiTimedata = uiTimedata % 10;
        break;
    case 11:
        uiTimedata = (uiTimes >> 8) & 0x3f;		                        /*  获取分钟的十位数据           */
        uiTimedata = uiTimedata / 10;
        break;
    case 12:
        uiTimedata = (uiTimes >> 8) & 0x3f;		                        /*  获取分钟的个位数据           */
        uiTimedata = uiTimedata % 10;
        break;
    case 13:
        uiTimedata = uiTimes & 0x3f;				                    /*  获取秒钟的十位数据           */
        uiTimedata = uiTimedata / 10;
        break;
    case 14:
        uiTimedata = uiTimes & 0x3f;				                    /*  获取秒钟的个位数据           */
        uiTimedata = uiTimedata % 10;
        break;
    }
    return uiTimedata;
}

/*******************************************************************************************
** Function name:      timeSet
** Descriptions:       根据输入的编号,设置对应编号的时间数据位的值。
** Input parameters:  n  PC的万年历窗口中时间数据位对应的编号。
                       uiTimedata  对应的数据位变化的值,如:+1,-1 
** Output parameters: 无
** Returned value:     无
*******************************************************************************************/
void timeSet(INT32U n,INT32S uiTimedata)
{
    switch(n) {
    case 0:                                                             /*  设置年的千位数据             */
        YEAR += (INT32S)(uiTimedata*1000);
        break;
    case 1:
        YEAR += (INT32S)(uiTimedata*100);
        break;
    case 2:
        YEAR += (INT32S)(uiTimedata*10);
        break;
    case 3:
        YEAR += uiTimedata;
        break;
    case 4:
        MONTH += (INT32S)(uiTimedata*10);		                        /*  设置月                      */  
        break;
    case 5:
        if ((MONTH == 12) && (uiTimedata == 1)) {
            MONTH = 1;
        } else if ((MONTH ==1) && (uiTimedata ==-1)) {
            MONTH = 12;

⌨️ 快捷键说明

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