cortex m0 lpc1114 RIS寄存器

  • 学习2651次

这一节,介绍如何利用读取RIS寄存器检测引脚上的高低电平变化。

新建一个工程,结构如下图所示:

新建工程

在main.c文件中,输入以下代码:

  1. #include “LPC11XX.H”
  2. #define LED1_ON? LPC_GPIO1->DATA &= ~(1<<0)
  3. #define LED1_OFF LPC_GPIO1->DATA |= (1<<0)
  4. #define LED2_ON? LPC_GPIO1->DATA &= ~(1<<1)
  5. #define LED2_OFF LPC_GPIO1->DATA |= (1<<1)
  6. #define KEY1_DOWN (LPC_GPIO1->DATA&(1<<9))!=(1<<9)
  7. #define KEY2_DOWN (LPC_GPIO1->DATA&(1<<10))!=(1<<10)
  8. void led_init()
  9. {
  10. ? ?LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16); // 使能IOCON时钟
  11. ? ?LPC_IOCON->R_PIO1_0 &= ~0x07;
  12. ? ?LPC_IOCON->R_PIO1_0 |= 0x01; //把P1.0脚设置为GPIO
  13. ? ?LPC_IOCON->R_PIO1_1 &= ~0x07;
  14. ? ?LPC_IOCON->R_PIO1_1 |= 0x01; //把P1.1脚设置为GPIO
  15. ? ?LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<16); // 禁能IOCON时钟
  16. ? ?LPC_GPIO1->DIR |= (1<<0); // 把P1.0设置为输出引脚
  17. ? ?LPC_GPIO1->DATA |= (1<<0); // 把P1.0设置为高电平
  18. ? ?LPC_GPIO1->DIR |= (1<<1); // 把P1.1设置为输出引脚
  19. ? ?LPC_GPIO1->DATA |= (1<<1); // 把P1.1设置为高电平
  20. }
  21. int main()
  22. {
  23. ? ?led_init();
  24. ? ?while(1)
  25. ? ?{
  26. ? ? ? if((LPC_GPIO1->RIS&(1<<9))==(1<<9)) // 读取RIS寄存器
  27. ? ? ? {
  28. ? ? ? ? ?LED1_ON;
  29. ? ? ? ? ?while(KEY1_DOWN);
  30. ? ? ? ? ?LED1_OFF;
  31. ? ? ? ? ?LPC_GPIO1->IC = 0XFFF;? // 清RIS状态位
  32. ? ? ? }
  33. ? ? ? if((LPC_GPIO1->RIS&(1<<10))==(1<<10)) // 读取RIS寄存器
  34. ? ? ? {
  35. ? ? ? ? ?LED2_ON;
  36. ? ? ? ? ?while(KEY2_DOWN);
  37. ? ? ? ? ?LED2_OFF;
  38. ? ? ? ? ?LPC_GPIO1->IC = 0XFFF;? // 清RIS状态位
  39. ? ? ? }
  40. ? ?}
  41. }

与上一节DATA的程序相比,重点在第26和33行,这里是读取RIS寄存器,来判断引脚上的电平高低。RIS寄存器是原始中断状态寄存器,只要有IS、IBE、IEV寄存器中设置的中断方式产生,就会使得RIS位置1,由IS、IBE、IEV寄存器的默认值可以看出,引脚为下降沿中断,所以当按键按下,产生低电平,RIS对应位就会置1。还有一点需要注意的是,RIS寄存器需要软件清0,如第31行和第38行。

发表评论