打印
[菜农助学交流]

定时器0每秒加1,在数码管上显示

[复制链接]
3297|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 strang 于 2011-8-21 01:31 编辑
/**************************************************
** 文件名称:NUC120_HOT_TIMER.c
** 文件说明:NUC120助学板练习程序
** 作    者:21IC_strang
** 创建日期:2011-08-20
** 修改日期:
** 备    注:定时器0 1S定时并中断练习
** 实现功能:定时器0  每秒加1,在数码管上显示,大于99S之后自动清零,循环显示
** 接线方式:        主板        显示板       
                                PA.0----La
                                PA.1----Lb
                                PA.2----Lc
                                PA.3----Ld
                                PA.4----Le
                                PA.5----Lf
                                PA.6----Lg
                                PA.7----Ldp
                                PA.8----S1
                                PA.9----S2
                                VDD        ----VCC
**************************************************/
#include <stdio.h>
#include "NUC1xx.h"
#include "Driver\DrvGPIO.h"
#include "Driver\DrvSYS.h"
#include "Driver\DrvTIMER.h"

unsigned char Table[18]=
{
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0xff
};
volatile uint32_t u32Timer0Cnt;
volatile uint32_t  count;

/***************
**  函数声明  **
***************/
void Init_System (void);
void Init_Timer0(void);
void Timer0_Callback (void);

/*****************************
** Name:      Timer0_Callback
** Function:  Timer0 Callback function
** Input:     None
** OutPut:    None
** Data:      2011-08-20
** Note:      
****************************/
void Timer0_Callback (void)
{
        if(++u32Timer0Cnt>999)//定时1S
        {
                if(++count>99)//大于99S清零
                {
                   count=0;
                }
                u32Timer0Cnt = 0;
        }
}

/******************************************************************
** Name:      Init_System
** Function:  系统初始化函数
** Input:      None
** OutPut:     None
** Data:       2011-03-17
** Note:      
*******************************************************************/
void Init_System(void)
{
        /* Unlock the locked registers before access */
    UNLOCKREG(x);        //寄存器锁定键地址寄存器(RegLockAddr) :有些系统控制寄存器需要被保护起来,以防止误操作而影响芯片运行,
                                    //这些寄存器在上电复位到用户解锁定之前是锁定的。用户可以连续依次写入“59h”, “16h” “88h”到0x5000_0100解锁定.
        /* Enable the 12MHz oscillator oscillation */
        DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);                                                                //SYSCLK->PWRCON.XTL12M_EN = 1;

        /* Waiting for 12M Xtal stable */
        //while (DrvSYS_GetChipClockSourceStatus(E_SYS_XTL12M) != 1);                //SYSCLK->CLKSTATUS.XTL12M_STB
        /*eClkSrc  - [in]  E_SYS_XTL12M / E_SYS_XTL32K / E_SYS_OSC22M / E_SYS_OSC10K / E_SYS_PLL    */
        // Note: Only some of NuMicro NUC100 Series support this function.

        DrvSYS_Delay(5000);
        LOCKREG(x);
        //向“0x5000_0100”写入任何值,就可以重锁保护寄存器

        count=0;
}

/******************************************************************
** Name:      Init_Timer0
** Function:  Timer0初始化函数
** Input:     None
** OutPut:    None
** Data:      2011-04-02
** Note:      
*******************************************************************/
void Init_Timer0(void)
{
        DrvTIMER_Init();                //初始化定时器
        //User must to call this function before any timer operations after system boot up.

        DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC,0);        //设定IP 时钟源       
        /* Set TIMER0 clock source are from 12MHz */
        /* Parameters:                                                                                */
        /* eIpClkSrc- [in]     E_SYS_WDT_CLKSRC   / E_SYS_ADC_CLKSRC  / E_SYS_TMR0_CLKSRC                    */
        /*                             E_SYS_TMR1_CLKSRC  / E_SYS_TMR2_CLKSRC / E_SYS_TMR3_CLKSRC                   */
        /*                                    E_SYS_UART_CLKSRC  / E_SYS_CAN_CLKSRC  / E_SYS_PWM01_CLKSRC                   */
        /*                                    E_SYS_PWM23_CLKSRC / E_SYS_PWM45_CLKSRC/ E_SYS_PWM67_CLKSRC                  */
        /*                                    E_SYS_FRQDIV_CLKSRC/ E_SYS_I2S_CLKSRC                                                    */

        DrvTIMER_Open(E_TMR0,1000,E_PERIODIC_MODE);                //设定定时器 tick 周期并且启动定时器:定时器通道 TMR0  每秒1000次  周期模式
        /* Parameters:                                                                                            */
        /* ch - [in]        E_TIMER_CHANNEL, it could be E_TMR0/E_TMR1/E_TMR2/E_TMR3                                                   */       
        /* uTicksPerSecond - [in]   This value means how many timer interrupt ticks in one second                 */
        /* op_mode - [in]    E_TIMER_OPMODE, E_ONESHOT_MODE/E_PERIODIC_MODE/E_TOGGLE_MODE/E_CONTINUOUS_MODE       */
       
        DrvTIMER_SetTimerEvent(E_TMR0,1,(TIMER_CALLBACK) Timer0_Callback,0);        //安装一个定时处理事件到 timer0, timer1, timer2, timer3通道
        /* Parameters:                                                                                             */
        /* ch - [in] E_TIMER_CHANNEL, it could be E_TMR0/E_TMR1/E_TMR2/E_TMR3                                                    */       
        /* uInterruptTicks - [in]   Number of timer interrupt occurred                                                                    */
        /* pTimerCallback  - [in]   The function pointer of the interrupt callback function                                */
        /* parameter - [in]  A parameter of the callback function                                                  */

        DrvTIMER_EnableInt(E_TMR0);                //enable the specified timer interrupt
        /* Parameters:                                                                                             */
        /* ch - [in]  E_TIMER_CHANNEL, it could be E_TMR0/E_TMR1/E_TMR2/E_TMR3                                                    */       

        DrvTIMER_Start(E_TMR0);                        //Start to count the specified timer channel
        /* Parameters:                                                                                             */
        /* ch - [in]   E_TIMER_CHANNEL, it could be E_TMR0/E_TMR1/E_TMR2/E_TMR3                                                    */       
       
}
/******************************************************************
** Name:      disp(unsigned int data,unsigned char weixuan)
** Function:  数码管选通
** Input:     None
** OutPut:    None
** Data:      2011-08-20
** Note:      
*******************************************************************/
void disp(unsigned int data,unsigned char weixuan)

{
        GPIOA->DOUT|=(0xff<<0);
        GPIOA->DOUT&= ~(Table[data]<<0);
        switch(weixuan)
        {
                case 1:
                                GPIOA->DOUT&=~(1<<9);
                                GPIOA->DOUT|=(1<<8);
                                break;
                case 2:
                                GPIOA->DOUT&=~(1<<8);
                                GPIOA->DOUT|=(1<<9);
                                break;
                                default:break;
        }
}
/******************************************************************
** Name:      dispsiwei(unsigned int temp)
** Function:  
** Input:     None
** OutPut:    None
** Data:      2011-08-20
** Note:      
*******************************************************************/
void dispsiwei(unsigned int temp)
{
        unsigned int i;
       
        for(i=0;i<=1000;i++);       
        disp(temp/10,2);
       
        for(i=0;i<=1000;i++);       
        disp(temp%10,1);
       
        for(i=0;i<=1000;i++);       
}
/******************************************************************
** Name:      main (void)
** Function:  
** Input:     None
** OutPut:    None
** Data:      2011-08-20
** Note:      
*******************************************************************/
int main (void)
{       
        Init_System();
        Init_Timer0();

    while(1)
    {
            dispsiwei(count);       
    }
}

[local]1[/local]
[local]2[/local]
[local]3[/local]

定时器0每秒加1,在数码管上显示,大于99S之后自动清零,循环显示

相关帖子

沙发
strang|  楼主 | 2011-8-21 02:06 | 只看该作者
[local]1[/local]

使用特权

评论回复
板凳
strang|  楼主 | 2011-8-21 02:31 | 只看该作者
cortex-m0定时器数码管显示.rar (2.92 MB)

显示板原理图.jpg (145.12 KB )

显示板原理图.jpg

20110820432.jpg (207.69 KB )

20110820432.jpg

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:技术工程师
简介:

48

主题

3158

帖子

9

粉丝