LM1640数码管驱动芯片的使用方法
目录
一、LM1640引脚说明
二、LM1640时序分析
三、LM1640指令分析
四、LM1620芯片驱动程序分析
1、LM1640的声明文件
2、LM1640读写数据的底层通信程序
3、LM1640应用层程序
五、LM1640硬件线路连接图
TM1640 是一种LED(发光二极管显示器)驱动控制与用电路,内部集成有MCU 数字接口、数据锁存器、LED 驱动等电路。本产品性能优良,质量可靠。主要应用于电子产品LED显示屏驱动。采用SOP28的封装形式。采用两线串行接口(SCLK,DIN) 总线输入方式。
LM1640功能强大,还可以设值数码管显示的亮度。
一、LM1640引脚说明
LM1640是8位段选输出,16位位选输出(可以控制16个数码管)
二、LM1640时序分析
微处理器的数据通过两线总线接口和TM1640 通信,在输入数据时当CLK 是高电平时,DIN 上的信号必须保持不变;只有CLK 上的时钟信号为低电平时,DIN 上的信号才能改变。数据的输入总是低位在前,高位在后传输.数据输入的开始条件是CLK 为高电平时,DIN 由高变低;结束条件是CLK 为高时,DIN 由低电平变为高电平。
这就说明数据的传输需要有一个开始信号和一个结束信号。
LM1640还有一个地址自动加一的数据传输模式,通过LM1640命令系统开启和关闭。该模式对于单字节数据的传输也采用上述数据传输时序,只是在连续传输数据是不用向固定地址传输那样一个地址一个数据的传输,而是写入一个地址后连续写入多个数据。
三、LM1640指令分析
LM1640有三种不同的指令,以最高两位的编码来区分。
通过DIN输入的第一个字节作为一条指令,输入0x40 是地址自动加一模式,输入0x44是固定地址模式。
这里的地址就是数码管的显示地址,想让哪个数码管显示,就向对应的地址中写入数据,相当于位选了。
显示控制命令用来设置数码管亮度。
四、LM1620芯片驱动程序分析
1、LM1640的声明文件
在LM1640.h文件中对LM1640的各种指令进行宏定义,方便程序中进行设置。
#ifndef __TM1640_H__
#define __TM1640_H__//头文件
#include "sys.h"//定义IO接口
#define TM1640_GPIOPORT GPIOA
#define TM1640_DIN GPIO_Pin_12
#define TM1640_SCLK GPIO_Pin_11#define TM1640_LEDPORT 0xc8 //用到芯片中的第9位选 GRID9//通信速率定义
#define DEL 1 //通信速率(默认为1 通信速度最快)如果不能通信可以加大数值,减慢速度//地址模式的设置
//#define TM1640Mode_Addr 0x40 //自动加1模式
#define TM1640Mode_Addr 0X44 //固定地址模式(推荐)//显示亮度的设置
//#define TM1640Mode_Display 0x88 //亮度最小
//#define TM1640Mode_Display 0x89 //亮度
//#define TM1640Mode_Display 0x8a //亮度
//#define TM1640Mode_Display 0x8b //亮度
#define TM640Mode_Display 0x8c //亮度 (推荐)
//#define TM1640Mode_Display 0x8d //亮度
//#define TM1640Mode_Display 0x8f //亮度最大#define TM640Mode_Display_Off 0x80 //亮度关//函数声明
//底层通信协议
void TM1640_Start(void);
void TM1640_Write(u8 data);
void TM1640_Stop(void);
//初始化
void TM1640_Init(void);
//显示函数
void TM1640_LED(u8 data);
void TM1640_Display(u8 addr, u8 data);
void TM1640_Display_Add(u8 addr, u8 data);#endif
2、LM1640读写数据的底层通信程序
LM1640的底层通信程序由开始条件,写入指令数据,结束条件三部分组成,TM1640_Start()、TM1640_Write(u8 data)、TM1640_Stop()三个构成完整的底层通信协议。
/********************************************************************************
函数:TM1640_Start()
功能:TM1640通信时序开始条件
参数:无
返回值:无
********************************************************************************/
void TM1640_Start(void)
{GPIO_WriteBit(TM1640_GPIOPORT, TM1640_DIN, (BitAction)(1));GPIO_WriteBit(TM1640_GPIOPORT, TM1640_SCLK, (BitAction)(1)); //起始都置高delay_us(DEL); //DEL 1 通信速率(默认为1 通信速度最快)如果不能通信可以加大数值,减慢速度//数据输入的开始条件是CLK 为高电平时,DIN 由高变低GPIO_WriteBit(TM1640_GPIOPORT, TM1640_DIN, (BitAction)(0));delay_us(DEL);GPIO_WriteBit(TM1640_GPIOPORT, TM1640_SCLK, (BitAction)(0)); //SCLK也置低delay_us(DEL);
}/********************************************************************************
函数:TM1640_Stop()
功能:TM1640通信时序结束条件
参数:无
返回值:无
********************************************************************************/
void TM1640_Stop(void)
{GPIO_WriteBit(TM1640_GPIOPORT, TM1640_DIN, (BitAction)(0)); GPIO_WriteBit(TM1640_GPIOPORT, TM1640_SCLK, (BitAction)(1));//SCLK置高 DIN置低delay_us(DEL);//结束条件是CLK 为高时,DIN 由低电平变为高GPIO_WriteBit(TM1640_GPIOPORT, TM1640_DIN, (BitAction)(1));delay_us(DEL);
}/********************************************************************************
函数:TM1640_Write(u8 data)
功能:TM1640通信时序写入数据
参数:u8 data 一个字节 8位的数据
返回值:无
********************************************************************************/
void TM1640_Write(u8 data)
{u8 i; u8 aa; //数据暂存变量aa = data;GPIO_WriteBit(TM1640_GPIOPORT, TM1640_DIN, (BitAction)(0));GPIO_WriteBit(TM1640_GPIOPORT, TM1640_SCLK, (BitAction)(0));//SCLK与DIN都置低for(i = 0; i < 8; i++){//SCLK为低,DIN上的数据才能改变GPIO_WriteBit(TM1640_GPIOPORT, TM1640_SCLK, (BitAction)(0));delay_us(DEL);if(aa & 0x01) //按位写入数据{GPIO_WriteBit(TM1640_GPIOPORT, TM1640_DIN, (BitAction)(1)); delay_us(DEL); }else{GPIO_WriteBit(TM1640_GPIOPORT, TM1640_DIN, (BitAction)(0)); delay_us(DEL); }GPIO_WriteBit(TM1640_GPIOPORT, TM1640_SCLK, (BitAction)(1)); //SCLK拉高准备写入下一位delay_us(DEL);aa >>= 1; }GPIO_WriteBit(TM1640_GPIOPORT, TM1640_DIN, (BitAction)(0)); GPIO_WriteBit(TM1640_GPIOPORT, TM1640_SCLK, (BitAction)(0)); //写完两个都置低
}
3、LM1640应用层程序
使用地址加1模式时,LM1640初始化中的地址模式命令要改为0x40。
/********************************************************************************
函数:TM1640_Init()
功能:TM1640初始化函数
参数:u8 data 一个字节 8位的数据
返回值:无
********************************************************************************/
void TM1640_Init(void)
{//GPIO接口初始化GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = TM1640_DIN | TM1640_SCLK;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设定推挽输出模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(TM1640_GPIOPORT, &GPIO_InitStructure);//GPIO接口电平初始化GPIO_WriteBit(TM1640_GPIOPORT, TM1640_DIN, (BitAction)(1));GPIO_WriteBit(TM1640_GPIOPORT, TM1640_SCLK, (BitAction)(1));//芯片设定初始化 用到底层通信协议内容TM1640_Start();TM1640_Write(TM1640Mode_Addr);//设定为固定地址模式TM1640_Stop();TM1640_Start();TM1640_Write(TM640Mode_Display);//设定显示亮度TM1640_Stop();
}/********************************************************************************
函数:TM1640_Display(u8 addr, u8 data)
功能:数码管显示输出---固定地址模式
参数:u8 addr---位选地址, u8 data---段选数据
返回值:无
********************************************************************************/
void TM1640_Display(u8 addr, u8 data)
{//数码管段码表 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 无 - Cconst u8 buf[23] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd, 0x87, 0xff, 0xef, 0x00, 0x40, 0x58};TM1640_Start();TM1640_Write(0xc0+addr); //传位选地址TM1640_Write(buf[data]); //传段选数据TM1640_Stop();
}/********************************************************************************
函数:TM1640_LED(u8 data)
功能:数码管显示输出---数码管地址自动加1模式
参数:u8 addr---位选地址, u8 data---段选数据
返回值:无
********************************************************************************/
void TM1640_Display_Add(u8 addr, u8 data)
{//数码管段码表 0 1 2 3 4 5 6 7 8 9 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 无 - Cconst u8 buf[23] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd, 0x87, 0xff, 0xef, 0x00, 0x40, 0x58};u8 i;TM1640_Start();TM1640_Write(0xc0+addr); //传位选地址for(i = 0; i < 16; i++){TM1640_Write(buf[data]); }TM1640_Stop();
}
五、LM1640硬件线路连接图
LM1640数码管驱动芯片的使用方法相关推荐
- TM1650数码管驱动芯片
简介 TM1650是一款国产4位共阴数码管驱动芯片,它还带有矩阵按键扫码功能.它的基本参数如下: 工作电压:3~5V 数码管驱动模式:8段x4位共阴数码管 矩阵按键驱动模式:7x4矩阵按键,不支持组合 ...
- tm1650中文资料_[STM8入门资料]第53讲 TM1650 LED数码管驱动芯片工作原理
刘洋[剑齿虎]STM8开发板学习笔记 第53讲TM1650 LED数码管驱动芯片工作原理 目 录 53.1 特性描述 TM1650是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路.内部 ...
- 八数码问题的广度优先搜索方法
八数码问题的广度优先搜索方法 问题的简单描述 3×3九宫qipan,放置数码为1 -8的8个棋子,剩下一个空格,只能通过向空格的移动来改变九宫格的布局. 要求:根据给定初始布局(即初始状态)和目标布局 ...
- 高档的电数码产品机箱设计标准和方法
在市场经济体制高速发展的今日,市场同质竞争日渐加重.为了更好宣传策划自己的产品,提升自己的产品销售量,就需要使消费者们当面对大量产品时,更加注重自已的产品特征和产品外观设计.仅有这般,他们才能让你的产 ...
- 数字电路实验 02 - | 译码器及数码管驱动芯片应用
一.实验目的和任务 掌握3 -8线译码器.4 -10线译码器的逻辑功能和使用方法. 掌握用两片3 -8线译码器连成4 -16线译码器的方法. 掌握使用74LS138实现逻辑函数和做数据分配器的方法. ...
- TM1650数码管驱动芯片驱动数码管读取按键程序
折腾了四五个小时,官方给的datasheet有不少的问题,这里纠正一下按键读取时序错误: 读取的数据跟文档里面的数据提前了一位,在这里给大家提个醒! 下面贴上代码 c文件: #include &quo ...
- VK16K33是带键盘扫描的LED数显/数码管驱动芯片多种封装选择驱动电流大,适合高亮显示场合
品牌:永嘉微电/VINKA 型号:VK16K33 封装形式:SOP28/24/20 年份:新年份 联 系 人:陈锐鸿 KPP1186 概述: VK16K33是 ...
- FRDM-KW41Z开发板使用显示驱动芯片HD44780的方法
在现今高分辨率图形显示LCD的时代,使用字符显示屏可能看起来有点不合时宜.但这些显示屏对我来说有很大的意义,因为它们非常坚固,可提供不同形状和数量的显示行数.这种字符显示可以是工业应用的更好解决方案. ...
- 电子相册制作软件-数码大师(附使用方法)
制作电子相册的软件在网上可以搜到很多软件,哪款电子相册制作软件最好用?作为最好的判断标准:一是软件支持制作精美酷炫的电子相册,二是软件界面设计人性化,操作简单.本文将在这里介绍国内非常流行的电子相册制 ...
最新文章
- 初学者学习Java的几大技巧
- 【Flask项目】项目准备之-创建User模型类
- Android 5.0及以上实现屏幕截图
- 如何给PDF文件交换页面?操作方法你知道吗?
- Weblogic的管理服务器与受管服务器
- Python字典类型内部做判断赋值
- matlab在activex中读取视频,[转载]matlab读取excel数据并显示在excel(activex控件)中
- 闲来无事写写-Huffman树的生成过程
- TCPMP-interface相关文件函数解析 -about.c
- 讯飞tts语音引擎_讯飞iFLYOS语音让家居产品更智能
- ZDM按横断面水位线河道开挖
- Android手机应用开发之手机GPS定位
- Swing-右键菜单
- android 解析json 日期格式,处理Json数据中的日期类型.如/Date(1415169703000)/格式
- 张正友畸变矫正C++代码
- Leetcode PHP题解--D38 463. Island Perimeter
- 微信小程序如何调用腾讯地图进行定位的简单方法
- selenium成功绕过淘宝登录反爬机制!
- 初学opencv 2
- python中exec的用法_如何在Python中安全地使用exec()?