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按顺序显示。