19讲 按键输入
内容纲要

19讲 按键输入

int main(void)
{
    /* LED 端口初始化 */
    LED_GPIO_Config();

    KEY_GPIO_Config();

    /* 按键扫描 */
    while (1)
    {
        //KEY_Scan(); 端口扫描,返回的值只要读取到KEY引脚的信号就反转,
        if( KEY_Scan(GPIOA,GPIO_Pin_0) == KEY_ON  )
        {
            //这里得TOGGLE 是控制电平得反转,直接操作寄存器。反正这里while 死循环,
            //
            LED1_TOGGLE;
        }

        if( KEY_Scan(GPIOC,GPIO_Pin_13) == KEY_ON  )
        {
            LED2_TOGGLE;
        }
    }
}
//引脚定义
/*******************************************************/
//R 红色灯
#define LED1_PIN                  GPIO_Pin_6                 
#define LED1_GPIO_PORT            GPIOF                      
#define LED1_GPIO_CLK             RCC_AHB1Periph_GPIOF

//G 绿色灯
#define LED2_PIN                  GPIO_Pin_7                 
#define LED2_GPIO_PORT            GPIOF                      
#define LED2_GPIO_CLK             RCC_AHB1Periph_GPIOF

//B 蓝色灯
#define LED3_PIN                  GPIO_Pin_8                 
#define LED3_GPIO_PORT            GPIOF                       
#define LED3_GPIO_CLK             RCC_AHB1Periph_GPIOF
/************************************************************/

/** 控制LED灯亮灭的宏,
    * LED低电平亮,设置ON=0,OFF=1
    * 若LED高电平亮,把宏设置成ON=1 ,OFF=0 即可
    */
#define ON  0
#define OFF 1

/* 带参宏,可以像内联函数一样使用 */
#define LED1(a) if (a)  \
                    GPIO_SetBits(LED1_GPIO_PORT,LED1_PIN);\
                    else        \
                    GPIO_ResetBits(LED1_GPIO_PORT,LED1_PIN)

#define LED2(a) if (a)  \
                    GPIO_SetBits(LED2_GPIO_PORT,LED2_PIN);\
                    else        \
                    GPIO_ResetBits(LED2_GPIO_PORT,LED2_PIN)

#define LED3(a) if (a)  \
                    GPIO_SetBits(LED3_GPIO_PORT,LED3_PIN);\
                    else        \
                    GPIO_ResetBits(LED3_GPIO_PORT,LED3_PIN)

/* 直接操作寄存器的方法控制IO */
#define digitalHi(p,i)           {p->BSRRL=i;}       //设置为高电平
#define digitalLo(p,i)           {p->BSRRH=i;}       //输出低电平
#define digitalToggle(p,i)   {p->ODR ^=i;}       //输出反转状态  //按位异或,当位分别位1与0 是,取得结果为1

/* 定义控制IO的宏 */
#define LED1_TOGGLE     digitalToggle(LED1_GPIO_PORT,LED1_PIN)
#define LED1_OFF            digitalHi(LED1_GPIO_PORT,LED1_PIN)
#define LED1_ON             digitalLo(LED1_GPIO_PORT,LED1_PIN)

#define LED2_TOGGLE     digitalToggle(LED2_GPIO_PORT,LED2_PIN)
#define LED2_OFF            digitalHi(LED2_GPIO_PORT,LED2_PIN)
#define LED2_ON             digitalLo(LED2_GPIO_PORT,LED2_PIN)

#define LED3_TOGGLE     digitalToggle(LED3_GPIO_PORT,LED3_PIN)
#define LED3_OFF            digitalHi(LED3_GPIO_PORT,LED3_PIN)
#define LED3_ON             digitalLo(LED3_GPIO_PORT,LED3_PIN)

/* 基本混色,后面高级用法使用PWM可混出全彩颜色,且效果更好 */

//红
#define LED_RED  \
                    LED1_ON;\
                    LED2_OFF;\
                    LED3_OFF

//绿
#define LED_GREEN       \
                    LED1_OFF;\
                    LED2_ON;\
                    LED3_OFF

//蓝
#define LED_BLUE    \
                    LED1_OFF;\
                    LED2_OFF;\
                    LED3_ON

//黄(红+绿)                    
#define LED_YELLOW  \
                    LED1_ON;\
                    LED2_ON;\
                    LED3_OFF
//紫(红+蓝)
#define LED_PURPLE  \
                    LED1_ON;\
                    LED2_OFF;\
                    LED3_ON

//青(绿+蓝)
#define LED_CYAN \
                    LED1_OFF;\
                    LED2_ON;\
                    LED3_ON

//白(红+绿+蓝)
#define LED_WHITE   \
                    LED1_ON;\
                    LED2_ON;\
                    LED3_ON

//黑(全部关闭)
#define LED_RGBOFF  \
                    LED1_OFF;\
                    LED2_OFF;\
                    LED3_OFF        
void KEY_GPIO_Config(void)
{   
    /* 第一步:开GPIO的时钟 */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOC, ENABLE);

    /* 第二步:定义一个GPIO初始化结构体 */
    GPIO_InitTypeDef GPIO_InitStruct;

  /* 第三步:配置GPIO初始化结构体的成员 */
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
    //GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;   
    //GPIO_InitStruct.GPIO_Speed = GPIO_Low_Speed;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;       
    /* 第四步:调用GPIO初始化函数,把配置好的结构体的成员的参数写入寄存器 */
    GPIO_Init(GPIOA, &GPIO_InitStruct); 

    /* 第三步:配置GPIO初始化结构体的成员 */
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
    //GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;   
    //GPIO_InitStruct.GPIO_Speed = GPIO_Low_Speed;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;       
    /* 第四步:调用GPIO初始化函数,把配置好的结构体的成员的参数写入寄存器 */
    GPIO_Init(GPIOC, &GPIO_InitStruct); 

}

void delay(__IO uint32_t nCount)     //简单的延时函数
{
    for(; nCount != 0; nCount--);
}

uint8_t KEY_Scan(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)
{
    if( GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)== KEY_ON )
    {
        //while 循环是确定按键是否松开。注意,这里用的是电容消抖,如果用软件消抖可以配置10ms延时。
        while( GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)== KEY_ON );

        return KEY_ON;
    }
    else return KEY_OFF;

}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇