一、首先我们来了解TM1721的特性
* TM1721是一种带键盘扫描接口的LCD段码液晶屏驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LCD 驱动、键盘扫描、幻彩背光驱动等电路* 内嵌 256KHz RC 振荡器
* 采用低功耗CMOS工艺
*32X4点LCD驱动
*6X4按键输入
*4路LED驱动,具有64级PWM,可用于LCD幻彩背光驱动;
*LCD工作电压可调
*串行接口(CLK,STB,DIO)
*振荡方式:内置RC振荡
* 软件配置特征: 数据模式和命令模式 两种指令
* 提供 VLCD 管脚用于调整 LCD段码液晶屏 操作电压(对比度调节)
二、指令说明
指令用来设置显示模式和LCD驱动器的状态。
在STB下降沿后由DIO输入的第一个字节作为一条指令。经过译码,取最高B7、B6两bit来区别不同的指令和数据。
B7 | B6 | 指令 |
0 | 0 | 显示模式设置 |
0 | 1 | 数据命令设置 |
1 | 0 | 显示控制命令设置 |
1 | 1 | 地址命令设置 |
2.1显示模式设置: 工作模式设置好后,不允许在使用中切换工作模式。
该指令用来设置工作模式,上电后,初始状态为b5b4b3b2b1b0=000000
2.2 数据命令设置:该指令用来设置数据写和读
2.3地址命令设置
地址的选择:根据数据设置指令的不同,地址所表示的含义也不同。
如果数据设置指令是写数据到显示寄存器模式,那么本次地址设定的是显示寄存器地址,最多有效地址为 00H-0FH;
如果数据设置指令是写数据到PWM控制寄存器模式,那么本次地址设置PWM寄存器的地址,有效地址为 00H-03H。
2.4显示控制命令设置
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
1 | 0 | 0 | B4 | B3 | B2 | B1 | B0 |
b4:显示开关设置位;为1显示开,为0显示关
b3:LCD液晶屏驱动偏压设置位;为1设为全屏点亮;为0设为1/3偏压
b2b1b0:LCD段码液晶屏工作电压设置位;
当b2b1b0=111时,工作电压=VCC(VCC为芯片的工作电压)。当VCC=5V,调节电压的范围约是2.88-5V。
*上电后,b4b3b2b1b0 默认为 00111
三、按键与按键寄存器
3.1.键扫矩阵为 6×4bit
键扫数据储存地址如下所示,先发读键命令后,开始读取按键数据BYTE1—BYTE3字节,读数据从低位开
始输出。芯片KEY(0—3)和KS引脚对应的按键按下时,相对应的字节内的 BIT位为1。
3.2 该寄存器存储通过串行接口从 TM1721 的读取数据,地址分配如下:
▲注意:1、TM1721最多可以读3个字节,不允许多读。 2、读数据字节只能按顺序从BYTE1-BYTE3读取,不可跨字节读。例如:硬件上的KEY2与KS5对应按键按下时,此时想要读到此按键数据,必须需要读到第3个字节的第6BIT位,才可读出数据;当KEY1与KS5,KEY2与KS5,KEY3与KS5三个按键同时按下时,此时BYTE3所读数据的B5,B6,B7位均为1。 3、组合键只能是同一个KS,不同的KEY引脚才能做组合键;同一个KEY与不同的KS引脚不可以做成组合键使用。
下面是兴宇合电子有限公司的程序C代码诠释
/********************************************************
公司:深圳市兴宇合电子有限公司www.xyhlcd.com
功能描述: TM1721芯片测试程序
设计人:Zheng Qiu Sheng
完成时间:2022年5月13日
********************************************************/
#include<reg52.h>
#include <intrins.h>
sbit stb =P2^3;//定义片选通讯口
sbit clk =P2^2;//定义时钟通讯口
sbit dio =P1^0;//定义数据输入/输出通讯口
#define ucharunsigned char
#define uintunsigned int
unsigned char m,d,e,i,y;
unsigned char w[4];
unsigned char code table1[16]= {0x00,0x06,0x06, 0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00};
unsigned char code table2[16]= {0xe0,0xe3,0xe3, 0xe3,0xe3,0xe3,0x03,0x7c,0x7c,0x7c,0x7c,0x00,0x00,0x00,0x00,0x00};
unsigned char code table3[16]= {0xb0,0xb5,0xb5,0xb5,0xb5,0xb5,0x05,0xda,0xda,0xda,0xda,0x00,0x00,0x00,0x00,0x00};
unsigned char code table4[16]= {0xf0,0xf7,0xf7, 0xf7, 0xf7, 0xf7,0x07,0xfe,0xfe,0xfe, 0xfe,0x00,0x00,0x00,0x00,0x00};
unsigned char code table5[16]= {0x0f,0x08,0x08, 0x08, 0x08, 0x08,0xf8,0x01,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x00};
//------写数据给IC----------
void Delay(uchar us) //5,7,9
{while(--us);}
void DelayMS(uint x)
{uchar i;
while(x--)
{for(i=0;i<125;i++);}
}
void write(unsigned char p)
{unsigned int i;
stb =0; //给有效的片选信号(片选信号是低电平有效)
for(i=0;i<8;i++)//开始传送8位数据,每循环一次传送一位数据
{
clk =0;
if((p&0x01)!=0)
{dio=1;}
else
{dio=0;}
clk =1;
p=p>>1;
}
}
//-------读按键数据--------
unsigned char read()
{ unsigned char kk;
stb = 0; //给有效的片选信号(片选信号是低电平有效)
dio = 1; //这里必须置高,因为没有按键按下时,键值默认为00H,此时为了与键值有区别
for(d=0;d<8;d++)
{clk = 0;
if(dio==1)
{kk =(kk|0x80);}
else
{kk =(kk|0x00);}
clk = 1;
if(d!=7){kk=(kk>>1);}
}
y=kk;
return(y);
}
//------显示all子程序--------
void xianshiall(unsigned char p)
{
unsigned char h;
stb = 1;clk = 1;dio = 1;
write(0x0c);//显示模式设置,
stb = 1;
write(0x10);
stb = 1;
write(0x40);//写数据到显示寄存器,采用地址自动加一
stb = 1;
write(0xc0);//显示寄存器的00H单元开始
for(h=0;h<16;h++)
{
write(p);//给显示寄存器送数据,
}
stb=1;
write(0x96);//显示控制参数,点亮数码屏幕,亮度可以通过改变低三位调节
}
//------显示all子程序--------
void xianshia2( unsigned char *ss)small
{unsigned char h,*pp;
pp=ss;
stb = 1;clk = 1;dio = 1;
write(0x0c);//显示模式设置,
stb = 1;
write(0x10);
stb = 1;
write(0x40);//写数据到显示寄存器,采用地址自动加一
stb = 1;
write(0xc0);//显示寄存器的00H单元开始
for(h=0;h<16;h++)
{write(*pp);//给显示寄存器送数据,
++pp;
}
stb=1;
write(0x96);//显示控制参数,点亮数码屏幕,亮度可以通过改变低三位调节
}
//------显示子程序--------
void xianshi(unsigned char p)
{unsigned char h;
stb = 1;clk = 1;dio = 1;
write(0x0c);//显示模式设置,
stb = 1;
write(0x10);
stb = 1;
write(0x40);//写数据到显示寄存器,采用地址自动加一
stb = 1;
write(0xc0);//显示寄存器的00H单元开始
for(h=0;h<2;h++)
{write(p); }//给显示寄存器送数据,
stb=1;
write(0x96);//显示控制参数,点亮数码屏幕,亮度可以通过改变低三位调节
}
//-----判按键子程序-------
void panjian(unsigned char k[4])
{
if((k[0]==0x01)){m=0x06;} //当KS0与SEG28按键按下时候,数码管显示数字0
if((k[0]==0x02)){m=0xe3;} //当KS0与SEG29按键按下时候,数码管显示数字1
if((k[0]==0x04)){m=0x3f;} //当KS0与SEG30按键按下时候,数码管显示数字4
if((k[0]==0x08)){m=0x2E;} //当KS0与SEG31按键按下时候,数码管显示数字3
if((k[0]==0x10)){m=0x5b;} //当KS1与SEG28按键按下时候,数码管显示数字4。
if((k[0]==0x20)){m=0x4f;} //当KS1与SEG29按键按下时候,数码管显示数字5
if((k[0]==0x40)){m=0x2F;} //当KS1与SEG30按键按下时候,数码管显示数字6
if((k[0]==0x80)){m=0x07;} //当KS1与SEG31按键按下时候,数码管显示数字7
if((k[1]==0x01)){m=0x66;} //当KS2与SEG28按键按下时候,数码管显示数字4。
if((k[1]==0x02)){m=0x6d;} //当KS2与SEG29按键按下时候,数码管显示数字5。
if((k[1]==0x04)){m=0x7d;} //当KS3与SEG30按键按下时候,数码管显示数字6。
if((k[1]==0x08)){m=0x07;} //当KS3与SEG31按键按下时候,数码管显示数字7。
if((k[1]==0x10)){m=0x63;} //当KS2与SEG28按键按下时候,数码管显示数字4。
if((k[1]==0x20)){m=0x67;} //当KS2与SEG29按键按下时候,数码管显示数字5。
if((k[1]==0x40)){m=0x77;} //当KS3与SEG30按键按下时候,数码管显示数字6。
if((k[1]==0x80)){m=0x7E;} //当KS3与SEG31按键按下时候,数码管显示数字7?
if((k[2]==0x01)){m=0x7f;} //当KS4与SEG29按键按下时候,数码管显示数字8。
if((k[2]==0x02)){m=0x6f;} //当KS4与SEG30按键按下时候,数码管显示数字9
if((k[2]==0x04)){m=0xE7;} //当KS5与SEG29按键按下时候,全屏显示。
if((k[2]==0x08)){m=0xF2;} //当KS5与SEG30按键按下时候,全灭。
if((k[2]==0x10)){m=0xF3;} //当KS4与SEG29按键按下时候,数码管显示数字8。
if((k[2]==0x20)){m=0xFD;} //当KS4与SEG30按键按下时候,数码管显示数字9
if((k[2]==0x40)){m=0xff;} //当KS5与SEG29按键按下时候,全屏显示。
if((k[2]==0x80)){m=0x00;} //当KS5与SEG30按键按下时候,全灭。
}
//----------主函数-----------------
void main()
{
xianshiall(0xff);//根据按键值,给显示寄存器送相应的显示数据
DelayMS(1000);
xianshia2(table1);//根据按键值,给显示寄存器送相应的显示数据
DelayMS(1000);
xianshia2(table2);//根据按键值,给显示寄存器送相应的显示数据
DelayMS(1000);
xianshia2(table3);//根据按键值,给显示寄存器送相应的显示数据
DelayMS(1000);
xianshia2(table4);//根据按键值,给显示寄存器送相应的显示数据
DelayMS(1000);
xianshiall(0x00);
xianshia2(table5);//根据按键值,给显示寄存器送相应的显示数据
DelayMS(1000);
xianshiall(0x00);
while(1)//循环读按键
{stb = 1;
dio = 1;
clk = 1;
write(0x0c);//模式设置
stb = 1;
write(0x42);//送读按键命令(42H),
for(e=0;e<3;e++)
{w[e]=read();}//读8位按键数据,
panjian(w); //判断按键值。
xianshi(m); //根据按键值,给显示寄存器送相应的显示数据
}
}
总结:深圳市深圳市兴宇合电子有限公司是一家从事研发,制造液晶显示屏(LCD)、液晶显示模组(LCM)、LED背光源以及数码显示屏的专业厂家,特别是静电以及电磁干扰等方面经验丰富,对客户的问题能够提供出快速 、准确 、专业的解答。
“质量第一、精益求精、追求卓越”之理念是兴宇合公司始终如一的郑重承诺。对于不明白或者有疑问的问题请拨打电话:
0755-83404646 / 0755-83570678 / 13923751240