HT1621段码液晶屏

本文介绍了如何使用HT1621控制器操作段码液晶屏,包括液晶屏的引脚配置、命令格式、数据格式以及初始化设置。通过示例代码展示了如何设置延时函数、发送命令和数据,以及实现清屏、开屏、关闭液晶等功能。此外,还提供了液晶屏的显示原理和地址计算方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HT1621段码液晶屏

2021/4/6
第一次用HT1621控制的段码液晶屏,东西还没到,先在淘宝买了个小显示屏调试。

或置位,与清零
(x|=(1<<y)) 置位x的第y位
(x&=~(1<<y)) 清零x的第y位

命令格式100开始,8位命令,1位补位
例如:打开LCD偏置发生器 LCD ON 命令
100 00000011 x

写数据格式101开始,6位地址,4位数据
101 A5A4A3A2A1A0 D0D1D2D3
地址就是SEG的序号。
在这里插入图片描述
在这里插入图片描述
16个引脚,4个COM,12个SEG。
1-16 从左至右

12345678910111213141516
com1com2com3com4seg11seg10seg9seg8seg7seg6seg5seg4seg3seg2seg1seg0

12个SEG脚每两个控制一个数码管。
在这里插入图片描述
以第六个数码管为例

在这里插入图片描述
显示数字0,ABCDEF置1,GP置0。
在这里插入图片描述
数据位是
0b01111101=0x7D
D0D1D2D3D0D1D2D3
每个是四个二进制码,这里使用8个二进制码,地址自动向下移一位。

上面说写数据中的6位地址就是SEG的序号。是真的地址,10进制的。

控制SEG0 地址码就是0(十进制)

A5A4A3A2A1A0
000000

控制SEG2 地址码就是2(十进制),二进制0b10

A5A4A3A2A1A0
000010

控制代码:
由于HT1621需要纳秒级延时,先用定时器写一个纳秒级的延时函数。设置定时器2为1ns触发一次。

void HAL_Delay_us(uint16_t us)
{
    uint16_t differ=0xffff-us-5;
    HAL_TIM_Base_Start(&htim2);
    __HAL_TIM_SetCounter(&htim2,differ);
    while(differ < 0xffff-5)
    {
        differ = __HAL_TIM_GetCounter(&htim2);
    }
    HAL_TIM_Base_Stop(&htim2);
}

纳秒级延时完成。

先设置引脚。MCU要控制的是WR,DA,CS三个引脚。用户自己选择自己板子的引脚设置

#define RESET_WR();		 HAL_GPIO_WritePin(GPIOX, GPIO_PIN_x, GPIO_PIN_RESET);
#define SET_WR();		 HAL_GPIO_WritePin(GPIOX, GPIO_PIN_x, GPIO_PIN_SET);
#define RESET_DA();		 HAL_GPIO_WritePin(GPIOX, GPIO_PIN_x, GPIO_PIN_RESET);
#define SET_DA();		 HAL_GPIO_WritePin(GPIOX, GPIO_PIN_x, GPIO_PIN_SET);
#define RESET_CS();		 HAL_GPIO_WritePin(GPIOX, GPIO_PIN_x, GPIO_PIN_RESET);
#define SET_CS();		 HAL_GPIO_WritePin(GPIOX, GPIO_PIN_x, GPIO_PIN_SET);

向HT1621发送字节的函数。sdat是具体数据,cnt是要发送的个数(单位是二进制)。

void HT1621_SendBit(uint8_t sdat,uint8_t cnt)
{
		uint8_t i=0;
		for(i=0;i<cnt;i++)
		{
				RESET_WR();
				HAL_Delay_us(20);
				if(sdat&0x80)
				{
						SET_DA(); 
				}
				else
				{
						RESET_DA();
				}
				HAL_Delay_us(20);
				SET_WR();
				HAL_Delay_us(20);
				sdat<<=1;
		}
}

发送命令函数,0x80是0b10000000,100是HT1621的命令指令,command就是要控制的指令,如打开时钟等。此函数一般在液晶初始化设置模式时使用。

void HT1621_SendCmd(uint8_t command)
{
		RESET_CS();
		HT1621_SendBit(0x80,4);
		HT1621_SendBit(command,8);
		SET_CS();
}

发送数据函数,addr是地址(也就是上面说的SEG的引脚序号),左移2位是因为地址时六位,而uint8_t型是八位,前面空了两位。sdat是数据(就是四个COM口)。如果是向连续地址写,比如数码管,则可以使用发送8位数据的(注释部分)。

void HT1621_WriteData(uint8_t addr,uint8_t sdat)
{
		addr<<=2;
		sdat<<=4;
		RESET_CS();
		HT1621_SendBit(0xa0,3);//1010
		HT1621_SendBit(addr,6);
		HT1621_SendBit(sdat,4);		//一次只发送4位数据,一个地址发送1次,低四位
		//HT1621_SendBit(sdat,8);
		SET_CS();
}

关闭液晶。

#define LCD_OFF		0x04
void LCD_off(void)
{
		HT1621_SendCmd(LCD_OFF);
}

打开液晶

#define LCD_ON		0x06
void LCD_on(void)
{
		HT1621_SendCmd(LCD_ON);
}

清屏函数,SEG是用到了多少个SEG脚。

#define SEG 14
void LCD_Clear(void)
{
		uint8_t i;
		uint8_t addr=0;
		for(i=0;i<SEG;i++)
		{
				HT1621_WriteData(addr,0x00);
				addr++;
		}
}

液晶初始化

#define ComMode		0x52//1/3偏执,4COM口  1000 01010010
#define SYS_EN		0x02
#define RC_OSC		0x30
#define XTAL_OSC	0x28
void HT1621_Init(void)
{
		LCD_off();
		HT1621_SendCmd(SYS_EN);
		HT1621_SendCmd(RC_OSC);//内部时钟
		HT1621_SendCmd(ComMode);
		LCD_on();
}

代码就是这样了。具体使用,就可以照着液晶的引脚,使用HT1621_WriteData函数控制各个部分亮起熄灭。

代码如下
链接:https://pan.baidu.com/s/10Sld5Ynln1dZaH3J8kwulw
提取码:dirj

如果觉得文章有用就点个赞吧!!!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值