ARM开发(3)基于STM32的矩阵键盘控制蜂鸣器

时间:2021-06-18 14:33:34

一 矩阵键盘控制蜂鸣器原理:

 1.1 本实验实现8*7矩阵键盘上按键控制蜂鸣器响。



 1.2 实验思路:根据电路图原理,找出矩阵键盘行列所对应的引脚,赋予对应的按键值,然后控制蜂鸣器响。



 1.3 开发环境 : MDK5 库函数版本开发 JLINK仿真

二 实验步骤:

 2.1  key.h代码:

          #ifndef __KEY_H

          #define __KEY_H     

          #include"sys.h"

          #define ROWPINS GPIO_Pin_6|GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_3|GPIO_Pin_2\

          |GPIO_Pin_1|GPIO_Pin_0//矩阵键盘行引脚

    

          #define COLPINS GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_12|GPIO_Pin_11\

          |GPIO_Pin_10|GPIO_Pin_9|GPIO_Pin_8|GPIO_Pin_7//矩阵键盘列引脚

          void KEY_Init(void);//矩阵键盘初始化

          u8 KEY_Scan(void); //按键扫描程序

          #endif



2.2   key.c代码(IO配置和按键扫描):

             

        #include "key.h"

        u16 rowPin[7] = {GPIO_Pin_6,GPIO_Pin_5,GPIO_Pin_4,GPIO_Pin_3,GPIO_Pin_2,GPIO_Pin_1,GPIO_Pin_0};//行

        u16 colPin[8] = {GPIO_Pin_14,GPIO_Pin_13,GPIO_Pin_12,GPIO_Pin_11,GPIO_Pin_10,GPIO_Pin_9,GPIO_Pin_8,GPIO_Pin_7};//列 

                     

         void KEY_Init(void)

        {

         

         GPIO_InitTypeDef GPIO_InitStructure;

         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//使能PE端口时钟

         GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP; //推挽输出

            

         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//IO口速度为50MHz

            

         GPIO_InitStructure.GPIO_Pin  = COLPINS;//行端口配置

            

         GPIO_InitStructure.GPIO_Pin  =ROWPINS;//列端口配置

         

         GPIO_Init(GPIOE, &GPIO_InitStructure);//根据参数初始化GPIOE

         

             

        }       

            u8 KEY_Scan(void)//按键扫描按键按下的是哪一个键(本实验默认矩阵按键是1到56)

            {     

            u8 i ,j ,k;

        

         

                for(i=0;i<=6;i++)

                {  

                  GPIO_SetBits(GPIOE,rowPin[i]);

                    for(k=0;k<=6;k++)

                    {

                        if(k!=i)

                        {

                             GPIO_ResetBits(GPIOE,rowPin[k]);

                        }

                    }

                   for(j=0;j<=7;j++)

                   {

                     

    

                    if(GPIO_ReadInputDataBit(GPIOE,colPin[j]) !=0)

                    {

                        

                         return 8*i +j;

                        

                    }

                    

                   } 

                 

                }

                return 0;

             }

              

                

                

2.2  main.c代码(实现蜂鸣器间隔1S鸣叫效果):

                  

                    #include "delay.h"

                    #include "key.h"

                    #include "sys.h"

                    #include "beep.h"

                    int main(void)

                    {

                        u8 i;

                        u8 key=0;

                        delay_init();//延时

                         

                        KEY_Init();  //键盘初始化        

                        BEEP_Init(); //蜂鸣器初始化

                        while(1)

                        {

                            

                          key=KEY_Scan();//得到按键值

                            if(key==50)如果按键值是50,则蜂鸣器响

                            {

                                BEEP =!BEEP ;

                                delay_ms(1000);

                            

                            }

                        }

                        

                            

                   } 



三 接线测试:

 

3.1 与板子接线测试效果良好,找到按键值为50的按下去,蜂鸣器响。



3.2注意事项:蜂鸣器的文件在上次实验中,本次就不在赘述了。