IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 天威TM1668芯片官方资料,讲解,代码,自己写的例程 -> 正文阅读

[嵌入式]天威TM1668芯片官方资料,讲解,代码,自己写的例程


前言

本片文章主要用于编写关于TM1668的学习以及相关代码,由于自己也在学习阶段,所以会不断地更新。


提示:以下是本篇文章正文内容,下面案例可供参考

一、TM16XX系列介绍和资料

TM16系列是一款LED按键集成驱动芯片,内部包含MCU,并留有数据接口,通俗来讲,我们可以利用通过与他的通讯接口通信来控制它的操作,这也其实一定程度上减少了开发难度。

名称链接
官方文档链接
手机$12
导管$1

1.1、功能:

M1668 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集
成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。本产品性能优良,质量
可靠。主要应用于VCR、VCD、DVD 及家庭影院等产品的显示屏驱动。采用SOP24、SSOP24、
SKDIP24、SDIP24 的封装形式。

管脚:
在这里插入图片描述


二、代码

2.1、官方代码

代码如下(示例):

 /*****************************************************************************
 *版权信息:深圳天微电子有限公司
 *文 件 名:TM1668-V1.0
 *当前版本:V1.0
 *MCU 型号:STC12C5608AD
 *开发环境:Keil uVision4
 *晶震频率:11.0592MHZ       
 *完成日期:2013-07-18
 *程序功能:1.数码管驱动:驱动7段7位LED共阴数码管显示0~6;具体电路请参照TM1668规格书共阴数码管接法。
            2.按键功能  : 包含按键读程序驱动函数。
 *免责声明:1.此程序为TM1668驱动LED数码管演示程序,仅作参考之用。
            2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任             
********************************************************************************/
#include <reg52.h>			   //MCU头文件
#include "intrins.h"			   //包含nop指令头文件

#define uchar unsigned char		   //数据类型宏定义
#define uint unsigned int		   //数据类型宏定义

#define nop  _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//宏定义


/********************定义控制端口**********************/
sbit DIO=P1^0;					   //定义TM1668 DIO为P1^0;
sbit CLK=P1^1;					   //定义TM1668 CLK为P1^1;
sbit STB=P1^2;					   //定义TM1668 STB为P1^2;


/********************定义数据*************************/
uchar code CODE[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};  //共阴数码管0~9字型码
uchar code TAB[10]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};  //共阴数码管无显示字型码

uchar KEY[5]={0};							 //为存储按键值定义的数组

/***************延时函数nms**************/
void delay_nms(uint n)
{
 uint i;
 while(n--)
 {
 for(i=0;i<550;i++);
 }
}

/***************发送8bit数据,从低位开始**************/
void send_8bit(uchar dat)	 //发送8位数据,从低位开始
{
  uchar i;
  for(i=0;i<8;i++)
  {	
  	CLK=0;
    if(dat&0x01) 
	   DIO=1;
	else         
	   DIO=0;
	_nop_();
	_nop_();
	_nop_();
	CLK=1;	 
	dat>>=1;	 
  }
  CLK=0;
  DIO=0;
}

/******************发送控制命令***********************/
void send_command(uchar com)  //发送命令字节
{
 STB=1;						  //STB置高
 nop;
 STB=0;						  //STB置低
 send_8bit(com);			          //发送8bit数据
}

/****************读取按键值并存储*******************/
void read_key(void)			   //读取5字节按键值并存入数组KEY[],从低字节、低位开始
{
 unsigned char i,j; 
 send_command(0x42);		          //发送读按键命令
 DIO=1;					  //释放DIO数据总线
 for(j=0;j<5;j++)			  //连续读取5个字节
 {
  for(i=0;i<8;i++)
 {
  CLK=0;
  KEY[j]=KEY[j]>>1;
  CLK=1;
  if(DIO==1)
  {
    KEY[j]=KEY[j]|0x80;
  }
  nop;
} 
  nop;
  nop;
}
  CLK=0;
  DIO=0;
  STB=1;
}

/************显示函数,数码管1~7位显示0~6************/
void display(uchar *p)   //显示函数,1~7位数码管显示0~6
{
 uchar i;
 send_command(0x03); 	//设置显示模式,7位10段模式
 send_command(0x40);	//设置数据命令,采用地址自动加1模式
 send_command(0xc0);	//设置显示地址,从00H开始

 for(i=0;i<7;i++)
 {
   send_8bit(*p);	    //从00H开始,偶数地址送显示数据
   send_8bit(0x00);	    //因为SEG9-14未用到,所以奇数地址送全0
   p++;
  }
  send_command(0x8F);	    //设置显示命令,打开显示并设置占空比14/16.
  STB=1;
}
	
/*****************按键处理函数*********************/
void key_process()		// 按键处理函数
{
    if(KEY[0]!=0x00)
   { 
    if((KEY[0]==0x01)) {display(CODE);} //K1与KS1按键按下,数码管显示数字0~6
    if((KEY[0]==0x08)) {display(TAB);}  //K1与KS2按键按下,数码管显示关闭
   }
}

void main()
{
display(CODE);	    //上电显示0~6
delay_nms(1);
while(1)
{
 read_key();	   //读按键值
 key_process();	   //按键处理
 delay_nms(200);   //延时200ms再读按键
 }
}

该处使用的url网络请求的数据。


三、问题讲解:

3.1、通信方式:

管脚定义:
在这里插入图片描述

名称作用
DIO数据线,高电平代表数据1,低电平代表0
CLK上升沿读取数据,下降沿输出数据
STB片选输入,下降沿初始串口,开始接受

总的来说,就是一根数据线,一根时钟线,一根片选线。通过时钟和片选来辅助数据线传输数据。

在这里插入图片描述

3.2、led和数码管操作:

这里对数码管和led的操作方式就是,将led或者数码管的两端都连接到tm1668的两个管脚上面,例如下面的电路
在这里插入图片描述
在这里插入图片描述
这里有一个共阴极数码管,这里我们可以看到GRID为一的时候,然后SEG1-8分别控制每一个管脚,所以如果我们要让这个数码管全部亮的话,就应该对地址0x00,输入0xFF,这样可以全部显示了。
在这里插入图片描述

3.3、key操作:

同led和数码管,我们将按键的两端对应到1668的上面的两个管脚,然后通过发送对应的读取命令以及相应的地址就可以得到对应的数据。
在这里插入图片描述

3.4、自己写的例程

/***************************************
*@Author:补不补布
*@device:PIC18F1623
*这是我自己写的一个文件,注意这里面的管脚定义不同于官方代码,仅供大家参考,请勿用作商业,本人不承担他人和公司应用所导致的一切问题。
***************************************/
#include "User_TM1668.h"
uchar KEY[5]={0,0,0,0,0};			//为存储按键值定义的数组
uchar SHUMAGUAN[4] = {0,0,0,0}; 	//数码管数值

//初始化管脚
void User_TM1668_initial()
{
	ANSA0=0;				//RA1设为数字IO
	TRISA0=0;				//RA1接LCK,设为输出
	ANSA1=0;				//RC1设为数字IO
	TRISA1=0;				//RC1接SDI,设为输出
	ANSA2=0;				//RC2设为数字IO
	TRISA2=0;				//RC2接SCK,设为输出
}


/***************发送8bit数据,从低位开始**************/
void send_8bit(uchar dat)	 //发送8位数据,从低位开始
{
  uchar i;
  for(i=0;i<8;i++)
  {	
  	CLK=0;
    if(dat&0x01) 
	   DIO=1;
	else         
	   DIO=0;
	nop;
	nop;
	nop;
	CLK=1;	 
	dat>>=1;	 
  }
  CLK=0;
  DIO=0;
}

/******************发送控制命令***********************/
void send_command(uchar com)  //发送命令字节
{
 STB=1;						  //STB置高
 nop;
 STB=0;						  //STB置低
 send_8bit(com);			          //发送8bit数据
}

/****************读取按键值并存储*******************/
void read_key(void)			   //读取5字节按键值并存入数组KEY[],从低字节、低位开始
{

	unsigned char i,j; 
	send_command(0x42);		          //发送读按键命令
	TRISA0 = 1;
	DIO=1;					  //释放DIO数据总线
	for(j=0;j<5;j++)			  //连续读取5个字节
	{
		for(i=0;i<8;i++)
		{
			CLK=0;
			KEY[j]=KEY[j]>>1;
			CLK=1;
			if(DIO==1)
			{
			  KEY[j]=KEY[j]|0x80;
			}
			nop;
		} 
	 	nop;
	 	nop;
	}
	CLK=0;
	DIO=0;
	STB=1;
	TRISA0 = 0;
}

/************显示函数,数码管1~7位显示0~6************/
void displayall(uchar data)   //显示函数,1~7位数码管显示0~6
{
	uchar i;
	send_command(0x03); 	//设置显示模式,7位10段模式
	send_command(0x40);	//设置数据命令,采用地址自动加1模式
	send_command(0xc0);	//设置显示地址,从00H开始
	
	for(i=0;i<14;i++)
	{
	  send_8bit(data);	    //从00H开始,偶数地址送显示数据
	 }
	 send_command(0x8F);	    //设置显示命令,打开显示并设置占空比14/16.
	 STB=1;
}


/************显示函数,数码管1~7位显示0~6************/
void display_TM1668(uchar value[4],uchar led_value)   //显示函数,1~7位数码管显示0~6
{
	uchar i;
	send_command(0x03); 	//设置显示模式,7位10段模式
	send_command(0x40);	//设置数据命令,采用地址自动加1模式
	send_command(0xc0);	//设置显示地址,从00H开始
	
	send_8bit(0x00);
	send_8bit(0x00);
	
	send_8bit(0x00);
	send_8bit(0x00);
	
	send_8bit(value[0]);
	send_8bit(0x01);
	
	send_8bit(value[1]);
	send_8bit(0x01);
	
	send_8bit(value[2]);
	send_8bit(0x01);
	
	send_8bit(value[3]);
	send_8bit(0x01);
	
	send_8bit(led_value);
	send_8bit(0x00);
	
	 
	send_command(0x8F);	    //设置显示命令,打开显示并设置占空比14/16.
	STB=1;
}



/*****************按键处理函数*********************/
void User_key_process()		// 按键处理函数
{
	read_key();
	user_key[0] = (KEY[2] & 0b00010000)>>4;
	user_key[1] = (KEY[3] & 0b00001000)>>3;
	user_key[2] = KEY[4] & 0b00000001;
	user_key[3] = (KEY[4] & 0b00001000)>>3;
	user_key[4] = (KEY[4] & 0b00010000)>>4;//key5
}

unsigned char deal_shuma(unsigned char num)
{
	switch(num)
	{
		case 0:
			return SHUMA_0;
		case 1:
			return SHUMA_1;
		case 2:
			return SHUMA_2;
		case 3:
			return SHUMA_3;
		case 4:
			return SHUMA_4;
		case 5:
			return SHUMA_5;
		case 6:
			return SHUMA_6;
		case 7:
			return SHUMA_7;
		case 8:
			return SHUMA_8;
		case 9:
			return SHUMA_9;
		case 'A':
			return SHUMA_A;
		case 'V':
			return SHUMA_V;
		case 'N':
			return SHUMA_N;	
		case 'E':
			return SHUMA_E;	
		case '_':
			return SHUMA__;	
		case 'D':
			return SHUMA_D;	
	}
}

void User_deal_shuma()
{
	SHUMAGUAN[0]= deal_shuma(user_shuma[0]);
	SHUMAGUAN[1]= deal_shuma(user_shuma[1]);
	SHUMAGUAN[2]= deal_shuma(user_shuma[2]);
	SHUMAGUAN[3]= deal_shuma(user_shuma[3]);
}

/*用户处理TM1668函数*/
void User_process_TM1668()
{
	User_deal_shuma();
	display_TM1668(SHUMAGUAN,led);
	User_key_process();
}

//单纯显示数字
void User_shuma_num(unsigned char num)
{
	Get_Wei(num);	
	user_shuma[0] = Qianwei;
	user_shuma[1] = Baiwei;
	user_shuma[2] = Shiwei;
	user_shuma[3] = Gewei;
}

//按位显示数字
void User_shuma_wei(unsigned char a,unsigned char b,unsigned char c,unsigned char d)
{	
	user_shuma[0] = a;
	user_shuma[1] = b;
	user_shuma[2] = c;
	user_shuma[3] = d;
}

//按位显示数字
void User_set_led(unsigned char led_arry[7])
{	
	led = 0;
	if(led_arry[0] == 1 )
	{
		led |= 0b00000010;
	}
	if(led_arry[1] == 1 )
	{
		led |= 0b00000100; 
	}
	if(led_arry[2] == 1 )
	{
		led |= 0b00000001; 
	}
	if(led_arry[3] == 1 )
	{
		led |= 0b01000000; 
	}
	if(led_arry[4] == 1 )
	{
		led |= 0b00001000; 
	}
	if(led_arry[5] == 1 )
	{
		led |= 0b00010000; 
	}
	if(led_arry[6] == 1 )
	{
		led |= 0b00100000; 
	}
	
}

四、资料

链接: 官方例程c语言
链接: 官方文档.

总结

总的来说,这款芯片的使用并不算复杂,但是还是需要一段时间的摸索,和对其原理的理解,最后可以熟练的使用。
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-15 16:21:57  更:2021-07-15 16:23:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/6 21:05:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码