[Cortex-M0技术交流] [第六批] 菜鸟学习第二贴------用两位数码管做个0~60秒的马表

[复制链接]
3576|6
 楼主| ljp98 发表于 2012-2-22 19:25 | 显示全部楼层 |阅读模式
程序功能:
上电后,数码管显示"00"
第一次按下KEY1后,数码管以1秒加1的速度开始计时
第二次按下KEY1后,计时停止
第三次按下KEY1后,数码管上显示的时间归零

管脚与数码管的连接方式:
PA0~PA7 ==  "HGFEDCBA"
PA8     ==  SHIWEI
PA9  ==  GEWEI



  1. #include <stdio.h>
  2. #include "NUC1xx.h"
  3. #include "DrvGPIO.h"
  4. #include "DrvSYS.h"
  5. #include "DrvTimer.h"

  6. #define GEWEI_ON GPIOA->DOUT&=~(1<<9)
  7. #define GEWEI_OFF GPIOA->DOUT|=(1<<9)

  8. #define SHIWEI_ON GPIOA->DOUT&=~(1<<8)
  9. #define SHIWEI_OFF GPIOA->DOUT|=(1<<8)

  10. uint8_t Table[11]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff};

  11. uint8_t u8DispCount = 0;
  12. uint8_t u8Cnt5ms;
  13. uint8_t u8SecTime = 0;

  14. uint8_t u8DispData1;
  15. uint8_t u8DispData2;

  16. uint8_t u8StartStop = 0;

  17. //**************************************************************************
  18. // 延时子函数(12MHZ,1MS)
  19. //**************************************************************************
  20. void delay_ms(uint32_t count)
  21. {
  22.     uint32_t i,j;
  23.     for(i=count;i>0;i--)
  24.     for(j=2395;j>0;j--);
  25. }

  26. //**************************************************************************
  27. // 回调函数
  28. //**************************************************************************
  29. void Timer0_Callback (void)
  30. {

  31.     GPIOA->DOUT |= 0xff; //熄灭码

  32.     u8DispCount++;
  33.     if(u8DispCount > 1)u8DispCount = 0;

  34.     switch(u8DispCount)
  35.     {
  36.         case 0x0: //个位码扫描

  37.         GPIOA->DOUT &= Table[u8DispData2];
  38.         GEWEI_ON;
  39.         SHIWEI_OFF;
  40.         break;

  41.         case 0x1: //十位码扫描

  42.         GPIOA->DOUT &= Table[u8DispData1];
  43.         SHIWEI_ON;
  44.         GEWEI_OFF;
  45.         break;

  46.         default:break;
  47.     }

  48.     u8Cnt5ms++;
  49.     if((u8Cnt5ms >= 200)&&(u8StartStop == 1))
  50.     {
  51.         u8SecTime++;u8Cnt5ms = 0;
  52.     }

  53.     if(u8SecTime > 60)u8SecTime = 0;
  54. }

  55. //**************************************************************************
  56. // 系统初始化函数
  57. //**************************************************************************
  58. void Init_System(void)
  59. {
  60.     UNLOCKREG(x);
  61.     DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1); //设定时钟为外部12M
  62.     DrvSYS_Delay(5000);
  63.     LOCKREG(x);
  64. }

  65. //**************************************************************************
  66. // Timer0初始化函数
  67. //**************************************************************************
  68. void Init_Timer0(void)
  69. {
  70.     DrvTIMER_Init();
  71.     DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC,0);
  72.     DrvTIMER_Open(E_TMR0,200,E_PERIODIC_MODE);
  73.     DrvTIMER_SetTimerEvent(E_TMR0,1,(TIMER_CALLBACK) Timer0_Callback,0);
  74.     DrvTIMER_EnableInt(E_TMR0); //允许定时器T0中断
  75.     DrvTIMER_Start(E_TMR0); //开始启动定时器T0
  76. }


  77. //**************************************************************************
  78. // 显示设置函数
  79. //**************************************************************************
  80. void DispSet(void)
  81. {
  82.     u8DispData1 = u8SecTime/10;
  83.     u8DispData2 = u8SecTime%10;
  84. }

  85. //**************************************************************************
  86. // 按键函数
  87. //**************************************************************************
  88. void KeyProgram(void)
  89. {

  90.     static uint8_t u8KeyCount;

  91.     if(DrvGPIO_GetBit(E_GPB, 15) == 1)return;
  92.     delay_ms(10);
  93.     if(DrvGPIO_GetBit(E_GPB, 15) == 1)return;

  94.     while(DrvGPIO_GetBit(E_GPB, 15) == 0)
  95.     {
  96.         delay_ms(10);
  97.         DispSet();
  98.     }
  99.     switch(u8KeyCount)
  100.     {
  101.         case 0:
  102.         u8Cnt5ms = 0;
  103.         u8StartStop = 1; //起动计时
  104.         u8KeyCount = 1; //转换按键状态
  105.         break;

  106.         case 1:
  107.         u8StartStop = 0; //停止计时
  108.         u8KeyCount = 2;
  109.         break;

  110.         case 2:
  111.         u8SecTime = 0; //计时值清零
  112.         u8KeyCount = 0;
  113.         break;

  114.         default:break;
  115.     }
  116. }

  117. //**************************************************************************
  118. // 主函数
  119. //**************************************************************************
  120. int main(void)
  121. {

  122.     Init_System();
  123.     Init_Timer0();
  124.     DrvGPIO_Open( E_GPB, 15, E_IO_INPUT ); //按键端口设置为输入
  125.     while(1)
  126.     {
  127.         KeyProgram(); //按键函数
  128.         DispSet(); //显示设置函数
  129.     }
  130. }




本帖子中包含更多资源

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

×
xyz549040622 发表于 2012-2-23 06:25 | 显示全部楼层
:victory:赞一个,新人发帖,再接再厉
plc_avr 发表于 2012-2-23 07:34 | 显示全部楼层
动手能力不错,顶。
lixiaoxu2meng 发表于 2012-2-23 08:13 | 显示全部楼层
Swallow_0322 发表于 2012-2-23 10:00 | 显示全部楼层
顶!看惯了红色的数码管看黄色的很舒服,:-)
 楼主| ljp98 发表于 2012-2-23 12:49 | 显示全部楼层
谢谢!争取下一贴点亮一个液晶屏。
 楼主| ljp98 发表于 2012-5-26 17:59 | 显示全部楼层
自己再顶顶!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:持之以恒

14

主题

276

帖子

0

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