STM32学习笔记-按键开关与中断函数

一、按键开关如何判断是否按下:

1.首先将按键开关一端,即外部电路的SW2开关联通GND,定义按键开关另一端所连接的GPIO端口,即内部电路设置为上拉输入,此时,当按下按键时,电路连通。

上拉输入:引脚内部通过一个较大的电阻和供电电压相连,当引脚悬空或外部输入高电平时,输入为高电平,当外部输入为低电平时,输入为低电平

当按键按下SW2时,外部电路的输入为低电平,GPIO读到的输入电平为0。当按键按下SW1时,即外部电路输入为高电平时,电路两边都是高电平,电路无法连通,相当于开路,GPIO读取到的是VCC电平,即高电平。

2.用延时函数消除按下和松手时的抖动,为获取引脚输入电平的高低,需用到GPIO_ReadInputDataBit(GPIOX,GPIO_PIN)读取引脚电平,用KeyNum保存电平。

if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) ==0)
	{
		Delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0);
		Delay_ms(20);
		KeyNum=1;
	}

3.可以用同样的方法读取光敏传感器数值,光敏传感器越暗电阻越高,输出高电平,GPIO读取到的输入电平为1

二、设置引脚电平

读取此时端口输出电平:

GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)

读取端口输入电平:

GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)

设置输出高电平:

GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_SET);
GPIO_SetBits(GPIOA,GPIO_Pin_1);

设置输出低电平:

GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_RESET);
GPIO_ResetBits(GPIOA,GPIO_Pin_1);

对GPIOX所有端口配置输出电平:

GPIO_Write(GPIOA,~0X0001);//低电平有效,所以用~按位取反 此时PA0有效 0000 0000 0000 0001
GPIO_Write(GPIOA,~0X0002);//此时PA1有效 0000 0000 0000 0010
GPIO_Write(GPIOA,~0X0004);//此时PA2有效 0000 0000 0000 0100
GPIO_Write(GPIOA,~0X0008);//此时PA3有效 0000 0000 0000 1000
GPIO_Write(GPIOA,~0X0010);//此时PA4有效 0000 0000 0001 0000
......

三、外部中断

1.配置时钟,因为时钟都在APB2总线外设上,所以打开APB2时钟。不知道在那个总线上可以右键查看函数定义,在上方注释有所有总线对应时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

如上图是打开GPIOB,打开其他时钟同理

2.初始化外设

初始化AFIO:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);

初始化GPIO:

GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);

初始化EXTI:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
	EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_InitStructure.EXTI_Line=EXTI_Line14;
	EXTI_InitStructure.EXTI_LineCmd=ENABLE;//ENABLE, DISABLE
	EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;  //EXTI_Mode_Interrupt, EXTI_Mode_Event
	EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
	//EXTI_Trigger_Rising(上升沿触发),EXTI_Trigger_Falling(下降沿触发),EXTI_Trigger_Rising_Falling(上升沿和下降沿都触发)
	EXTI_Init(&EXTI_InitStructure);

初始化NVIC:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel= EXTI15_10_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStructure);

调用中断

if(EXTI_GetITStatus(EXTI_Line14) == SET)
	{
		//写每次调用中断时触发的事情
		Encoder_Count++;
        //清空处于中断的状态
		EXTI_ClearITPendingBit(EXTI_Line14);
	}

三、OLED屏幕显示

OLED_Init();//初始化
	OLED_ShowChar(1,1,'A');//显示字母
	OLED_ShowString(1,3,"I am Miss Zhou");//显示字符串
	OLED_ShowNum(2,1,12345,5);//显示数字
	OLED_ShowSignedNum(2,7,12345,5);//显示有符数字
	OLED_ShowHexNum(3,1,0xAA55,4);//显示十六进制数字
	OLED_ShowBinNum(4,1,0xAA22,16);//显示二进制数字
	Delay_ms(2000);
	OLED_Clear();//清屏

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值