天天看點

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按順序顯示。