单片机
返回首页

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

2019-08-16 来源:eefocus

一 矩阵键盘按键控制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按顺序显示。

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 短波AM发射器电路设计图

  • 带有短路保护系统的5V直流稳压电源电路图

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章