ARM开发(4)基于STM32的矩阵键盘按键控制TM1629A 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按顺序显示。

你可能感兴趣的:(嵌入式)