[菜农助学交流] 定时器0每秒加1,在数码管上显示

[复制链接]
 楼主| strang 发表于 2011-8-21 00:23 | 显示全部楼层 |阅读模式
本帖最后由 strang 于 2011-8-21 01:31 编辑
  1. /**************************************************
  2. ** 文件名称:NUC120_HOT_TIMER.c
  3. ** 文件说明:NUC120助学板练习程序
  4. ** 作    者:21IC_strang
  5. ** 创建日期:2011-08-20
  6. ** 修改日期:
  7. ** 备    注:定时器0 1S定时并中断练习
  8. ** 实现功能:定时器0  每秒加1,在数码管上显示,大于99S之后自动清零,循环显示
  9. ** 接线方式:        主板        显示板       
  10.                                 PA.0----La
  11.                                 PA.1----Lb
  12.                                 PA.2----Lc
  13.                                 PA.3----Ld
  14.                                 PA.4----Le
  15.                                 PA.5----Lf
  16.                                 PA.6----Lg
  17.                                 PA.7----Ldp
  18.                                 PA.8----S1
  19.                                 PA.9----S2
  20.                                 VDD        ----VCC
  21. **************************************************/
  22. #include <stdio.h>
  23. #include "NUC1xx.h"
  24. #include "Driver\DrvGPIO.h"
  25. #include "Driver\DrvSYS.h"
  26. #include "Driver\DrvTIMER.h"

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

  33. /***************
  34. **  函数声明  **
  35. ***************/
  36. void Init_System (void);
  37. void Init_Timer0(void);
  38. void Timer0_Callback (void);

  39. /*****************************
  40. ** Name:      Timer0_Callback
  41. ** Function:  Timer0 Callback function
  42. ** Input:     None
  43. ** OutPut:    None
  44. ** Data:      2011-08-20
  45. ** Note:      
  46. ****************************/
  47. void Timer0_Callback (void)
  48. {
  49.         if(++u32Timer0Cnt>999)//定时1S
  50.         {
  51.                 if(++count>99)//大于99S清零
  52.                 {
  53.                    count=0;
  54.                 }
  55.                 u32Timer0Cnt = 0;
  56.         }
  57. }

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

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

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

  80.         count=0;
  81. }

  82. /******************************************************************
  83. ** Name:      Init_Timer0
  84. ** Function:  Timer0初始化函数
  85. ** Input:     None
  86. ** OutPut:    None
  87. ** Data:      2011-04-02
  88. ** Note:      
  89. *******************************************************************/
  90. void Init_Timer0(void)
  91. {
  92.         DrvTIMER_Init();                //初始化定时器
  93.         //User must to call this function before any timer operations after system boot up.

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

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

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

  117.         DrvTIMER_Start(E_TMR0);                        //Start to count the specified timer channel
  118.         /* Parameters:                                                                                             */
  119.         /* ch - [in]   E_TIMER_CHANNEL, it could be E_TMR0/E_TMR1/E_TMR2/E_TMR3                                                    */       
  120.        
  121. }
  122. /******************************************************************
  123. ** Name:      disp(unsigned int data,unsigned char weixuan)
  124. ** Function:  数码管选通
  125. ** Input:     None
  126. ** OutPut:    None
  127. ** Data:      2011-08-20
  128. ** Note:      
  129. *******************************************************************/
  130. void disp(unsigned int data,unsigned char weixuan)

  131. {
  132.         GPIOA->DOUT|=(0xff<<0);
  133.         GPIOA->DOUT&= ~(Table[data]<<0);
  134.         switch(weixuan)
  135.         {
  136.                 case 1:
  137.                                 GPIOA->DOUT&=~(1<<9);
  138.                                 GPIOA->DOUT|=(1<<8);
  139.                                 break;
  140.                 case 2:
  141.                                 GPIOA->DOUT&=~(1<<8);
  142.                                 GPIOA->DOUT|=(1<<9);
  143.                                 break;
  144.                                 default:break;
  145.         }
  146. }
  147. /******************************************************************
  148. ** Name:      dispsiwei(unsigned int temp)
  149. ** Function:  
  150. ** Input:     None
  151. ** OutPut:    None
  152. ** Data:      2011-08-20
  153. ** Note:      
  154. *******************************************************************/
  155. void dispsiwei(unsigned int temp)
  156. {
  157.         unsigned int i;
  158.        
  159.         for(i=0;i<=1000;i++);       
  160.         disp(temp/10,2);
  161.        
  162.         for(i=0;i<=1000;i++);       
  163.         disp(temp%10,1);
  164.        
  165.         for(i=0;i<=1000;i++);       
  166. }
  167. /******************************************************************
  168. ** Name:      main (void)
  169. ** Function:  
  170. ** Input:     None
  171. ** OutPut:    None
  172. ** Data:      2011-08-20
  173. ** Note:      
  174. *******************************************************************/
  175. int main (void)
  176. {       
  177.         Init_System();
  178.         Init_Timer0();

  179.     while(1)
  180.     {
  181.             dispsiwei(count);       
  182.     }
  183. }

[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 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:技术工程师
简介:

48

主题

3253

帖子

9

粉丝
快速回复 在线客服 返回列表 返回顶部
认证:技术工程师
简介:

48

主题

3253

帖子

9

粉丝
快速回复 在线客服 返回列表 返回顶部