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

📄 main.c

📁 SmartARM2300 基于uCOS的万年历
💻 C
📖 第 1 页 / 共 2 页
字号:
        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;
        } else {
            MONTH += uiTimedata;		                                        
        }
        break;
    case 6:                                                             /*  设置日期                    */
        DOM += (INT32S)(uiTimedata*10);
        if (DOM == 0) {
            if (uiTimedata == 1) { 
            DOM = 1;
            } else {
            DOM = 31;
            }	
        }
        break;
    case 7:
        DOM += uiTimedata;
        if (DOM == 0) {
            if (uiTimedata == 1) { 
            DOM = 1;
            } else {
            DOM = 31;
            }	
        }
        break;
    case 8:                                                    
        DOW += uiTimedata;
        break;
    case 9:                                                             /*  设置小时                    */
        HOUR += (INT32S)(uiTimedata*10);
        if (HOUR > 23) {
            if (uiTimedata == 1) { 
            HOUR = 0;
            } else {
            HOUR = 23;
            }	
        }                                        
        break;
    case 10:
        HOUR += uiTimedata;
        if (HOUR > 23) {
            if (uiTimedata == 1) { 
            HOUR = 0;
            } else {
            HOUR = 23;
            }	
        }         	   
        break;
    case 11:
        MIN += (INT32S)(uiTimedata*10);                                 /*  设置分钟                    */
        if (MIN > 59) {
            if (uiTimedata == 1) { 
            MIN = 0;
            } else {
            MIN = 59;
            }	
        }         
        break;
    case 12:
        MIN += uiTimedata;
        if (MIN > 59) {
            if (uiTimedata == 1) { 
            MIN = 0;
            } else {
            MIN = 59;
            }	
        }      
        break;
    case 13:                                                            /*  设置秒钟                    */
        SEC += (INT32S)(uiTimedata*10);
        if (SEC > 59) {
            if (uiTimedata == 1) { 
            SEC = 0;
            } else {
            SEC = 59;
            }	
        }      
        break;
    case 14:
        SEC += uiTimedata;
        if (SEC > 59) {
            if (uiTimedata == 1) { 
            SEC = 0;
            } else {
            SEC = 59;
            }	
        }      
        break;
    }
   
}

/*******************************************************************************************
** Function name:      weekdayGet
** Descriptions:       根据输入的日期,计算该日期对应的星期数。
** Input parameters:  uiYear   年
                       uiMonth  月
                       uiDay    日    
** Output parameters: 无
** Returned value:     对应的星期数
*******************************************************************************************/
INT32U weekdayGet(INT32U uiYear,INT32U uiMonth,INT32U uiDay)   
{   
    INT32U  uiDays[12] = {31,59,90,120,151,181,212,243,273,304,334,365};   
    INT32U  uiNum;
    uiNum = (INT32U)((uiYear-1L)*365 + uiDay + (uiYear-1L)/4 - (uiYear-1L)/100 + (uiYear-1L)/400);   
    if(uiMonth > 1)   
        uiNum+=uiDays[uiMonth-2];   
    if((uiMonth > 2)&&(uiYear%4==0&&uiYear%100!=0||uiYear%400==0))   
        uiNum++;   
    return   uiNum % 7;   
}   


/*********************************************************************************************************
** Function name :     main
** Descriptions  :     主函数
** Input parameters:   无 
** Output parameters:  无 
********************************************************************************************************/
int main (void)
{
    OSInit(); 
    OSTaskCreateExt(TaskKey,
                    (void *)0,
                    &TASKKEY_STACK[TASKKEY_STACK_SIZE-1],
                    TASKKEY_PRIO,
                    TASKKEY_ID,
                    &TASKKEY_STACK[0],
                    TASKKEY_STACK_SIZE,
                    (void *)0,
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); 
             
                              
    OSStart();                                       
}
		
/*******************************************************************************************
** Function name:      TaskKey
** Descriptions:       键盘任务
** Input  parameters:  无
** Output parameters:  无 
*******************************************************************************************/
void TaskKey (void *pdata)
{   
    INT32U uiKey,uiKey0,uiKeyMsg,uiModeFlag=0;
	INT16U TimeSet[7] = {2007,3,2,5,15,05,30};	                        /*  用于设定RTC的初始时间        */
    pdata = pdata;
#if OS_CRITICAL_METHOD == 3				                                
    OS_CPU_SR  cpu_sr;
#endif	
    TargetInit();
    gpioInit();
    SetVICIRQ(13,4,(uint32)rtcException);                               /*  中断优先级为4                */ 
    uart0Init();								                        /*  串口0初始化为8位数据位,1位停*/
                                                                        /*  止位,无奇偶校验,波特率为   */
                                                                        /*  115200,且初始化了串口0的引脚 */   
    RtcBox = OSMboxCreate((void *)0);
    KeyBox = OSMboxCreate((void *)0);
    OSTaskCreateExt(TaskDisp,
                   (void *)0,
                   &TASKDISP_STACK[TASKDISP_STACK_SIZE-1],
                   TASKDISP_PRIO,
                   TASKDISP_ID,
                   &TASKDISP_STACK[0],
                   TASKDISP_STACK_SIZE,
                   (void *)0,
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
    OSTaskCreateExt(TaskSet,
                   (void *)0,
                   &TASKSET_STACK[TASKSET_STACK_SIZE-1],
                   TASKSET_PRIO,
                   TASKSET_ID,
                   &TASKSET_STACK[0],
                   TASKSET_STACK_SIZE,
                   (void *)0,
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
    rtcInit(TimeSet);	                                                /*  初始化RTC内部的时间值,并且设*/
                                                                        /*  定为秒值产生增量时,中断产生 */
    while(1) {	 
        OSTimeDly(1);                                                   /*  延时                         */
        uiKey = keyIn();                                                /*  获取按键操作信息             */ 
        if ((uiKey == 0) | (uiKey !=uiKey0)) {                          /*  未按键或与上次不同           */
            uiKey0 =uiKey;                                              /*  记录本次按键                 */ 
            continue;                                                   /*  再延时                       */
        } else {
            BUZZER_Set();
        }
        switch(uiKey) {                                                 /*  有按键,并已经稳定,则根据按 */                      
                                                                        /*  键不同,执行不同的处理。     */
            case KEY1:
            if ( 0==uiModeFlag ) {
                PCONP |=  (1<<9);
                CCR  = 0x10;                                            /*  停止RTC计数                  */
                uiModeFlag=1;
            } else {
                CCR  = 0x11;                                            /*  启动RTC计数                  */
                PCONP &= ~(1<<9);	
                uiModeFlag=0;
            }
            case KEY2:
            case KEY3:
            case KEY4:
                uiKeyMsg=uiKey;
                OSMboxPost(KeyBox,(void *)&uiKeyMsg);
                break;
        }  	
        while ((uiKey&IO0PIN) == 0) {                                   /*  等待按键释放。               */   
            OSTimeDly(1);
        }	  	
        BUZZER_Clr();		
    }
}


/*******************************************************************************************
** Function name:      TaskDisp
** Descriptions:       时间更新时,读取RTC的时间值,并将读出的时分秒值通过串口0送到上位机的EASYARM.exe显示。
** Input parameters:  无
** Output parameters: 无
*******************************************************************************************/
void TaskDisp (void *pdata)
{
    INT8U err;
    void *pTimeMsg;
    pdata = pdata;
#if OS_CRITICAL_METHOD == 3				
    OS_CPU_SR  cpu_sr;
#endif
    while(1) {	 
        pTimeMsg = OSMboxPend(RtcBox,0,&err);          	                /*  等待消息邮箱Rtcbox有效       */   
        timeDisp (*(INT32U*)pTimeMsg,           		                /*  将RTC数据发送到PC机的万年    */  
                  *((INT32U*)pTimeMsg+1));           	                /*  历显示窗口                   */  
    }

}


/*******************************************************************************************
** Function name:      TaskSet
** Descriptions:       设置任务
** Input parameters:  无
** Output parameters: 无
*******************************************************************************************/
void TaskSet(void *pdata)
{
    INT8U err,n;
    INT32U uiDates,uiTimes,uiTimedata,uiLoopCnt;
    void *pKeyMsg;
    uiLoopCnt = 16;
    n = 0;
    pdata = pdata;
#if OS_CRITICAL_METHOD == 3				
    OS_CPU_SR  cpu_sr;
#endif
    while(1) {
pend:   pKeyMsg = OSMboxPend(KeyBox,0,&err);
        if (*(INT32U*)pKeyMsg!=KEY1) {
            continue;
        }
        while(1) {
            pKeyMsg = OSMboxAccept(KeyBox);                             /*  无等待获取键盘消息           */
            if (pKeyMsg != (void *)0) {
                switch (*(INT32U*)pKeyMsg) {
                case KEY1:
                    goto  pend;                                         /*  返回显示模式                 */
                case KEY2:
                    if ((n == 7) | (n == 3)) {
                        n++;
                    }
                    n=(INT8U)((n+1)%15);                                /*  得到下一选中数据位的对应编号 */
                    break;
                case KEY3:                                              /*  将选中的数据位加一           */
                    timeSet(n,1);
                    break;
                case KEY4:
                    timeSet(n,-1);                                      /*  将选中的数据位减一           */
                    break;
                }
                
                DOW = weekdayGet((INT32U)YEAR,                          /*  由年月日得到对应的星期数     */
                                 (INT32U)MONTH,
                                 (INT32U)DOM);
                uiTimes = (INT32U)CTIME0;				                /*  读取完整的时钟寄存器         */
                uiDates = (INT32U)CTIME1;
                timeDisp(uiTimes,uiDates);
            }
            
            uiLoopCnt--;                                                /*  循环计数减一                 */
            if (8==uiLoopCnt) {
                uiTimedata = timeGet(n);
                pcDispChar(n, SHOWTABLE[uiTimedata]);
            } else if (0==uiLoopCnt) {
                pcDispChar(n,0);
                uiLoopCnt=16; 
            }
            OSTimeDly(10);
        }
    }
    
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/



⌨️ 快捷键说明

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