液晶显示定时器有点像小时侯戴过的多功能电子表的桌面版,功能减少了跑表、日历星期显示,但增加了倒计时、多组闹铃等功能。像下图这样的在电商活动的时候十块钱内就能买到。

不过实物没有宝贝页面上的那么好看,外观细节还有差别。有的情况是拍照效果的问题,有的是因为宣传使用不是照片而是电脑制作的效果图。不到十元的东西预期不能太高,关键在于液晶显示的效果。我买过不少定时器了,深知这个不见实物不知底细的。


在极端的角度,就可能是下面这种完全不能看的效果。戴过电子表的同学应该有经验,这种液晶的视角范围有限度的。

主要是看它用的屏的最佳视角方向是哪个了,我觉得这款立在桌面用还行(带一点俯视角度),如果是挂墙上仰视,效果要差不少。

能立起来放是因为背后它带有一个折叠的小支撑,这个设计还不错。也还粘了一块软的磁性材料,可以吸附在实验室的铁板、铁架子上。最上面还可以用挂钩钩住。

打开电池盖,可以看到电池正负极的钢片是焊接在PCB上的。外壳是螺丝固定,拆掉螺丝后发现并没有卡扣,可以轻松分离。

这拆解完全没有难度。PCB暴露出来了:
什么,竟然是沉金工艺的FR4双面板!
竟然是LQFP封装的芯片!
竟然是STM32!

PCB另一面,连接液晶的导电橡胶条的触点,以及按键的触点都是沉金的,所以有良好的接触。

再仔细看看芯片,STM32L053R8T6. 周围还留出了好几个测试焊盘,还有SWD调试接口的标志。
难道这是个工程样机流出来了?

请EEWorld论坛@xutong帮忙分析一下BOM成本。这种液晶只要量大了成本很低,但MCU可是实打实的。

在这样的定时器上用LQFP封装的MCU,真是用料十足了!
最后有个细节,看这个STM32封装表面那两个凹的圆,里面是不光滑的。我印象中ST的片子,圆圈里面至少比较平整。

所以,为了降成本,它用的是拆机翻新的芯片?

xutong帮忙分析的BOM成本表
“拆解一个用料十足的多功能定时器”之前传
我在去年淘宝618活动的时候买了一个多功能定时器:

上图是宝贝页面的照片,比实物要漂亮。但是包装就很简陋了,就一小纸盒,小商品市场的风格。毕竟卖得便宜呢,还包邮了。

当我装上电池看显示效果的时候,意外发现它的显示在一通电时有,然后竟然渐渐消失!

试几下都有问题,先怀疑是里面液晶接触不良了,那就拆开处理一下。
开后盖卸下电池

卸掉几颗自攻螺丝之后壳子就分开了。
电路板是这种价位东西常见的电木板,还是单面设计。

PCB的元件面:COB封的专用ASIC芯片

其实原版的拆解现场是如上这样的,就是廉价货。
我用示波器查看了液晶的驱动波形,在刚通电的时候是正常的,但不久就消失了。我诊断结论是:芯片损坏。于是录了视频和卖家沟通,这个订单退款了,货不用退。
那么这个定时器尸体在我手上做什么用途呢?模具还挺好的,为了物尽其用,我就复刻一个吧。于是,过了很久,你们看到了我上面的帖子“拆解一个用料十足的多功能定时器”。我故意开了这样一个玩笑,先不提“用料十足的定时器”并不是原版,而是我的复刻版。
于是就有了 STM32L053 出场。能支持这种段码LCD的MCU并不是很普遍,在ST的产品里面只有 STM8L, STM32L 系列的某些型号。注意,LCD是交流驱动,不是方波驱动,因此不能用MCU的GPIO直接驱动,必须有控制器。STM32L053算是STM32中带LCD驱动的价钱最低的。我最早用过STM8L152,后来发现淘宝出现了很便宜的STM32L053就买了几片,再后来恍然明白便宜的原因是——翻新货。不过自己玩的,买了就算了。

ST MCU里的LCD控制器支持最多8个COM端,32个SEG端。像这种定时器LCD大概率是4个COM端的(1/4 duty). MCU里面有电荷泵来产生驱动电压,软件可调节,也就能控制对比度。不过最高驱动电压也有限制,不是能适配任何LCD的。
LCD直接接在GPIO上,引脚配置为LCD SEG或COM功能。另外要使用LSE,接32.768kHz的晶振做时间基准。
画原理图的时候要先确认LCD的电极中COMx的位置(余下的就是SEGx端),因为COM和SEG相当于行和列扫描线(打比方,这种LCD不是点阵的不存在行列说)是不可交换的。我是通过示波器测电路板驱动端的波形判断的,一共有4个公共端,排在一头。


复刻的关键在于测绘原来的PCB上的定位孔,和需要定位的元件的位置。最重要的LCD的电极的位置不能偏。我是用游标卡尺+直尺来量的,效率比较低;我还从来没有试过拍照法。

用某创的沉金工艺免费打样券,和我的其它电路一起拼着打了一块PCB.
打样回来,先检查对位,没问题了再焊接。

剩下就是焊接和软件的工作了。因为软件是自己做,功能也就可以自由发挥了。
首先需要测试LCD功能,确定每个驱动线组合COMx SEGy对应的LCD笔段是什么。对于STM32这个控制器,核心的配置寄存器是FCR和CR,它们决定了怎样驱动:

而点亮(显示)哪些笔段,由4个LCD RAM寄存器决定,每个寄存器对应一个COM端的扫描,bit[n]表示SEGn的笔段。用起来还是很简单的。

我做了一个通用的测试程序:
int main(void){ int segsel, comsel; int show;gpio_config();RCC->APB1ENR |= RCC_APB1ENR_PWREN; __DSB(); PWR->CR |= PWR_CR_DBP; __DSB(); RCC->CSR |= RCC_CSR_RTCSEL_1|RCC_CSR_LSION;RCC->APB1ENR |= RCC_APB1ENR_LCDEN;uart_setup(); uart_wstr("\r\nLCD test");LCD->FCR = 3<<LCD_FCR_PS_Pos|15<<LCD_FCR_DIV_Pos|7<<LCD_FCR_CC_Pos|4<<LCD_FCR_PON_Pos;//|LCD_FCR_HD; LCD->CR = LCD_CR_DUTY_1|LCD_CR_DUTY_0|LCD_CR_BIAS_0|LCD_CR_LCDEN; // 1/4 duty, 1/2 biasLCD->RAM[0]=0; LCD->RAM[2]=0; LCD->RAM[4]=0; LCD->RAM[6]=0; LCD->SR = LCD_SR_UDR; // updateRCC->APB1ENR |= RCC_APB1ENR_TIM6EN; TIM6->PSC = 999; // prescaler TIM6->ARR = 999; // auto reload value TIM6->CR1 = TIM_CR1_URS|TIM_CR1_CEN; // start countercomsel=0; segsel=0; while(1) { if(TIM6->SR & TIM_SR_UIF) // check if overflow { TIM6->SR &= ~TIM_SR_UIF; // clear flag if(segsel<0 || segsel>13) { segsel=0; show=0; } show |= 1<<segsel;LCD->RAM[0]=show; LCD->RAM[2]=show; LCD->RAM[4]=show; LCD->RAM[6]=show; LCD->SR = LCD_SR_UDR; // update segsel++; } }}
当然这还不能区分每个COMx对应哪些,还需要换种切换方式才能判断完整。
测试的时候在草稿纸上记录下映射关系(这法比较原始):发现了5个8字的笔段映射是很有规律的。

确定完了就可以开发时钟程序了。这种任务的确是8位MCU搞定都很轻松的。
资源推荐
精彩文章推荐
· END ·
请将我们设为“星标”,这样就会第一时间收到推送消息。
欢迎关注EEWorld旗下订阅号:“机器人开发圈”