cortex m0 lpc1114 RIS寄存器
这一节,介绍如何利用读取RIS寄存器检测引脚上的高低电平变化。
新建一个工程,结构如下图所示:
在main.c文件中,输入以下代码:
- #include “LPC11XX.H”
- #define LED1_ON? LPC_GPIO1->DATA &= ~(1<<0)
- #define LED1_OFF LPC_GPIO1->DATA |= (1<<0)
- #define LED2_ON? LPC_GPIO1->DATA &= ~(1<<1)
- #define LED2_OFF LPC_GPIO1->DATA |= (1<<1)
- #define KEY1_DOWN (LPC_GPIO1->DATA&(1<<9))!=(1<<9)
- #define KEY2_DOWN (LPC_GPIO1->DATA&(1<<10))!=(1<<10)
- void led_init()
- {
- ? ?LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16); // 使能IOCON时钟
- ? ?LPC_IOCON->R_PIO1_0 &= ~0x07;
- ? ?LPC_IOCON->R_PIO1_0 |= 0x01; //把P1.0脚设置为GPIO
- ? ?LPC_IOCON->R_PIO1_1 &= ~0x07;
- ? ?LPC_IOCON->R_PIO1_1 |= 0x01; //把P1.1脚设置为GPIO
- ? ?LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<16); // 禁能IOCON时钟
- ? ?LPC_GPIO1->DIR |= (1<<0); // 把P1.0设置为输出引脚
- ? ?LPC_GPIO1->DATA |= (1<<0); // 把P1.0设置为高电平
- ? ?LPC_GPIO1->DIR |= (1<<1); // 把P1.1设置为输出引脚
- ? ?LPC_GPIO1->DATA |= (1<<1); // 把P1.1设置为高电平
- }
- int main()
- {
- ? ?led_init();
- ? ?while(1)
- ? ?{
- ? ? ? if((LPC_GPIO1->RIS&(1<<9))==(1<<9)) // 读取RIS寄存器
- ? ? ? {
- ? ? ? ? ?LED1_ON;
- ? ? ? ? ?while(KEY1_DOWN);
- ? ? ? ? ?LED1_OFF;
- ? ? ? ? ?LPC_GPIO1->IC = 0XFFF;? // 清RIS状态位
- ? ? ? }
- ? ? ? if((LPC_GPIO1->RIS&(1<<10))==(1<<10)) // 读取RIS寄存器
- ? ? ? {
- ? ? ? ? ?LED2_ON;
- ? ? ? ? ?while(KEY2_DOWN);
- ? ? ? ? ?LED2_OFF;
- ? ? ? ? ?LPC_GPIO1->IC = 0XFFF;? // 清RIS状态位
- ? ? ? }
- ? ?}
- }
与上一节DATA的程序相比,重点在第26和33行,这里是读取RIS寄存器,来判断引脚上的电平高低。RIS寄存器是原始中断状态寄存器,只要有IS、IBE、IEV寄存器中设置的中断方式产生,就会使得RIS位置1,由IS、IBE、IEV寄存器的默认值可以看出,引脚为下降沿中断,所以当按键按下,产生低电平,RIS对应位就会置1。还有一点需要注意的是,RIS寄存器需要软件清0,如第31行和第38行。