前言
在上篇文章中,着重介绍了基于I2C接口的温湿度传感器SHT30的用法,本篇文章着重介绍HT1622液晶驱动的用法。HT162x 系列是由 HOLTEK 公司开发的支持多种显示方式的 LCD 驱动芯片,内部 RAM 直接映射到相对应的 LCD 显示单元。支持串行通信方式。
HT1622代码
先贴上代码再说(本部分代码是从工程里面摘出来的,GPIO口配置可能有多余的,其他相关子函数没有问题)
/******************************HT1622.h***********************************************/
#ifndef __HT1622_H
#define __HT1622_H
#include "sys.h"
#define HT1622_CS PBout(11) //片选端口
#define HT1622_WR PBout(13) //写控制端口
#define HT1622_DAT PBout(14) //数据传输端口
void LCD_GPIO(void);
void Ht1622Wr_bit(u8 Data,u8 cnt);
void Ht1622Wr_data(u8 Data,u8 cnt);
void Ht1622WrCmd(u8 Cmd);
void Ht1622_Init(void);
void Ht1622WrOneData(u8 Addr,u8 Data);
/***************************************************HT1622.c**************************/
#include "HT1622.h"
#include "delay.h"
/***************初始化LCD相关的GPIO********************/
void LCD_GPIO(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/**
* @brief HT1622 写地址写命令用,先移最高位
* @param Data 写入输入,cnt 写入位数
* @retval None
*/
void Ht1622Wr_bit(u8 Data,u8 cnt)
{
u8 i;
for (i=0;i<cnt;i++)
{
HT1622_WR = 0; //上升沿写数据到HT1622 RAM
delay_us(10);
if(Data&0x80)
HT1622_DAT = 1;
else
HT1622_DAT = 0;
delay_us(10);
HT1622_WR = 1;
delay_us(10);
Data<<=1;
}
}
/**
* @brief 写数据用,先移最低位
* @param Data 写入数据,cnt写入位数
* @retval None
*/
void Ht1622Wr_data(u8 Data,u8 cnt)
{
u8 i;
for (i=0;i<cnt;i++)
{
HT1622_WR=0;
if(Data&0x01)
HT1622_DAT=1;
else
HT1622_DAT=0;
delay_us(10);
HT1622_WR=1;
delay_us(10);
Data>>=1;
}
}
/**
* @brief 写命令
* @param cmd写命令
* @retval None
*/
void Ht1622WrCmd(u8 Cmd)
{
HT1622_CS=1;
delay_us(10);
HT1622_CS=0;
Ht1622Wr_bit(0x80,3); // 写ID100表示命令模式
Ht1622Wr_bit(Cmd,9); // 写9位命令(看手册命令就是九位)
delay_us(10);
}
/**
* @brief 在指定地址写数据
* @param addr地址,data写入数据
* @retval None
*/
void Ht1622WrOneData(u8 Addr,u8 Data)
{
HT1622_CS=1;
delay_us(10);
HT1622_CS=0;
Ht1622Wr_bit(0xa0,3); // 写数据功能码就是101
Ht1622Wr_bit(Addr<<2,6); // 从手册看出写数据地址是6位
Ht1622Wr_data(Data,4); // 从手册看出写数据是4位
delay_us(10);
}
/**
* @brief 初始化函数
* @param None
* @retval None
*/
void Ht1622_Init(void)
{
u8 i;
Ht1622WrCmd(0x18); //系统时钟源,片内RC振荡器
Ht1622WrCmd(0x01); // 开启系统振荡器
Ht1622WrallData(0x00);//清屏
Ht1622WrCmd(0x03); // 打开LCD偏置电压
}
void lcd_init(void)
{
LCD_GPIO();
Ht1622_Init();
}
int main()
{
lcd_init();
while(1);
}
手册分析
写命令
上图是写命令的时序图,注意三点:第一,数据每一位写的时候WR处于上升沿;第二,写命令的时候先发三位功能码100,再发9位命令,参考函数void Ht1622WrCmd(u8 Cmd)
,且注意,从时序图看出命令码从C8开始,即先发高位。
写数据
上图是写数据的时序图,注意四点:第一还是WR上升沿写数据;第二写数据先发三位功能码101;第三,功能码之后再发六位RAM地址,最后发四位数据(仔细看时序图,地址先发高位A5,数据先发低位D0),参考代码void Ht1622WrOneData(u8 Addr,u8 Data)
如何使用HT1622控制显示
说明:
1.无论所用的段码屏显示是什么样的,格式制图通常都是图2这种,包括屏幕显示内容和一个表格(对应相应的COM,SEG)
2.段码屏的意思就是屏幕显示的内容是不连续的,一段段的,每个显示的部位都可以单独控制点亮,具体看屏幕设计。
如图2,我们想要点亮屏幕上系统初始化“”这几个字,发现这几个字对应S1,然后去表格中查找发现S1对应COM2.SEG3(这里截图不准确,仅仅是打个比方),接着查看手册的RAM映射图,将COM2,SEG3处置1,从而知道,要想点亮S1,只需要在地址6处,发送数据4即可,即调用函数Ht1622WrOneData(0x06, 0x04)
总结
至此,关于便携式甲醛检测仪项目最重要的SHT30的使用,HT1622的使用基本介绍完毕,当然还有其他的部分功能,由于相对简单一些,不在此赘述。