本文使用的例程软件工程代码如下
(1条消息) stm32MCU液晶TM1622HT1622驱动调试,源代码,实际项目使用资源-CSDN文库
HT1622/HT1622G/TM1622是一款常用的LCD驱动芯片
TM1622/HT1622厂家不一样,但是芯片功能基本上一直,硬件上基本上可以做到pin2pin兼容,这个需要根据自己的做微调整
以TM1622的资料为例,做如下说明
TM1622是256点内存映象和多功能的LCD驱动专用芯片,TM1622的软件配置特性使它适用于多种LCD应用 场合,包括:LCD模块和显示子系统。用于连接主控制器和TM1622的管脚只有4或5条,TM1622还有一个节电命 令用于降低系统功耗。本产品性能优良、质量可靠。
功能特点
工作电压2.4~ 5.2V
内置32 KHz RC振荡器
可外接32KHz频率源作为时钟输入
内置时基频率源
内置蜂鸣器输出驱动,有两种输出频率可选(2 KHz或者4 KHz)
内置节电模式,可用于减少功耗
内置时基发生器和看门狗(WDT)输出
内置32ⅹ8位显示寄存器,32个SEG,8个COM输出驱动, 1/4偏压
四线串行接口 提供VLCD管脚用于调整LCD操作电压
三种数据访问模式
八个时基/看门狗定时器时钟源
数据模式和命令模式指令
四种封装形式可选:LQFP44(长脚),LQFP44(短脚),LQFP52,LQFP64 内部结构框图
MCU典型接法
写数据时序图,这里不需要读取,也不用看读数据的时序
软件命令列表
需要详细的,手册,可以下载一份数据手册看看
实际项目原理图设计如下
这里有点复杂,就是要支持两款液晶,一个大液晶一个小液晶,其中YJ1是焊接大液晶的接口,YJ2是焊接小液晶的接口
下图1处,是液晶的背光灯开关
2处是MCU控制液晶的接口,其中SPI_RD用0欧姆的电阻连接,可以考虑不需要读取也液晶数据,可以不焊接该电阻,空余出来一个MCU的管脚
3处是电平转换后的TM1622的控制管脚
MCU的控制管脚设计如下
实际项目使用的控制管脚设计比较多,这里比较简单,提取出来对应TM1622的控制管脚
对应上述原理图,软件实现的控制管脚接口,如下所示
#define LCD_CS_L {PBout(7) = 0;}
#define LCD_CS_H {PBout(7) = 1;}
#define LCD_RD_L {PBout(6) = 0;}
#define LCD_RD_H {PBout(6) = 1;}
#define LCD_WR_L {PBout(8) = 0;}
#define LCD_WR_H {PBout(8) = 1;}
#define LCD_DAT_L {PBout(9) = 0;}
#define LCD_DAT_H {PBout(9) = 1;}
#define LCD_BLK_EN_ON {PBout(13) = 0;}
#define LCD_BLK_EN_OFF {PBout(13) = 1;}
stm32cube的关键设计如下
IO的配置,PB6/PB7/PB8/PB9/PB13配置为输出模式
其中需要注意的是,PB6连接的tm1622的数据读取管脚,这个管脚实际上没有使用,配置成输入输出都无所谓
时钟的配置
时钟采用外部时钟8M,倍频到72M供系统使用
系统主函数,主要是添加了initHT1622()测试
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
initHT1622();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
TM1622的写函数,这些函数是根据手册写时序图调试出来的
当然也和MCU的时钟有关,这里配置为72MHZ,如果需要移植该驱动,则需要根据自己的系统时钟修改如下函数的延时,当然也需要修改控制管脚
void Write_HT1622_Byte(unsigned char Data,unsigned char length)
{
unsigned char i,Temp=0x80;
for (i=0;i<length;i++)
{
if (Data&Temp)
{
LCD_DAT_H;//数据线置1
}
else
{
LCD_DAT_L;//数据线置0
}
Temp>>=1; //准备下一位
LCD_WR_L; //“写”时钟置0
__NOP();
__NOP();
__NOP();
LCD_WR_H; //“写”时钟置1
}
}
液晶初始化
void initHT1622(void)
{
uint8_t i;
//InitLcdPin();
// for(i = 0 ;i < 100; i++)
{
Write_HT1622_Command(SYSDIS);//关闭系统振荡器和LCD驱动
Write_HT1622_Command(SYSEN); //打开系统振荡器
Write_HT1622_Command(LCDOFF);//关闭LCD显示
Write_HT1622_Command(LCDON); //打开LCD显示
}
//Write_HT1622_Command(0x01);
// Write_HT1622_Command(0x29);
//Write_HT1622_Command(0x18);
//Write_HT1622_Command(0x01);
//Write_HT1622_Command(0x03);
//清屏
for(i = 0; i < 64; i++)
{
Write_HT1622_Data(i,0);
}
}
本文使用的例程软件工程代码如下