[菜农助学交流] ★第四批★Doe_cn 第四帖PWM之按键控制LED的明暗程度

[复制链接]
2410|0
 楼主| Doe_cn 发表于 2012-2-5 15:36 | 显示全部楼层 |阅读模式
本帖最后由 Doe_cn 于 2012-2-8 23:12 编辑

说下感受吧,M0的寄存器配置挺多的,就目前来说我已经学到了不少东西。
总之感觉还是不错的,在此再次感谢大叔,李老师,九哥在我的学习过程中给予的支持与指导。
本例程的功能是当按下与GPB14相连的按键后,LED渐渐从暗到亮,达到最亮后再渐渐变暗,并不断循环,当按键松开后明亮程度不再变化。。。

  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/
  6. #include "NUC1xx.h"
  7. #include "DrvGPIO.h"
  8. /*延时函数*/
  9. void delay_ms(uint32_t count)
  10. {
  11.     uint32_t i,j;
  12. for(i = count;i > 0;i--)
  13.      for(j = 2395;j > 0;j--);
  14. }
  15. /*必要端口初始化函数*/
  16. void GPIO_Init()
  17. {
  18. /*将与按键相连的IO口设置为准双向口*/
  19. DrvGPIO_Open(E_GPB,14,E_IO_QUASI);
  20. }
  21. /*按键扫描*/
  22. int Key_Scan()
  23. {
  24. return DrvGPIO_GetBit(E_GPB,14);
  25. }

  26. /*PWM0初始化设置*/
  27. void PWM0_Init()
  28. {
  29. /*GPA12端口初始化为PWM输出端*/
  30. SYS->GPAMFP.PWM0_AD13 = 1;
  31. /*PWM0时钟使能*/
  32. SYSCLK->APBCLK.PWM01_EN = 1;
  33. /*时钟源选择为外部时钟*/
  34. SYSCLK->CLKSEL1.PWM01_S = 3;
  35. /*PWM0时钟选择寄存器设置*/
  36. PWMA->CSR.CSR0 = 0;   //不进行分频

  37. /*PWMA预分频寄存器设置*/
  38. PWMA->R.CP01 = 1;

  39. /*设置PWM0为自动重装模式*/
  40. PWMA->CR.CH0MOD = 1;
  41. /*设置PWM输出波形的占空比,占空比=(CNR+1)/(CMR+1)*/
  42. PWMA->CNR0 = 100;
  43. PWMA->CMR0 = 100;
  44. /*输出反转设置为不反转*/
  45. PWMA->CR.CH0INV = 0;
  46. /*PWM定时器0使能*/
  47. PWMA->CR.CH0EN = 1;

  48. /*通道0输出使能*/  
  49.   PWMA->OE.PWM0 = 1;  
  50. }

  51. int main()
  52. {
  53. int temp = 100;
  54. unsigned char flag = 0;
  55. /*端口初始化*/
  56. GPIO_Init();
  57. /*PWM0初始化*/
  58. PWM0_Init();
  59. while(1)
  60. {
  61.     while(!Key_Scan() == 1)
  62.     {
  63.       delay_ms(15);
  64.    if(!Key_Scan() == 1)
  65.    {
  66.     while(!Key_Scan())
  67.     {
  68.      delay_ms(35);
  69.      if(flag == 0)temp--;
  70.      else   temp++;
  71.      if((temp == 0)||(temp == 100))
  72.      {
  73.       flag = ~flag;
  74.      }
  75.      /*对比较寄存器重新赋值*/
  76.      PWMA->CMR0 = temp;
  77.     }
  78.    }
  79.     }
  80. }
  81. }

本帖子中包含更多资源

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

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

本版积分规则

2

主题

468

帖子

1

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