前言
本片文章主要用于编写关于TM1668的学习以及相关代码,由于自己也在学习阶段,所以会不断地更新。
提示:以下是本篇文章正文内容,下面案例可供参考
一、TM16XX系列介绍和资料
TM16系列是一款LED按键集成驱动芯片,内部包含MCU,并留有数据接口,通俗来讲,我们可以利用通过与他的通讯接口通信来控制它的操作,这也其实一定程度上减少了开发难度。
1.1、功能:
M1668 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集 成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。本产品性能优良,质量 可靠。主要应用于VCR、VCD、DVD 及家庭影院等产品的显示屏驱动。采用SOP24、SSOP24、 SKDIP24、SDIP24 的封装形式。
管脚:
二、代码
2.1、官方代码
代码如下(示例):
#include <reg52.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define nop _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
sbit DIO=P1^0;
sbit CLK=P1^1;
sbit STB=P1^2;
uchar code CODE[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uchar code TAB[10]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar KEY[5]={0};
void delay_nms(uint n)
{
uint i;
while(n--)
{
for(i=0;i<550;i++);
}
}
void send_8bit(uchar dat)
{
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;
nop;
STB=0;
send_8bit(com);
}
void read_key(void)
{
unsigned char i,j;
send_command(0x42);
DIO=1;
for(j=0;j<5;j++)
{
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;
}
void display(uchar *p)
{
uchar i;
send_command(0x03);
send_command(0x40);
send_command(0xc0);
for(i=0;i<7;i++)
{
send_8bit(*p);
send_8bit(0x00);
p++;
}
send_command(0x8F);
STB=1;
}
void key_process()
{
if(KEY[0]!=0x00)
{
if((KEY[0]==0x01)) {display(CODE);}
if((KEY[0]==0x08)) {display(TAB);}
}
}
void main()
{
display(CODE);
delay_nms(1);
while(1)
{
read_key();
key_process();
delay_nms(200);
}
}
该处使用的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、自己写的例程
#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;
TRISA0=0;
ANSA1=0;
TRISA1=0;
ANSA2=0;
TRISA2=0;
}
void send_8bit(uchar dat)
{
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;
nop;
STB=0;
send_8bit(com);
}
void read_key(void)
{
unsigned char i,j;
send_command(0x42);
TRISA0 = 1;
DIO=1;
for(j=0;j<5;j++)
{
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;
}
void displayall(uchar data)
{
uchar i;
send_command(0x03);
send_command(0x40);
send_command(0xc0);
for(i=0;i<14;i++)
{
send_8bit(data);
}
send_command(0x8F);
STB=1;
}
void display_TM1668(uchar value[4],uchar led_value)
{
uchar i;
send_command(0x03);
send_command(0x40);
send_command(0xc0);
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);
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;
}
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]);
}
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语言 链接: 官方文档.
总结
总的来说,这款芯片的使用并不算复杂,但是还是需要一段时间的摸索,和对其原理的理解,最后可以熟练的使用。
|