段码LCD研究 | 用HT1621B/STC8H4K64TLCD驱动段码LCD屏


【本文发布地址https://blog.csdn.net/Stack_/article/details/117532877,未经许可不得转载,转载须注明出处】


一、探索

这是一个从乐心血压计上拆下来的屏幕,有40个引脚,其中1和40、2和39、3和38、4和37在PCB上是连起来的,所以实际上是36个引脚。

在其引脚上加电压,得到的不是数码管的效果。
在这里插入图片描述

COM和COM之间加电压


在这里插入图片描述

COM和SEG之间加电压


查询了一番之后方得知这种屏是段码屏,引脚上有小黑点的是COM口,其它是SEG口。看这块屏上有5个脚上有黑点,但实测其中一个有黑点的是SEG脚。

所以基本可以确定这块屏是4COM * 32SEG的屏。

用数码管的思维驱动是没法驱动的,因为在任意两点加电压都会同时亮起至少4处

网上都说MCU驱动可以是可以,但会很复杂,而且效果不好,会有类似数码管的鬼影出现。

而且网上对控制原理的描述太少,不知道如何使其只亮起某一段,所以选择使用专用的驱动芯片 — HT1621B, tb上才9毛钱一块,因为是当玩具来玩,怎么简单怎么来,何必为难自己。



二、电路设计

在这里插入图片描述
在这里插入图片描述



三、焊接调试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述



四、程序(附件提供)

在这里插入图片描述
在这里插入图片描述


写命令时,数据格式为ID + 命令(b100 + 9bit命令。命令最低位任意);
写数据时,数据格式为ID + 地址 + 数据(b101 + 6bit地址 + 4bit数据)。在这里要注意地址为高位在前,数据为低位在前。

底层驱动

@ CSDN Tyrion.Mon
/*
所有字节只有低四位有效
array_RAM[0] :
			bit3-bit0: SEG0 - D3:D0
array_RAM[1] :
			bit3-bit0: SEG1 - D3:D0
array_RAM[2] :
			bit3-bit0: SEG2 - D3:D0
.......
*/
uint8_t array_RAM[32] =
{
	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
/**
  * @brief  将N个bit命令发送给HT1621B
  * @note
  * @param
  * @retval None
  * @author PWH @ CSDN Tyrion.Mon
  * @date   2021/6
  */
static void ht1621b_write_command_bits(uint8_t command, uint8_t num_of_bits)
{
	int8_t i;
	for (i = 0; i < num_of_bits; i++)
	{
		GPIO_WriteLow(HT1621B_WR_GPIO, HT1621B_WR_PIN);
		if (command & 0x80)
		{
			GPIO_WriteHigh(HT1621B_DATA_GPIO, HT1621B_DATA_PIN);
		}
		else
		{
			GPIO_WriteLow(HT1621B_DATA_GPIO, HT1621B_DATA_PIN);
		}
		GPIO_WriteHigh(HT1621B_WR_GPIO, HT1621B_WR_PIN);

		command <<= 1;
	}
}

/**
  * @brief  将N个bit数据发送给HT1621B
  * @note
  * @param
  * @retval None
  * @author PWH @ CSDN Tyrion.Mon
  * @date   2021/6
  */
static void ht1621b_write_data_bits(uint8_t data, uint8_t num_of_bits)
{
	int8_t i;
	for (i = 0; i < num_of_bits; i++)
	{
		GPIO_WriteLow(HT1621B_WR_GPIO, HT1621B_WR_PIN);
		if (data & 0x01)
		{
			GPIO_WriteHigh(HT1621B_DATA_GPIO, HT1621B_DATA_PIN);
		}
		else
		{
			GPIO_WriteLow(HT1621B_DATA_GPIO, HT1621B_DATA_PIN);
		}
		GPIO_WriteHigh(HT1621B_WR_GPIO, HT1621B_WR_PIN);

		data >>= 1;
	}
}

/**
  * @brief  向HT1621B发送一个命令
  * @note
  * @param
  * @retval None
  * @author PWH @ CSDN Tyrion.Mon
  * @date   2021/6
  */
static void ht1621b_write_one_command(uint8_t command)
{
	GPIO_WriteLow(HT1621B_CS_GPIO, HT1621B_CS_PIN);

	ht1621b_write_command_bits(0x80, 3);	//发送标识码 100
	ht1621b_write_command_bits(command, 9);	//发送9位命令,前8位为命令,最后1位任意

	GPIO_WriteHigh(HT1621B_CS_GPIO, HT1621B_CS_PIN);
}

/**
  * @brief  将一个数据写入HT1621B某一个地址
  * @note
  * @param
  * @retval None
  * @author PWH @ CSDN Tyrion.Mon
  * @date   2021/6
  */
static void ht1621b_write_one_addr_data(uint8_t address, uint8_t data)
{
	GPIO_WriteLow(HT1621B_CS_GPIO, HT1621B_CS_PIN);

	ht1621b_write_command_bits(0xA0, 3);			//发送标识码 101
	ht1621b_write_command_bits(address << 2, 6);	//发送6位地址
	ht1621b_write_data_bits(data, 4);

	GPIO_WriteHigh(HT1621B_CS_GPIO, HT1621B_CS_PIN);
}

/**
  * @brief  连续写入多个数据到HT1621B
  * @note
  * @param
  * @retval None
  * @author PWH @ CSDN Tyrion.Mon
  * @date   2021/6
  */
static void ht1621b_write_N_addr_data(uint8_t address, uint8_t *array, uint8_t len)
{
	uint8_t i;

	GPIO_WriteLow(HT1621B_CS_GPIO, HT1621B_CS_PIN);

	ht1621b_write_command_bits(0xA0, 3);			//发送标识码 101
	ht1621b_write_command_bits(address << 2, 6);	//发送6位地址
	for (i = 0; i < len; i++)
	{
		ht1621b_write_data_bits(*array++, 4);
	}

	GPIO_WriteHigh(HT1621B_CS_GPIO, HT1621B_CS_PIN);
}

/**
* @brief
  * @note
  * @param
  * @retval None
  * @author PWH @ CSDN Tyrion.Mon
  * @date   2021/6
  */
void ht1621b_init(void)
{
	GPIO_Init(HT1621B_DATA_GPIO, HT1621B_DATA_PIN, GPIO_MODE_OUT_PP_HIGH_FAST);
	GPIO_Init(HT1621B_WR_GPIO, HT1621B_WR_PIN, GPIO_MODE_OUT_PP_HIGH_FAST);
	GPIO_Init(HT1621B_CS_GPIO, HT1621B_CS_PIN, GPIO_MODE_OUT_PP_HIGH_FAST);
	GPIO_Init(HT1621B_RD_GPIO, HT1621B_RD_PIN, GPIO_MODE_IN_PU_NO_IT);

	ht1621b_write_one_command(0x29);	//1/3 bias,4commons
	ht1621b_write_one_command(0x01);	//SYS EN
	ht1621b_write_one_command(0x03);	//LCD ON
}

/**
  * @brief  将缓冲区的数据写入HT1621B,在while中不断循环
  * @note
  * @param
  * @retval None
  * @author PWH @ CSDN Tyrion.Mon
  * @date   2021/6
  */
void ht1621b_scan(void)
{
	ht1621b_write_N_addr_data(0, array_RAM, 32);
}


因为不知道屏引脚对应的段,所以需要用程序测出对应关系(附件有测试demo),得

在这里插入图片描述

/*
	bit7 - bit0: f g e d    a b c x (x为任意,这里强制为0)
*/
const uint8_t array_num[11] =
{
//   0      1    2     3     4     5     6     7     8     9     NULL
	0xbe, 0x06, 0x7c, 0x5e, 0xc6, 0xda, 0xfa, 0x0e, 0xfe, 0xde, 0x00
};

const uint8_t array_char[2] =
{
//   A      P
	0xee, 0xec
};

驱动程序

/**
  * @brief  6个大数字
  * @note
  * @param
  * @retval None
  * @author PWH @ CSDN Tyrion.Mon
  * @date   2021/6
  */
void ht1621b_display_big_8(uint8_t which, uint8_t num)
{
	if (num > 10) return;
	switch(which)
	{
	case big_num_1:
		array_RAM[6] = array_num[num] >> 4;	//只有低四位有效,数字的f g e d
		array_RAM[5] &= 0x01;	//清零a b c 的位置
		array_RAM[5] |=  array_num[num];	//数字的a b c
	break;
	case big_num_2:
		array_RAM[4] = array_num[num] >> 4;
		array_RAM[3] &= 0x01;
		array_RAM[3] |=  array_num[num];
	break;
	case big_num_3:
		array_RAM[2] = array_num[num] >> 4;
		array_RAM[1] &= 0x01;
		array_RAM[1] |=  array_num[num];
	break;
	case big_num_4:
		array_RAM[0] = array_num[num] >> 4;
		array_RAM[8] &= 0x01;
		array_RAM[8] |=  array_num[num];
	break;
	case big_num_5:
		array_RAM[9] = array_num[num] >> 4;
		array_RAM[10] &= 0x01;
		array_RAM[10] |=  array_num[num];
	break;
	case big_num_6:
		array_RAM[11] = array_num[num] >> 4;
		array_RAM[12] &= 0x01;
		array_RAM[12] |=  array_num[num];
	break;
	}
}

/**
  * @brief	蓝牙
  * @note
  * @param
  * @retval None
  * @author PWH  @ CSDN Tyrion.Mon
  * @date   2021/6
  */
void ht1621b_display_bluetooth(uint8_t sta)
{
	array_RAM[27] &= ~0x01;	

	if (sta)
	{
		array_RAM[27] |= 0x01;
	}
}


附、测试代码




【驱动代码下载】




该附件代码还包含另一款段码屏的驱动,(STM8+HT1621B驱动 以及 STC8H4K64TLCD直驱)。

同时提供了测试出段码屏真值表的方法




在这里插入图片描述

在这里插入图片描述

STC8 / HT1621B 与屏的接线



在这里插入图片描述

STC8 测试COM SEG与笔段的关系
给STC8烧录串口发送字符 N ,切换下一个COM SEG显示,每次只显示1个段,记录下该COMxSEGx对应的段



在这里插入图片描述

HT1621B 测试COM SEG与笔段的关系
STM8进入调试模式,Live Watch窗口更改COMx和SEGx的值,切换下一个COM SEG显示,每次只显示1个段,记录下该COMxSEGx对应的段



在这里插入图片描述

### 回答1: PSPICE 17.2 是一种用于电子电路仿真和分析的软件工具。下面是一份简单的 PSpice 17.2 使用初级教程: 1. 安装和启动:首先,你需要下载并安装 PSpice 17.2 软件。安装完成后,双击图标启动软件。 2. 创建电路:在软件界面上,选择“文件”>“新建”,然后在电路编辑器中创建你的电路。你可以从元件库中选择组件,并将其拖放到画布上。连接元件的引脚以构建电路。 3. 设置元件参数:双击元件以打开元件参数设置对话框。在对话框中,设置元件的值、名称和其他参数。对于电阻、电容等基本元件,可以直接输入数值。 4. 设置仿真配置:选择“仿真”>“设置和校验”,然后在仿真设置对话框中选择仿真的类型和参数。你可以选择直流分析、交流分析、暂态分析等。设置仿真参数后,点击“确定”。 5. 运行仿真:选择“仿真”>“运行”来启动仿真。在仿真过程中,软件将模拟电路的响应,并将结果输出到仿真波形窗口中。 6. 查看仿真结果:在仿真波形窗口中,你可以查看各个元件的电流、电压等参数随时间变化的波形。你还可以对波形进行放大、缩小、平移等操作,以更详细地分析电路的性能。 7. 保存和导出结果:在仿真过程中,你可以选择将结果保存为文件或导出为其他格式,如图像文件或数据文件。 以上是 PSpice 17.2 使用初级教程的基本步骤。随着实践的深入,你可以进一步了解复杂电路的建模和分析方法,并尝试更高级的功能和技术。 ### 回答2: PSPICE 17.2是一款电子电路仿真软件,用于对电路进行分析和验证。以下是PSPICE 17.2的使用初级教程: 1. 下载和安装:在官方网站上下载PSPICE 17.2并进行安装。 2. 组件库:打开PSPICE软件后,点击“Capture CIS”图标,进入组件库界面。选择适当的电子元件,如电阻、电容、二极管等,将它们拖放到画布上。 3. 电路连接:在画布上拖放所需元件后,使用导线工具连接它们。点击导线图标,选择合适的连接方式,并将其拖动到适当的端口上。 4. 参数设定:双击元件,弹出元件属性对话框。在这里设置元件的数值,例如电阻的阻值、电容的电容值等。 5. 电源设置:在画布上点击右键,选择“Power Sources”,然后选择适当的电源,如直流电源或交流电源。设置电源的电压或电流数值。 6. 仿真设置:点击画布上方的“PSpice”选项,选择“Edit Simulation Profile”打开仿真配置对话框。在仿真配置中,设置仿真参数,如仿真类型(直流、交流、脉冲等)、仿真时间等。 7. 仿真运行:在仿真配置对话框中点击“Run”按钮,开始进行电路仿真运行。仿真完成后,可以查看并分析仿真结果,如电流、电压、功率等。 8. 结果分析:通过菜单栏中的“PSpice>Probe”选项,打开特定信号的仿真结果。通过选择信号节点,可以显示该信号的波形、幅值和频谱等信息。 9. 数据输出:仿真结束后,可以通过“PSpice>Results”菜单栏选项,导出仿真结果到文本文件,以供后续分析。 10. 误差调整:如果仿真结果与预期不符,可以检查电路连接、元件参数等以找出问题。根据需要进行调整,重新运行仿真以验证改进效果。 以上就是PSPICE 17.2使用初级教程的简要介绍。在使用过程中,请参考软件的帮助文件和官方文档,以获取更详细的指导和解决方法。任何新的软件都需要不断的实践和尝试,希望这个教程能对你有所帮助。 ### 回答3: PSPICE 17.2是一款常用的电路仿真软件,用于电路设计和分析。下面是一个简要的PSPICE 17.2的初级教程: 1. 下载和安装:首先,从官方网站下载PSPICE 17.2,并按照安装向导进行安装。安装完成后,打开软件。 2. 创建新工程:在PSPICE 主界面上,点击“File”菜单,然后选择“New Project”来创建一个新的工程。给工程起一个适当的名字,并选择工程的存储位置。 3. 添加电路元件:在工程界面上,点击“Place”图标,然后选择不同的元件来构建你的电路。你可以从库中选择各种电子元件,如电阻、电容、电感等,并将它们拖放到工程界面上。 4. 连接元件:选择“Wire”图标,然后点击元件的引脚来连接它们。确保连接顺序正确,以保证电路的正确性。 5. 设置元件参数:对于每个添加的元件,你需要设置它们的参数。右键点击元件,选择“Edit Propertiess”,然后在弹出的窗口中输入适当的参数值。 6. 添加电源:在电路中添加电源,以提供电路所需的电能。选择“Place”图标,然后选择合适的电源元件并将其拖放到电路中。同样,设置电源的参数值。 7. 设置仿真配置:在工程界面上,点击“PSpice”菜单,然后选择“Edit Simulation Profile”来设置仿真配置参数。你可以选择仿真类型、仿真时间和仿真步长等。 8. 运行仿真:点击“PSpice”菜单,选择“Run”来运行仿真。PSPICE将自动运行仿真并显示结果。 9. 分析和优化:根据仿真结果,可以分析和优化电路的性能。你可以观察电流、电压和功率等参数,以评估电路的性能,并根据需要进行调整。 10. 保存和导出结果:在分析和优化完成后,可以保存你的工程并导出结果。点击“File”菜单,选择“Save Project”来保存工程,然后选择“Outut”菜单,选择“Export”来导出结果。 以上是PSPICE 17.2的初级教程的简要介绍。通过以上步骤,你可以开始使用PSPICE 17.2进行电路设计和仿真。在实践中不断探索和学习,你将成为一个熟练的PSPICE用户。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值