一 矩陣鍵盤按鍵控制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按順序顯示。