TM1622的程序设计实现

HT1622(或TM1622)程序设计记录

2021.03.12 使用TM1622驱动段码液晶屏,使用了COM0-7;SEG0-SEG31,今天对这边程序进行了整理,用以记录。
硬件部分:
在硬件上只使用TM1622驱动段码液晶屏,未使用蜂鸣器和WDT,故只使用了数据接口,1脚CS(片选);4脚WR(时钟)5脚DATA(数据);注意R1的取值范围10K-15K,阻值过小会使对比度过高,段码显示会看不清楚,显白。在这里插入图片描述
软件部分:
1.TM1622的RAM为32*8bit,RAM数据直接映射到LCD,COM和SEG对应的关系如下图:在这里插入图片描述
2.TM1622的命令 TM1622命令主要分为命令操作和数据操作;命令操作实现TM1622的初始化,数据操作实现段码LCD的段码显示。TM1622的操作命令
3.TM1622的读写时序:这里只列出了写时序,也只用到写时序。SCK的上升沿写入数据。
在这里插入图片描述
4.程序的具体实现:
sbit CS_1622 =P1^3;//
sbit SCK_1622 =P1^4;//
sbit DATA_1622 =P1^5;//
#define _Nop() nop();nop();
//命令定义:
#define SYSDIS 0X00 //0b1000 0000 0000 关振系统荡器和LCD偏压发生器
#define SYSEN 0X02 //0b1000 0000 0010 打开系统振荡器
#define LCDOFF 0X04 //0b1000 0000 0100 关LCD偏压
#define LCDON 0X06 //0b1000 0000 0110 打开LCD偏压
#define XTAL 0x28 //0b1000 0010 1000 外部接时钟
#define RC32 0X30 //0b1000 0011 0000 内部时钟
#define TONEON 0X12 //0b1000 0001 0010 打开声音输出
#define TONEOFF 0X10 //0b1000 0001 0000 关闭声音输出
#define WDTDIS 0X0A //0b1000 0000 1010 禁止看门狗

/******************************************************
写数据函数,cnt为传送数据位数,数据传送为高位在前
/
void Ht1622Wr_Data(uchar Data,uchar cnt)
{
uchar i;
for (i=0;i<cnt;i++)
{
SCK_1622=0;
_Nop();
DATA_1622=Data&0x80;
_Nop();
SCK_1622=1;
_Nop();
Data<<=1;
}
}
/
*
函数名称:void Ht1622WrCmd(uchar Cmd)
功能描述: HT1622命令写入函数
全局变量:无
参数说明:Cmd为写入命令数据
返回说明:无
设 计 人:
版 本:1.0
说 明:写入命令标识位100
********************************************************/
void Ht1622WrCmd(uchar Cmd)
{
CS_1622=0;
_Nop();
Ht1622Wr_Data(0x80,4); //写入命令标志100 0 :命令类型100 A5
Ht1622Wr_Data(Cmd,8); //写入命令数据 A4-A0,D0-D3
CS_1622=1;
_Nop();
}

/********************************************************
函数名称:void Ht1622WrOneData(uchar Addr,uchar Data)
功能描述: HT1622在指定地址写入数据函数
全局变量:无
参数说明:Addr为写入初始地址,Data为写入数据
返回说明:无
设 计 人:
版 本:1.0
说 明:因为HT1622的数据位8位
********************************************************/
void Ht1622WrOneData(uchar Addr,uchar Data)
{
CS_162=0;
Ht1622Wr_Data(0xa0,3); //写入数据标志101
Ht1622Wr_Data(Addr<<2,6); //写入地址数据
Ht1622Wr_Data(Data,8); //TM1622 8位数据
CS_1622=1;
_Nop();
}

/********************************************************
函数名称:void Ht1622WrAllData(uchar Addr,uchar *p,uchar cnt)
功能描述: HT1622连续写入方式函数
全局变量:无
参数说明:Addr为写入初始地址,*p为连续写入数据指针,
cnt为写入数据总数
返回说明:无
设 计 人:
版 本:1.0
说 明:HT1622的数据位8位
********************************************************/
void Ht1622WrAllData(uchar Addr,uchar *p,uchar cnt)
{
uchar i;
CS_1622=0;
Ht1622Wr_Data(0xa0,3); //写入数据标志101
Ht1622Wr_Data(Addr<<2,6); //写入地址数据
for (i=0;i<cnt;i++)
{
Ht1622Wr_Data(*p,8); //写入数据
p++;
}
CS_1622=1;
_Nop();
}

/********************************************************
函数名称:void Ht1622_Init(void)
功能描述: HT1622初始化
全局变量:无
参数说明:无
返回说明:无
设 计 人:
版 本:1.0
说 明:初始化后,液晶屏所有字段均显示
********************************************************/
void Ht1622_Init(void)
{
CS_1622=1;
SCK_1622=1;
DATA_1622=1;
DelayMS(2000); //延时使LCD工作电压稳定
Ht1622WrCmd(RC32); //使用内部振荡器
Ht1622WrCmd(SYSDIS);
Ht1622WrCmd(WDTDIS);
Ht1622WrCmd(SYSEN);
Ht1622WrCmd(LCDON);
}
//=========================================
//main函数,仅用于测试
//=========================================
void main()
{
uchar i,j;
Ht1622_Init();
// LCD清屏
Ht1622WrAllData(0,Ht1622Tab,32);
i=0;j=1;
while(1){ //test
Ht1621WrOneData(i++,j++);
if(i>=32) {i=0;j=1;}
DelayMS(5000);
} //while
}
//============================================
2021.3.13 J

  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
/***************************************************************************** *版权信息:深圳天微电子有限公司 *文 件 名:TM1622-V1.0 *当前版本:V1.0 *MCU 型号:STC12C5608AD *开发环境:Keil uVision4 *晶震频率:11.0592MHZ *完成日期:2013-09-09 *程序功能:1.LCD驱动:32SEG*8COM(由2组4COM LCD屏组成),分别显示0~9. *免责声明:1.此程序为TM1622驱动LCD演示程序,仅作参考之用。 2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任 ********************************************************************************/ #include //MCU头文件 #include "intrins.h" //包含nop指令头文件 #define nop() _nop_();_nop_();_nop_();_nop_();_nop_(); //宏定义 /********************定义控制端口**********************/ sbit CS = P2^1; //片选 sbit READ = P2^0; //读数据时钟 sbit WRITE = P1^7; //写数据时钟 sbit DATA = P1^6; //数据口 //****定义数据*************** 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 unsigned char code date0[]={0x0B,0x00,0x07,0x05,0x0C,0x0D,0x0F,0x00,0x0F,0x0D,0x0B,0x00,0x07,0x05,0x0C,0x0D,0x0F,0x00,0x0F,0x0D,0x0B,0x00,0x07,0x05,0x0C,0x0D,}; unsigned char code date1[]={0x0E,0x06,0x0C,0x0e,0x06,0x0A,0x0A,0x0E,0x0E,0x0E,0x0E,0x06,0x0C,0x0e,0x06,0x0A,0x0A,0x0E,0x0E,0x0E,0x0E,0x06,0x0C,0x0e,0x06,0x0A,}; unsigned char Buffer[64]; //定义数组 /***************延时函数nms**************/ void delay_nms(unsigned int n) { unsigned int i; while(n--) { for(i=0; i<550; i++); } } /***************写100命令函数**************/ void write_cmd_100(unsigned char cmd) { unsigned char i; CS=0; WRITE=0; nop(); DATA=1; nop(); WRITE=1; nop(); WRITE=0; nop(); DATA=0; nop(); WRITE=1; nop(); WRITE=0; nop(); DATA=0; nop(); WRITE=1; nop(); for(i=0; i<8; i++) { WRITE=0; if(cmd&0x80;) DATA=1; else DATA=0; WRITE=1; cmd<<=1; } WRITE=0; nop(); DATA=0; nop(); WRITE=1; nop(); WRITE=0; nop(); CS=1; } /***************写101数据函数**************/ void write_101(unsigned char address, unsigned char dat) { unsigned char i, add; add=address<<2; CS=0; WRITE=0; nop(); DATA=1; nop(); WRITE=1; nop(); WRITE=0; nop(); DATA=0; nop(); WRITE=1; nop(); WRITE=0; nop(); DATA=1; nop(); WRITE=1; nop(); for(i=0; i<6; i++) { WRITE=0; if(add&0x80;) DATA=1; else DATA=0; WRITE=1; add<<=1; } for(i=0; i>=1; } WRITE=0; DATA=0; CS=1; } /***************向显存写数据**************/ void writeDDRAM(void) { unsigned char i; for(i=0;i<16;i++) //向64个地址写数据,显示0~9 { write_101((2*(2*i)),date0[i]); write_101((2*(2*i)+2),date1[i]); write_101((2*(2*i)+1),date0[i]); write_101((2*(2*i)+3),date1[i]); } } /***************TM1622初始化函数**************/ void init_tm1622() { write_cmd_100(0x01); //打开系统振荡器 write_cmd_100(0x03); //开启LCD显示 write_cmd_100(0x18); //片内RC 32KHZ write_cmd_100(0xe3); //正常模式 } void main() { unsigned char i; init_tm1622(); //初始化 nop(); nop();
/***************************************************************************** *版权信息:深圳天微电子有限公司 *文 件 名:TM1621-V1.0 *当前版本:V1.0 *MCU 型号:STC12C5608AD *开发环境:Keil uVision4 *晶震频率:11.0592MHZ *完成日期:2013-08-07 *程序功能:1.LCD驱动:LCD屏显示0`F *免责声明:1.此程序为TM1621驱动LCD演示程序,仅作参考之用。 2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任 ********************************************************************************/ #include //MCU头文件 #include "intrins.h" //包含nop指令头文件 #define uchar unsigned char //数据类型宏定义 #define uint unsigned int //数据类型宏定义 #define nop _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //宏定义 /******************TM1621模块命令定义*********************/ #define SYSDIS 0x00 //关系统振荡器和LCD偏压发生器 #define SYSEN 0x02 //打开系统振荡器 #define LCDOFF 0x04 //关LCD偏压 #define LCDON 0x06 //开LCD偏压 #define TONEON 0x12 //打开声音输出 #define TONEOFF 0x10 //关闭声音输出 #define XTAL 0x28 //外部接晶振 #define RC 0x30 //内部RC振荡 #define BIAS 0x52 //1/3偏压 4公共口 #define WDTDIS 0x0a //禁止看门狗 #define WDTEN 0x0e //开启看门狗 /********************定义控制端口**********************/ sbit CS=P2^1; sbit READ=P2^7; sbit WRITE=P2^0; sbit DATA=P1^7; /********************定义数据*************************/ uchar code Smg[16]={0xeb,0x60,0xc7,0xE5,0x6C,0xAD,0xaf,0xE0,0xef,0xed,0xee,0x2f,0x8b,0x67,0x8f,0x8e}; //0~F字型码 uchar code Tab0[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //清屏 /********************延时函数*************************/ void delay_nms(uint n) { uint i; while(n--) for(i=0;i<500;i++); } /********************从高位写入数据*************************/ void Write_Data_H(uchar Data, uchar Cnt) //Data的高cnt位写入TM1621,高位在前 { uchar i; for(i=0;i<Cnt;i++) { WRITE=0; if(Data&0x80;) //从最高位发送 DATA=1; else DATA=0; nop; nop; WRITE=1; Data<<=1; } WRITE=0; DATA=0; } /********************从低位写入数据*************************/ void Write_Data_L(uchar Data,uchar Cnt) //Data 的低cnt位写入TM1621,低位在前 { unsigned char i; for(i=0;i>=1; } WRITE=0; DATA=0; } /********************写入控制命令*************************/ void WriteCmd(uchar Cmd) { CS=0; nop; Write_Data_H(0x80,4); //写入命令标志100 Write_Data_H(Cmd,8); //写入命令数据 CS=1; nop; } /*********指定地址写入数据,实际写入后4位************/ void WriteOneData(uchar Addr, uchar Data) { CS=0; Write_Data_H(0xa0,3); //写入数据标志101 Write_Data_H(Addr<<2,6); //写入地址数据 Write_Data_L(Data,4); //写入数据 CS=1; nop; } /*********连续写入方式,每次数据为8位,写入数据************/ void WriteAllData(uchar Addr,uchar *p,uchar cnt) { uchar i; CS=0; Write_Data_H(0xa0,3); //写入数据标志101 Write_Data_H(Addr<<2,6); //写入地址数据 for(i=0;i<cnt;i++) //写入数据 { Write_Data_L(*p,8); p++; } CS=1; nop; } /*******************TM1621初始化**********************/ void TM1621_init() { CS=1; WRITE=1; DATA=1; nop; delay_nms(1); WriteCmd(BIAS); //1/3偏压 4公共口 WriteCmd(RC); //内部RC振荡 WriteCmd(SYSDIS); //关系统振荡器和LCD偏压发生器 WriteCmd(WDTDIS); //禁止看门狗 WriteCmd(SYSEN); //打开系统振荡器 WriteCmd(LCDON); //开LCD偏压 } void main() { TM1621_init(); //开机初始化 delay_nms(1); WriteAllData(0,Tab0,16); //LCD不显示 while(1) { WriteAllData(0,Smg,16); //LCD显示0~F delay_nms(200); WriteAllData(0,Tab0,16); //LCD不显示 delay_nms(200); } }
### 回答1: 天微TM1620是一种常用的数码管驱动芯片,它能够通过外部接口与单片机进行通信,实现数码管的显示功能。该芯片内部集成了多个控制逻辑电路,可以独立控制多个数码管的亮度和显示内容。 TM1620的驱动程序是指针对该芯片编写的软件程序,用于控制TM1620芯片的各个功能并实现数字显示功能。驱动程序一般包括了初始化、数据发送、控制等功能的实现。 首先,在使用TM1620芯片之前,需要进行初始化操作。初始化包括设置传输模式、数据位数、显示亮度等参数。通过初始化,可以使芯片处于合适的工作状态,为后续的操作做好准备。 其次,驱动程序需要实现数据发送功能。数据发送是将需要显示的数字数据通过串行通信方式发送给TM1620芯片。驱动程序通过将数据转换为对应的控制指令,使用时钟信号和数据信号进行传输。通过适时的数据发送,可以实现数码管的数字显示。 此外,驱动程序还需要实现控制功能。控制功能包括设置亮度、刷新频率等操作。通过控制指令,可以调节数码管的亮度,使显示效果更加清晰明亮。同时,控制指令还可以设置刷新频率,实现动态显示效果。 总之,TM1620驱动程序是一款用于控制TM1620芯片的软件程序,通过初始化、数据发送和控制等功能的实现,可以实现TM1620数码管的数字显示功能。 ### 回答2: TM1620是一款数字驱动芯片,常用于控制数码管显示。它由天微公司设计和生产。TM1620具有简单、有效的驱动功能,能够轻松实现7段数码管的显示。该芯片支持多种显示模式,并能通过外部控制来设置显示内容。 TM1620驱动程序是指用于控制TM1620芯片的软件程序。它通常由编程人员根据具体的应用需求编写。驱动程序的主要任务是通过与TM1620芯片的通信,将要显示的数字、字符或图形数据传输到芯片中,使TM1620芯片能够控制数码管正确显示出所需的内容。 TM1620驱动程序的编写需要熟悉TM1620芯片的通信协议和控制寄存器。驱动程序一般包括初始化函数、数据传输函数和显示函数。初始化函数用于对TM1620芯片进行初始化设置,包括设置工作模式、亮度等参数。数据传输函数用于与芯片进行数据传输,将要显示的数据发送给TM1620芯片。显示函数则用于控制TM1620芯片的显示动作,根据传输的数据控制数码管的亮灭。 TM1620驱动程序的编写需要根据具体的应用需求进行,例如,如果需要控制多个数码管进行复杂的显示,驱动程序需要具备支持多个芯片的能力。同时,驱动程序还需要考虑到显示的刷新频率和数据传输的速度等因素,以保证显示的稳定性和流畅性。 总之,TM1620驱动程序是一种用于控制TM1620芯片,实现数码管显示的软件程序。它基于TM1620芯片的通信协议和寄存器设置,通过与芯片进行数据传输和控制,使得数码管能够正确显示出所需的数字、字符或图形。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cjmsea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值