首页 > 学习笔记 > STM32液晶显示HT1622驱动程序
2018
12-17

STM32液晶显示HT1622驱动程序

博主公司有个项目需要使用液晶屏,经过多方询价与性能比对,决定采用HT1622这款驱动芯片,但是这款芯片在STM32平台例程相对较少,博主研发过程中也是踩了很多坑,下面我将自己使用的驱动程序共享给大家,希望大家少踩坑,为大家代码编写带来思路。

C文件


/**
 *******************************************************************************
 * @author Vnoon
 * @version V1.0
 * @date 2018-12-03 08:44:32
 * @brief TM1622驱动底层
 *******************************************************************************
 * @attention
 *
 * email admin@vnoon.cn
 * website http://www.vnoon.cn
 *******************************************************************************
 */

#include "tm1622.h"

/**
 * @brief 管脚IO初始化配置
 * @param None
 * @retval None
 */
void TM1622_GPIO_Config(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
 GPIO_InitStructure.GPIO_Pin = TM1622_Pin_WR | TM1622_Pin_CS | TM1622_Pin_DATA;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(TM1622_GPIO_PORT, &GPIO_InitStructure);

 GPIO_InitStructure.GPIO_Pin = BackLight_Pin;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(BackLight_PORT, &GPIO_InitStructure);
 GPIO_ResetBits(BackLight_PORT, BackLight_Pin);
}

/**
 * @brief MCU向TM1622写入u8bitnum个位
 * @param u8data: 要写入的数据,高位在前
 u8bitnum:写入数据的总位数,最大为8
 * @retval None
 */
void TM1622_Send_Bit(uint8_t u8data, uint8_t u8bitnum)
{
 uint8_t u8Count;

 for (u8Count = 0; u8Count < u8bitnum; u8Count++)
 {
 if (u8data & 0x80)
 TM1622_DATA_H;
 else
 TM1622_DATA_L;
 Delay_us(TM1622_Delay);
 TM1622_WR_L;
 Delay_us(TM1622_Delay);
 TM1622_WR_H;
 Delay_us(TM1622_Delay);
 u8data <<= 1;
 Delay_us(TM1622_Delay);
 }
}

/**
 * @brief MCU向TM1622写入u8bitnum个位
 * @param u8data: 要写入的数据,高位在前
 u8bitnum:写入数据的总位数
 * @retval None
 */
void TM1622_Send_DataBit(uint8_t u8data, uint8_t u8bitnum)
{
 uint8_t u8Count;
 for (u8Count = 0; u8Count < u8bitnum; u8Count++) { if (u8data & 0x01) TM1622_DATA_H; else TM1622_DATA_L; Delay_us(TM1622_Delay); TM1622_WR_L; Delay_us(TM1622_Delay); TM1622_WR_H; Delay_us(TM1622_Delay); u8data >>= 1;
 Delay_us(TM1622_Delay);
 }
}

/**
 * @brief 发送命令
 * @param u8Comm:要发生的命令
 * @retval None
 */
void TM1622_Send_Comm(uint8_t u8Comm)
{
 TM1622_CS_L;
 Delay_us(TM1622_Delay);
 TM1622_Send_Bit(0x80, 3);
 TM1622_Send_Bit(u8Comm, 8);
 TM1622_Send_Bit(0x00, 1);
 TM1622_CS_H;
 Delay_us(TM1622_Delay);
}

/**
 * @brief 发送数据
 * @param u8Addr:TM1622 6位RAM地址
 u8data 4位数据
 * @retval None
 */
void TM1622_Send_Data(uint8_t u8addr, uint8_t u8data)
{
 TM1622_CS_L;
 Delay_us(TM1622_Delay);
 TM1622_Send_Bit(0xA0, 3);
 TM1622_Send_Bit(u8addr << 2, 6);
 TM1622_Send_DataBit(u8data, 4);
 TM1622_CS_H;
 Delay_us(TM1622_Delay);
}

/**
 * @brief 清除TM1622显示
 * @param None
 * @retval None
 */
void TM1622_all_off(void)
{
 uint8_t u8Count;

 TM1622_CS_L;
 Delay_us(TM1622_Delay);
 TM1622_Send_Bit(0xA0, 3);
 TM1622_Send_Bit(0, 6);
 for (u8Count = 0; u8Count < 64; u8Count++)
 TM1622_Send_DataBit(0, 4);
 TM1622_CS_H;
 Delay_us(TM1622_Delay);
}

/**
 * @brief TM1622全部显示
 * @param None
 * @retval None
 */
void TM1622_all_on(void)
{
 uint8_t u8Count;

 TM1622_CS_L;
 Delay_us(TM1622_Delay);
 TM1622_Send_Bit(0xA0, 3);
 TM1622_Send_Bit(0, 6);
 for (u8Count = 0; u8Count < 64; u8Count++)
 {
 TM1622_Send_DataBit(0xFF, 4);
 }
 TM1622_CS_H;
 Delay_us(TM1622_Delay);
}

/**
 * @brief LCD初始化
 * @param None
 * @retval None
 */
void TM1622_Init(void)
{
 TM1622_CS_H;
 TM1622_WR_H;
 TM1622_DATA_H;
 TM1622_Send_Comm(SYS_EN);
 //TM1622_Send_Comm(0x29);
 TM1622_Send_Comm(RCosc);
 TM1622_Send_Comm(SYS_EN);
 TM1622_Send_Comm(LCD_ON);

 TM1622_Send_Comm(NORMAL);
 TM1622_all_off();
}

/**
 * @brief 连续写入数据
 * @param u8StartAddr:写入初始地址
 *ptr: 连续写入数据指针
 u8CNT: 欲写入的数据总数
 * @retval None
 */
void TM1622_Send_SerialData(uint8_t u8StartAddr, uint8_t *ptr, uint8_t u8CNT)
{
 uint8_t u8Count;
 // uint8_t u8Cnt;

 TM1622_CS_L;
 Delay_us(TM1622_Delay);
 TM1622_Send_Bit(0xA0, 3);
 TM1622_Send_Bit(u8StartAddr << 2, 6);
 for (u8Count = 0; u8Count < u8CNT; u8Count++)
 {
 TM1622_Send_DataBit(*ptr, 8);
 ptr++;
 }
 TM1622_CS_H;
 Delay_us(TM1622_Delay);
}


H文件


#ifndef __TM1622_H
#define __TM1622_H

#include "public.h"

#define TM1622_Delay 60
// 管脚定义
#define TM1622_GPIO_PORT GPIOB
#define TM1622_Pin_WR GPIO_Pin_0
#define TM1622_Pin_CS GPIO_Pin_1
#define TM1622_Pin_DATA GPIO_Pin_2

// 背光板管脚定义
#define BackLight_PORT GPIOA
#define BackLight_Pin GPIO_Pin_12

// 管脚电平控制
#define TM1622_CS_H GPIO_SetBits(TM1622_GPIO_PORT, TM1622_Pin_CS)
#define TM1622_CS_L GPIO_ResetBits(TM1622_GPIO_PORT, TM1622_Pin_CS)
#define TM1622_WR_H GPIO_SetBits(TM1622_GPIO_PORT, TM1622_Pin_WR)
#define TM1622_WR_L GPIO_ResetBits(TM1622_GPIO_PORT, TM1622_Pin_WR)
#define TM1622_DATA_H GPIO_SetBits(TM1622_GPIO_PORT, TM1622_Pin_DATA)
#define TM1622_DATA_L GPIO_ResetBits(TM1622_GPIO_PORT, TM1622_Pin_DATA)

// 命令定义
#define SYS_DIS 0x00 // 系统振荡器关
#define SYS_EN 0x01 // 系统振荡器开
#define LCD_OFF 0x02 // 关闭LCD显示
#define LCD_ON 0x03 // 开启LCD显示
#define TIMER_DIS 0x04 // 时基输出失效
#define WDT_DIS 0x05 // WDT 溢出标志输出失效
#define TIMER_EN 0x06 // 使能时基输出
#define WDT_EN 0x07 // 使能 WDT 溢出标志失效
#define TONE_OFF 0x08 // 关闭声音输出
#define CLR_TIMER 0x0D // 时基发生器清零
#define CLR_WDT 0x0F // 清除 WDT 状态
#define RCosc 0x18 // 系统时钟源,片内 RC 振荡器
#define NORMAL 0xE3 // 系统时钟源,片内 RC 振荡器

// 函数声明
void TM1622_GPIO_Config(void);
void TM1622_Send_Bit(uint8_t , uint8_t );
void TM1622_Send_DataBit(uint8_t , uint8_t );
void TM1622_Send_Comm(uint8_t );
void TM1622_Send_Data(uint8_t , uint8_t );
void TM1622_all_on(void);
void TM1622_all_off(void);
void TM1622_Init(void);
void TM1622_Send_SerialData(uint8_t u8StartAddr, uint8_t *ptr, uint8_t u8CNT);

extern void Delay_us(uint32_t );

#endif /* __TM1622_H */

最后编辑:
作者:vnoon
一个不爱学习的电气专业学生,一个不务正业的程序猿
捐 赠如果您觉得这篇文章有用处,请支持作者!鼓励作者写出更好更多的文章!

One Response to STM32液晶显示HT1622驱动程序

  1. vnoon says:

    有问题请电子邮件发我

留下一个回复

你的email不会被公开。