STM32学习第二课——(操作)按键控制LED灯

对于按键控制LED灯这一课,首先要看小黑板的原理图如下所示
这里写图片描述
查看可知KEY0按键对应的IO口是PC1,KEY1按键所对应的IO口是PC13。这样就可以操作写代码了吗?不不不,在写代码之前必须要清楚自己要干什么,要实现一个什么样的功能,还有程序的基本流程图等等以下是代码部分:

//FUNCTION:按键所对应的IO口初始化
//DATA:20180914
void key_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量     
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能GPIO的时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_13;//选中管脚 1,13
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//IO口上拉输入
  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化外设GPIOC寄存器 
}

因为两个按键都是低电平有效,故要设为上拉。

//FUNCTION:按键处理函数
//DATA:20180914
u8 Key_scan(u8 Mode)
{
    static u8 key_up = 1;//按键松开标志
    if(Mode)key_up = 1;//支持连按
    if(key_up&&(key0==0||key1==0))
    {
        delay_ms(20);//消抖
        key_up = 0;
        if(key0==0)return key0_PRES;
        else if(key1==0)return key1_PRES;

    }
    else if(key0==1&&key1==1)key_up = 1;
    return 0;//无按键按下
}

这里要注意if语句的嵌套。以下是主函数部分:

#include "key.h"
#include "led.h"
#include "delay.h"
#include "sys.h"

int main(void)
{
        u8 t;
        GPIo_Init();
        key_Init();
        delay_init();
        led0 = 0;//点亮LED
//  All_Init();
    while(1)
    { 
        t = Key_scan(0);//取键值
        switch(t)
        {
            case key0_PRES:
                led0=!led0;break;
            case key1_PRES:
                led1=!led1;break;
            default:
              delay_ms(20);
        }       
  }
}

以上就是本次学习的所有代码了,写好下进单片机可以看到现象:KEY0控制LED0的亮灭,KEY1控制LED1的亮灭,即是控制电平的翻转。以上就是本次学习的内容。

总结
有了上一次的学习,今天的学习似乎会变得简单些,然而对于我来说并不是想的那样。C语言知识的缺乏是我在这次学习的过程中遇到的最大的困难,C语言一窍不通的我硬生生把几个语句思考了好几个小时(头都想炸了),浪费了不少的时间。
总之,今天的学习还是有收获的,遇到了问题要学会自己想办法解决,并记录下来,也提醒了我必须要懂得基础的C语言知识,这将会在以后的学习中给予我很大的帮助!
最后,这是写好一个程序所需要做的在写代码之前必须要清楚自己要干什么,要实现一个什么样的功能,还有程序的基本流程图等等

猜你喜欢

转载自blog.csdn.net/qq_41421591/article/details/82710258