上一次用到引脚外部中断实现按键的功能,在R7F0C809专门有个按键中断的功能,从手册中可以知道3个寄存器控制。分别是:
键返回控制寄存器 ( KRCTL)
键返回模式寄存器 ( KRM0)
键返回标志寄存器 ( KRF)
我们可以设置这三个寄存器就可以实现按键的功能。
KRCTL只有最低位和最高位配置,如上图,可以通过这两位组成4种功能。
这个寄存器就是设置是否检测键中断信号的。
上图就是键返回标志的寄存器,如果按键一旦按下,对应的KRFn就会置一,这个需要手动用软件清除。
以下就是按键中断功能的示意图:
今天就利用了P1.1的按键功能,P1.1是按键4,所以我们要配置按键4,
但奇怪的是我已经开了按键中断,结果还是进不了INTKR中断。不知道大家也是不是这种情况。
源代码:
- void Port_Init()
- {
-
- KRCTL = 0x80; //Æô¶ˉ¼üÖD¶Ï±êÖ¾
- KRM0 = 0x10; //Æô¶ˉ¼ì2a¼üÖD¶ÏDÅoÅ
- KRF = 0x00; //Çå3yÖD¶ÏDÅoÅ
- KRPR0 = 1; //éèÖÃÖD¶ÏóÅÏ輶
- KRPR1 = 1;
-
- KRIF = 0; //Çå3y¼üÖD¶Ï±ê־λ
- KRMK = 1; //¿aÆô¼üÖD¶Ï
-
- }
- uint8_t Value = 0;
- /******************************************************************************
- * Function Name: main
- * Description : This function implements main function.
- * Arguments : none
- * Return Value : none
- ******************************************************************************/
- void main(void)
- {
- /* Start user code. Do not edit comment generated here */
- inttm00counter = 0U; /* Configuration counter of number of TM00 interrupt */
- g_SW_Counter = 0U; /* Initialization counter of SW input */
- g_TDR00_WorkH = g_DTR000_DataH[0U]; /* Set initial interval */
- g_TDR00_WorkL = g_DTR000_DataL[0U];
- //R_INTC0_Start(); /* Enable INTP0 interrupt */
- //R_TAU0_Channel0_Start(); /* Start TAU0 channel 0 counter */
- Port_Init();
- /* Wait interrupt */
- while (1U)
- {
- //HALT();
- /**/
- //Value = ;Value
- if( (KRF & 0x10) >> 4 )
- {
- P0 ^= 0b00000010U;
- while(P1.1 == 0);
- KRF = 0x00;
- }
-
- }
- /* End user code. Do not edit comment generated here */
-
- }
醉了,注释居然乱码了
gif效果图:
源代码: