历史上的今天
今天是:2025年08月16日(星期六)
2019年08月16日 | 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按顺序显示。
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 04:14 编辑 [local]2[/local]“TI”杯时我们三人的作品。 三角波参数测试仪。 … 查看全部问答> |
|
目录: 第一章 线性电路的复数解法 1.1 电源与元件的概念 1.2 常参量线性电路的复数解法 1.3 一阶RC滤波器 1.4 二级LC滤波器 思考题 习题 第二章 线性电路的s域解法 2.1 拉普拉斯变换 2.2 线性电路的s域解法 2.3 卷积 附录2 拉氏变换 ...… 查看全部问答> |
|
整快板子上的外设不是很多,但是存储器资源丰富。并预留了一个HSMC接口,可以用来扩展。有三张光盘,一张是介绍开发板的使用,例程,入门指导,另两张是Quartus2的软件,常用库,NIOS2开发资料。先简单介绍到这里,把开发板的资料传上来共享(全部 ...… 查看全部问答> |
|
本人一直在一家电源IC原厂华东区做FAE,07年公司从linear挖了一个团队进入LED驱动行业,我随之也开始进入这个行业。在勤勤勉勉的耕耘3年中,我从学习到与客户分享我的学习经验,很多客户都会跟我讲,王工,从你身上我学到了很多。但这时我告诫自己 ...… 查看全部问答> |
|
如何设置vxworks(主机)的IP地址,和网关?如果设置成功,我能否在windows下 用ping 命令对运行中的vxworks进行网络连接??能ping通吗 如何设置vxworks(主机)的IP地址,和网关????????? 如果设置成功,我能否在windows下 用ping 命令对运行中的vxworks进行网络连接??能ping通吗?? … 查看全部问答> |
|
MSP430 电容单触式传感器设计指南,这是官网应用手册,很权威的。 [ 本帖最后由 鑫海宝贝 于 2011-10-12 09:35 编辑 ]… 查看全部问答> |




