272|0

19

帖子

0

资源

一粒金砂(中级)

【RISC-V MCU CH32V103测评】+ EXTI中断输入开关OLED [复制链接]

       

 

        上次驱动OLED屏之后一天晚上在想,这屏要是晚上也亮着不就小夜灯了(晚上有光睡不着). 所以这次加个光敏电阻模块让他白天显示,晚上就关掉屏.光敏电阻模块经LM393后输出高低电平,触发中断输入,然后读取中断脚PA0引脚电平后置变量exti0_status  0或1.主要处理在while里处理.

/*******************************************************************************
* Function Name  : EXTI0_INT_INIT
* Description    : Initializes EXTI0 collection.
* Input          : None
* Return         : None
*******************************************************************************/
void EXTI0_INT_INIT(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  EXTI_InitTypeDef EXTI_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA,ENABLE);//开启时钟
  //设定引脚
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;         //设为浮动输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  //中断参数设置
   /* GPIOA ----> EXTI_Line0 */
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
  EXTI_InitStructure.EXTI_Line=EXTI_Line0;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;           //中断模式
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//上升下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
  //优先级设置
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

        先初始化一下引脚,中断模式,中断优先级.

        然后是中断响应

/*******************************************************************************
* Function Name  : EXTI0_IRQHandler
* Description    : This function handles EXTI0 Handler.
* Input          : None
* Return         : None
*******************************************************************************/
void EXTI0_IRQHandler(void)
{
   
  if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
  {
    //根据引脚电平设置exti0_status变量值
    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET)
    {
        exti0_status = 1;   
    }else
    {
        exti0_status = 0;   
    }
    EXTI_ClearITPendingBit(EXTI_Line0);     /* 清除标志 */
  }
}

main中编写代码如下

	while(1)
  {

		
        
	    if(exti0_status == 0)
	    {
	        OLED_DisPlay_On();    //开启OLED
	        uint16_t Vrl = 3.3f * ADC_Value / 4095.f;
	        uint16_t Vrl_t = ((3.3f * ADC_Value / 4095.f)*1000-Vrl);
	        OLED_ShowNum(48,16,Vrl,1,24);
	        OLED_ShowChar(62,16,'.',24);//.
	        OLED_ShowNum(74,16,Vrl_t,3,24);
	        OLED_Refresh();
	        Delay_Ms(50);
	    }else
	    {
	        OLED_DisPlay_Off();   //关闭OLED
	    }


  }

        烧录进去后可以看到图一开灯OLED亮起,图二关灯OLED关闭.

   

夜深了,追剧去了.....

 

1.jpg
2.jpg
b90033310151ba4309bc32d886ec363.jpg

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

最新文章 更多>>
    关闭
    站长推荐上一条 1/6 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表