LCD 1622

应用三 便携式甲醛检测仪(下)— HT1622
ht1622应用笔记
tm1622
LCD_HT1622_16SegLcd_demo_driver.ino
HT1622.cpp
段码液晶屏的偏压有几种,有什么区别?
段式液晶程序设计技巧
LED显示数字(七段码)与十六进制代码对照表

段码液晶刷新问题

在使用TM1622内部RC振荡器作为时钟时,随着温度的升高,大约70℃,段码液晶会出现闪烁

原因:随着温度的升高,内部RC振荡器的频率降低,导致段码液晶的扫描频率变慢,出现闪烁
解决办法:采用外部时钟源输入,由于TM1622内部无晶振起振电路,需要外界有源晶振或者通过MCU的TIM输出PWM时钟源,一般采用通过MCU的TIM输出PWM时钟源。外部时钟源的频率不能太高,太高会影响显示效果,TM1622内置RC是32kHz,外部时钟源的频率可设置为60kHz左右,经测试,在75℃高温时,不会出现闪烁的问题

LCD可视角度
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

段式液晶界面显示逻辑设计思路:
1、使用显示缓存,将需要显示的数据写入到缓存中,定时(500ms)将显示缓存写入驱动芯片
2、使用影子缓存模式,实现闪烁的功能;影子缓存初始化都为1,将需要闪烁的部分,在影子缓存中将对应的位置0,交替刷新显示缓存和影子缓存,在显示影子缓存时,使用影子缓存和显示缓存按位与之后,再写入驱动芯片。
注意使用芯片的控制信号的高低电平限制:
HT1622 (如果要使用3.3V信号控制,需要电平转换,控制口使用OD输出,外接5V上拉电阻) ⬇⬇⬇⬇⬇⬇
在这里插入图片描述
TM1622 (可以使用3.3V控制信号控制) ⬇⬇⬇⬇⬇⬇
在这里插入图片描述

SEG口波形⬇⬇⬇⬇⬇⬇
SEG口波形
COM1口波形⬇⬇⬇⬇⬇⬇
COM1口波形
COM8口波形⬇⬇⬇⬇⬇⬇
COM8口波形
头文件

#ifndef _LCD1622_H_
#define _LCD1622_H_
#include "main.h"

#define  SYSDIS   0X00		//0000_0000_X	关闭系统振荡器和LCD偏压发生器
#define  SYSEN    0X01		//0000_0001_X	打开系统振荡器
#define  LCDOFF   0X02		//0000_0010_X  	关闭LCD
#define  LCDON    0X03		//0000_0011_X 打开LCD
#define  INRC     0X18		//0001_10XX_X 内部时钟
#define  NORMAL   0XE3		//1110-0011-X 正常模式
  
//函数声明
void LCD1622Wr(uchar data,uchar cnt);
void LCD1622Wr_byte(uchar addr,uchar data);
void LCD1622Wr_AllData(uchar addr,uchar *p,uchar cnt);
void LCD1622Wr_cmd(uchar cmd);
void LCD1622_init();

void lcd_clr0(uint8_t Data);
void LCD1622_all_off(void);

extern uchar lcdnum[32];

#endif

特别说明:
LCD_RD_H;//如果使用了RD接口,在写入数据时,RD必须为高电平,否则无法写入数据(写入指令正常,写入显示数据不正常)



#include "lcd1622.h"
#include "gpio.h"
#include "tim.h"



/**
* @brief  数据写入时序
* @param  Data为数据,cnt为传送数据位数,数据传送低位在前
* @retval none
* @notice 1622的写入地址是从高位开始写,数据是从低位开始写
在写入数据的时候要注意数组对应的寄存器位;
*/
void LCD1622Wr(uchar data,uchar cnt)
{
  uchar i;
  for(i=0;i<cnt;i++)
  {
    HAL_Delay_US(10);
    LCD_WR_L;
    HAL_Delay_US(10);
    if(data&0x80)
      LCD_DATA_H;
    else 
      LCD_DATA_L;
    HAL_Delay_US(10);
    LCD_WR_H;
    HAL_Delay_US(10);
    data <<= 1;
  }
}

/**
* @brief  LCD1622在指定地址写入数据函数
* @param  addr为写入初始地址,dat为写入数据
* @retval none
* @notice LCD1622的数据为4位,并且是低位开始写,注意写入方向是高位开始写
*/
void LCD1622Wr_OneData(uchar addr,uchar data)
{
  addr <<= 2;
  data <<= 4;
  LCD_CS_L;
  LCD1622Wr(0xa0,3);			//写入命令101
  LCD1622Wr(addr,6);			//写入地址
  LCD1622Wr(data,4);			//写入数据
  LCD_CS_H;
  HAL_Delay_US(5);
  HAL_Delay_US(5);
}


/**
* @brief  LCD1622连续写入方式函数
* @param  addr为写入初始地址,dat为写入数据,cnt为写入数据总数(byte)
* @retval none
* @notice LCD1622的数据为4位,并且是低位开始写,注意写入方向是高位开始写
*/
void LCD1622Wr_AllData(uchar addr,uchar *p,uchar cnt)
{
  uchar i,j;
  addr <<= 2;
  LCD_CS_L;
  LCD1622Wr(0xa0,3);			//写入命令
  LCD1622Wr(addr,6);			//写入地址
  for(i=0;i<cnt;i++)
  {
    LCD1622Wr(*p,8);		//写入数据
    p++;
  }
  LCD_CS_H;
  HAL_Delay_US(5);

}

  
void LCD1622_all_off(void)
{ 
  uchar i;
  uchar addr=0;
  for(i=0;i<32;i++)
  {
    LCD1622Wr_OneData(addr,0);
    addr+=1;
  }
}

    
    
/********************************************************
函数名称:void Ht1622WrCmd(u8 Cmd)
功能描述: LCD1622命令写入函数
全局变量:无
参数说明:Cmd为写入命令数据
返回说明:无
说 		明:写入命令标识位100
********************************************************/

/**
* @brief  LCD1622命令写入函数
* @param  cmd(命令后8位)
* @retval 
* @notice 
*/
void LCD1622Wr_cmd(uchar cmd)
{
  LCD_CS_L;
  HAL_Delay_US(5);
  LCD1622Wr(0x80,3);			//写入命令
  LCD1622Wr(cmd,8);			//写入控制命令
  LCD1622Wr(0,1);//写入CMD最后1bit
  LCD_CS_H;
  HAL_Delay_US(5);
}

//LCD1622初始化
void LCD1622_init()
{
  LCD_BK_H;
  LCD_CS_H;
  LCD_WR_H;
  LCD_DATA_H;
  LCD_RD_H;//如果使用了RD接口,在写入数据时,RD必须为高电平,否则无法写入数据(写入指令正常,写入显示数据不正常)
  HAL_Delay_US(5);
  HAL_Delay_US(5);
  LCD1622Wr_cmd(SYSDIS); 			// 关振系统荡器和LCD偏压发生器
  HAL_Delay_US(5);
  LCD1622Wr_cmd(SYSEN); 			// 打开系统荡器和LCD偏压发生器 
  HAL_Delay_US(5);
  LCD1622Wr_cmd(LCDOFF); 			// 关闭LCD显示
  HAL_Delay_US(5);
  LCD1622Wr_cmd(LCDON); 			// 打开LCD显示
  HAL_Delay_US(5);
  LCD1622Wr_cmd(INRC); 			//使用内部振荡器
  HAL_Delay_US(5);
  LCD1622Wr_cmd(NORMAL); 			//正常模式
}

//LCD数据刷新
uchar lcdnum[32];

//清0
void lcd_clr0(uint8_t Data)
{
  uchar i;
  for(i=0;i<32;i++)
  {
    lcdnum[i] = Data;
  }
}

//LCD显示数据
const uchar NumTable1[] = {
  0xee,  //0                 _a_
  0x24,  //1               f|   |b
  0xba,  //2                 _g_
  0xb6,  //3               e|   |c   afbg ecdx
  0x74,  //4                 _d_
  0xd6,  //5
  0xde,  //6
  0xa4,  //7
  0xfe,  //8
  0xf6,  //9	
  0x00,  // 	
};

const uchar NumTable2[] = {
  0x77,  //0                 _a_
  0x24,  //1               f|   |b
  0x5d,  //2                 _g_
  0x6d,  //3               e|   |c   xdce gbfa
  0x2e,  //4                 _d_
  0x6b,  //5
  0x7b,  //6
  0x25,  //7
  0x7f,  //8
  0x6f,  //9	
  0x00,  //	
};

const uchar NumTable3[] = {
  0x77,  //0                 _a_
  0x12,  //1               f|   |b
  0x5d,  //2                 _g_
  0x5b,  //3               e|   |c   xafb gecd
  0x3a,  //4                 _d_
  0x6b,  //5
  0x6f,  //6
  0x52,  //7
  0x7f,  //8
  0x7b,  //9	
  0x00,  //	
};


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
/***************************************************************************** *版权信息:深圳天微电子有限公司 *文 件 名: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: TM1622是一种常用的LCD显示驱动器芯片,广泛应用于各种嵌入式系统和电子设备中。下面是关于TM1622 LCD程序的一些基本介绍。 TM1622芯片的主要功能是控制和驱动液晶显示屏,它支持4个字节的指令和数据传输。在编写TM1622程序时,我们需要先初始化芯片,然后发送相应的指令和数据来控制显示内容。 首先,我们需要连接TM1622芯片和LCD显示屏,并将其连接到微控制器或单片机中。然后,在程序中设置引脚的输入输出方向和初始状态。 接下来,我们需要初始化TM1622芯片。初始化过程包括发送一系列的命令和数据给芯片,以设置其内部寄存器和工作模式。这些命令可以根据实际应用和显示需求进行调整,例如设置显示模式、亮度、显示位数等。 初始化完成后,我们就可以发送实际的数据来显示在LCD屏上。数据可以是数字、字符、符号等。发送数据的过程包括设置芯片的地址和数据类型,并将相应的数据发送给芯片。 在程序中,我们可以通过编写相应的函数来处理和控制TM1622芯片。这些函数可以包括初始化函数、发送指令函数、发送数据函数等。通过编写这些函数,我们可以更方便地调用和控制TM1622芯片,实现各种显示效果和功能。 总之,编写TM1622 LCD程序需要了解和理解TM1622芯片的基本原理和功能,然后通过初始化芯片和发送指令数据来控制和显示LCD屏上的内容。通过灵活应用这些函数和命令,我们可以实现各种个性化显示效果和功能。 ### 回答2: TM1622液晶显示器模块是一种常见的数字显示器模块,它使用TM1622芯片驱动,具有简单易用、低功耗等特点。下面是一个使用TM1622驱动液晶显示器的基本程序的示例: ```c #include <TM1622.h> // 导入TM1622库 TM1622 display(2, 3, 4); // 设置TM1622引脚(DIN, CLK, STB) int num = 123; // 要显示的数字 void setup() { display.setupDisplay(true); // 初始化显示器 display.setBrightness(3); // 设置亮度(0-7,数字越大越亮) display.clearDisplay(); // 清除显示内容 } void loop() { display.showNumberDecEx(num, 0b01000000, true); // 显示十进制数字,并带小数点 delay(1000); // 延迟1秒 num++; // 数字加1 if (num > 999) { num = 0; // 当数字超过999时,重新从0开始计数 } } ``` 以上是一个简单的使用TM1622驱动液晶显示器的程序示例。首先,导入TM1622库文件,然后声明并初始化一个TM1622对象,设置引脚连接。在`setup()`函数中,进行显示器的初始化设置,如设置亮度和清除显示。在`loop()`函数中,使用`showNumberDecEx()`函数显示数字,并通过`delay()`函数设置刷新间隔。在示例中,数字每秒加1并循环显示,当数字超过999时重新从0开始。 通过以上程序示例,我们可以实现使用TM1622驱动液晶显示器显示数字的功能,可以根据需要进行进一步的扩展和优化。 ### 回答3: TM1622是一种常用于驱动液晶显示屏的芯片。它具有内置的控制器和驱动电路,可用于控制7段数码管、16x2字符液晶显示屏等各种显示器件。 TM1622芯片的程序编写通常需要遵循以下步骤: 1. 初始化:在程序开始时,需要对TM1622进行初始化设置。这包括设置显示模式(7段数码管或字符液晶)、亮度、扫描模式(静态或动态扫描),以及I/O口的配置等。 2. 显示操作:通过TM1622的控制寄存器,可以设置要显示的字符或数字。对于7段数码管,可以通过设置每个段的亮灭状态来显示不同的数字或字符。对于字符液晶,可以根据需求设置要显示的字符在屏幕上的位置。 3. 数据读取和写入:通过TM1622的数据线可以读取外部输入的数据,也可以从内部读取当前显示的数据。程序可以根据需要进行数据的读取和写入操作,实现数据的输入和输出。 4. 其他功能:TM1622芯片还具有其他功能,如键盘输入检测、按键消抖等。可以根据需求,编写相应的程序来实现这些功能。 编写TM1622芯片的程序需要掌握相应的编程知识和技巧,比如了解TM1622的控制寄存器和命令格式,熟悉I/O口的操作方法,以及掌握相应的编程语言和开发工具。 总之,TM1622芯片的程序编写是一个根据需求设置显示内容、读取和写入数据的过程。通过合理的编程,可以实现各种类型的液晶显示屏的控制和显示操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值