LCD 1622

本文探讨了HT1622与TM1622芯片在驱动段码液晶屏时的细节,包括温度对显示稳定性的影响及解决方案,如采用外部时钟源改善高温闪烁问题,以及显示缓存与影子缓存的使用技巧。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

应用三 便携式甲醛检测仪(下)— 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,  //	
};


开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值