一、按键开关如何判断是否按下:
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();//清屏