ARM开发(4)基于STM32的矩阵键盘按键控制TM1629A LED显示

2019-08-16来源: eefocus关键字:ARM  STM32  矩阵键盘  按键控制  LED显示

一 矩阵键盘按键控制TM1629ALED显示原理:


    1.1 本实验实现矩阵键盘按键控制TM1629ALED显示


    1.2 实验思路:共阴极数码管,掌握数码管段选位选原理  熟悉TM1629A芯片手册


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


二 实验步骤: 

2.1 keyled.h代码:


    #ifndef __KEYLED_H

    #define __KEYLED_H

    #include "sys.h"     

    #define SEG_NUM 16 //段选,2个8段

    #define GRID_NUM 8 //位选

    #define     WRITE_DATA_MODE_AUTO        0x40 // 地址自动加1方式写led显存

    #define     SET_START_ADDRESS       0xc0 // 设置起始地址

    #define     SET_DISP_OFF_COMMAND        0x87 // 关闭显示命令

    #define     DATA_COUNT          2*GRID_NUM  //数据传输个数

    extern  void    Initial_LED(void);  // 初始化

    extern void   DisplayOn(u8  bOn);   //led显示是否打开

    extern void  Display(u8  DspData[]); // led显示数字

    #endif


2.2 keyled.c代码(IO配置):


   #include "stm32f10x.h"

   #include "keyled.h"

   #include "key.h"

   #include "sys.h" 

   #include "delay.h" 

 //配置时钟和IO口

   #define SetClk    GPIO_SetBits(GPIOD,GPIO_Pin_3) //PD3

   #define ClrClk    GPIO_ResetBits(GPIOD,GPIO_Pin_3) //PD3 

   #define SetDIO  GPIO_SetBits(GPIOD,GPIO_Pin_2) //PD2

   #define ClrDIO  GPIO_ResetBits(GPIOD,GPIO_Pin_2) //PD2

   #define TM1638_PINS  0x001f  

 //片选第一二排数码管

   #define ResA    GPIO_ResetBits(GPIOD, GPIO_Pin_1);//PD1

   #define SetA    GPIO_SetBits(GPIOD, GPIO_Pin_1);//PD1  

 /*将一字节数据写到TM1629A中*/

   void WriteData(u8 data )

    {  

        u8 i;

        ResA ;

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

      {

        delay_ms(20);

        ClrClk;拉低时钟

        delay_ms(20);

       if(data & 0x01)

        SetDIO;    //打开数据线

       else

        ClrDIO;   //关闭数据线

       delay_ms(20);

        SetClk;  //拉高时钟

       data>>=1;  //数据右移一位

      } 

        delay_ms(20);

    }  

/*将所要传输的数据显示在led上*/

 void  Display(u8  DspData[])

    {

        u8    i;

         ResA  ;

        SetDIO; //打开数据线

        ClrClk; //拉低时钟

        WriteData(WRITE_DATA_MODE_AUTO); // 采用地址自动加1方式传输数据   

         SetA ;   

         delay_ms(20);

         ResA  ;   

        WriteData(SET_START_ADDRESS);   //  传输起始地址

            /* 传输数据*/

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

        {


         WriteData(DspData[i]);

        }


         SetA ;   

         delay_ms(20);

    }

       /*显示器辉度和开关设置*/

        void    DisplayOn(u8  bOn)

        {

            if(bOn)

                WriteData(0x88+6);

            else

                WriteData(SET_DISP_OFF_COMMAND);

             SetA ; 

        }   


      /*IO口配置*/

    void    Initial_LED(void)

        {       

            GPIO_InitTypeDef GPIO_InitStructure; 

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;


            GPIO_InitStructure.GPIO_Pin =  TM1638_PINS; 

            GPIO_Init(GPIOD , &GPIO_InitStructure);


            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; 

            GPIO_Init(GPIOD, &GPIO_InitStructure);

            GPIO_SetBits(GPIOD, TM1638_PINS);

             SetA ; 

            DisplayOn(0);

        }


2.2 main.c代码(实现按键值LED显示效果):


        #include "delay.h"

        #include "key.h"

        #include "sys.h"

        #include "beep.h"

        #include "keyled.h" 

         int main(void)

         {    

         u8 i,flag;


              u8 key=0;

u8   seg88Code[16]={0x3f, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0X7C, 0x39, 0x5E, 0x79, 0x71};


            delay_init(); //  延时               

            KEY_Init();   // 按键初始化     

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

           Initial_LED(); //  数码管初始化

     /*实现按键值在1到15范围内led显示0到15,具体显示功能可以改,基本思路就是这样*/

            while(1)

            {

                flag=0;

            key=KEY_Scan();

        for(i=1;i<16;i++)

                {


            if(key==i)

            {


                if(key==i)

                {flag =1;

                 break;

                }   

            } 

              }                     

        if(flag==1)

            {   

                DisplayOn(1);

                Display(seg88Code);

                 delay_ms(2); 

            }

        else{

                  DisplayOn(0); 

            } 

             delay_ms(2); 

        }

    }


三 接线测试:


 3.1 与板子接线测试效果良好,按键值在1到16范围内,LED 0到15按顺序显示。

关键字:ARM  STM32  矩阵键盘  按键控制  LED显示

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471341.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:关于STM32F103型号的矩阵按键的程序书写
下一篇:STM32F103——4*4矩阵扫描(极简事件扫描,非主延时)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

ARM920T_内核 und与svc异常模式分析

一、undefined异常模式0. 当执行未定义指令时进入und模式,进入过程:CPU跳至0x4地址执行代码,自动保存CPSR寄存器值至SPSR寄存器,我们要做的就是在0x4处跳转到另一段代码,用这段代码完成现场保护,以及异常处理,最后退出异常。此处使用NOR启动,并且在0x0处执行reset时已经将NOR中的所有代码重定位至SDRAM中,所以跳转时不能用相对跳转(b和bl),必须使用绝对地址跳转,这样CPU将到SDRAM(0x30000000)中执行代码。 ldr pc, =und /*vector 4*/    und: /*设置专属sp_und*/ ldr sp,=0x34000000 /*保护现场*/
发表于 2019-08-22
ARM920T_内核 und与svc异常模式分析

C语言函数指针数组在ARM中断中的应用

一、函数指针的声明与初始化... int max_fun(int a, int b); /*函数指针的声明,声明了两个形参都为int类型,返回值为int类型的函数指针*/int (*fp)(int, int); /*指针初始化*/fp = max_fun;  //fp = &max_fun 也正确 /*函数指针初始化后的调用*/fp(a,b);       //(*fp)(a,b);也正确 ...二、函数指针的typedeftypedef void (*irq_func)(int); //定义一个数组,存放中断函数指
发表于 2019-08-22

ARM920T_内核MMU与cache应用分析

,arm9有16个域,此处设置0选择域0),C(是否开启cache),B(是否开启Write buffer),其他位用默认值。重映射代码如下:#define MMU_SECDESC_AP      (3<<10)#define MMU_SECDESC_DOMAIN  (0<<5)#define MMU_SECDESC_NCNB    (0<<2)#define MMU_SECDESC_WB      (3<<2)#define MMU_SECDESC_TYPE   
发表于 2019-08-22
ARM920T_内核MMU与cache应用分析

森海塞尔与Karma 合作 推出AMBEO沉浸式车内音频解决方案

据外媒报道,森海塞尔(Sennheiser)与南加州豪华汽车制造商Karma automotive合作,推出了AMBEO沉浸式音频解决方案,用于车内娱乐和交流,从而进军汽车行业。AMBEO音响系统采用顶级麦克风、扬声器技术和3D音频专业技术,为通话提供优质环绕声和清晰音频。森海塞尔联合首席执行官Daniel Sennheiser表示,“我们很高兴能与Karma Automotive合作,将AMBEO沉浸式音频体验应用到汽车中。我们将未来移动出行与未来音频享受结合起来。”分布式音响系统该AMBEO音响系统包括一个双层布置的多通道扬声器装置,以及一个低音炮,可以在座舱任何位置提供真实的沉浸式音效。此外,车辆头枕也集成到扬声器概念中
发表于 2019-08-19
森海塞尔与Karma 合作 推出AMBEO沉浸式车内音频解决方案

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

一 矩阵键盘控制蜂鸣器原理: 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
发表于 2019-08-19

ARM开发(2)基于STM32的蜂鸣器

一 蜂鸣器原理: 1.1 本实验实现1个蜂鸣器间隔1S鸣叫。1.2 实验思路:根据电路图原理,给蜂鸣器相关引脚赋予高低电平,实现电路的导通,使蜂鸣器实现鸣叫或不鸣。1.3 开发环境 : MDK5 库函数版本开发 JLINK仿真 二 实验步骤: 2.1 beep.h代码: #ifndef __BEEP_H #define __BEEP_H #include “sys.h” #define BEEP PBout(10) // BEEP,蜂鸣器接口 void BEEP_Init(void); //初始化 #endif 2.2 beep.c代
发表于 2019-08-19

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved