基于ETM8812K4的段码液晶屏万年历的设计

2021-06-17 06:53刘波
电子制作 2021年1期
关键词:数码管液晶屏时钟

刘波

(山东省威海市文登技师学院信息工程系,山东文登,264400)

段码液晶屏几乎可以说随处可见,电子爱好者如果不能开发利用,实在是可惜。笔者手头就有一块液晶屏ETM8812K4-01,从邮购至今也未使用,现在网上可以搜索到该液晶屏的资料,决定试着开发使用。

图1 点亮全部段码的ETM8812K4液晶屏

1 ETM8812K4-01液晶屏简介

把液晶屏ETM8812K4-01的显示面向着自己,引脚在右侧,共16个引脚,右上角为第1脚,右下角为第16脚,对应的引脚及功能如下:

1脚:CS片选;2脚:WR读写;3脚:AO数据,此部分为上半屏的段划屏,采用串行传输方式,可显示一些“8”字和特殊的字符。

4脚: +5V;5脚:GND。

6脚:RS;7脚:R/W;8脚:EN;9-16脚:数据口(相当于LCD1602的D0-D7);6-16脚为LCD1602部分。

两个显示部分由各自的驱动电路驱动,可以单独使用,也可以一起使用,上半屏由合泰HT1621或其兼容芯片驱动,下半屏由HD44780及兼容芯片驱动。LCD1602部分可以显示16个5×7点阵字符,这里重点介绍上半部分。网络上有合泰HT1621的PDF文档,包括时序图、操作方式等,读者可以自行查阅。

要想使用段码屏,必须知道各段的地址和数据,笔者对照该段码屏的全部显示内容,并参考互联网资料,把显示的“8”字与市售数码管的段位定义相同,把该段码屏各地址对应的数据和显示内容归纳了一个表格,见表1。

表1

地址和显示图形 0x1a 0x19|| 第2个“8”地址和显示图形 0x18 0x17<< 第3个“8”地址和显示图形 0x16 0x15>> 第4个“8”地址和显示图形0x13 0x12第5个“8” 一共127个段,0x13地址数据为0x08的段未设置地址和显示图形 0x11 0x10 TOTAL 第6个“8”地址和显示图形 0x0e 0x0d%上部 第7个“8”地址和显示图形 0x0b 0x0a S 第8个“8” “S”位于该字后边地址和显示图形 0x08 0x07:第9个“8” “:”位于该字前边地址和显示图形 0x06 0x05 F 第10个“8”地址和显示图形 0x01 1上部第11个“8” “1”位于该字的左边地址和显示图形 0x03 0x04.第12个“8” “.”位于该字的左边

注意:第11、12个数字“8”高四位和低四位的地址与前10个的排序是不同的。

其它字符的地址和对应的数据:

USB :0x1b ,0x08 CARD :0x1b ,0x04

从左到右的10个方格:

0x14 ,0x08--0x14 ,0x02--0x14 ,0x04-0x0f ,0x08-0x0f ,0x04-0x0c ,0x04---0x0c ,0x02-0x0c ,0x08-0x09 ,0x08-0x09 ,0x04

:0x1b ,0x02 ELAPSED :0x14 ,0x01 REMAIN:0x0c,0x01 AUTO :0x09 ,0x02 CUE: 0x09 ,0x01

第6个“8”子后的冒号 0x0f ,0x02 M: 0x0f ,0x01

SINGLE :0x1e,0x08 CONTINUE: 0x1e,0x04 ROBO:0x1e,0x02 PITCH :0x1e,0x01

PROGRAM :0x1f,0x01 LOOP :0x1f,0x02 REPEAT:0x1f,0x04 1 :0x1f,0x08 ALL:0x13,0x08

“+”自上而下的地址和数据 0x00, 0x08 0x00,0x04 0x00, 0x02

“1” 自上而下的地址和数据 0x01,0x08 0x00, 0x01

2 测试ETM8812K4液晶屏

本以为段码屏的驱动很难,其实并不难,互联网上有HT1621的底层驱动程序,调用“HT1621.h”就可以点亮自己的段码屏了。

// ==Ht1621驱动的液晶屏ETM8812K4-01测试程序main.c====

//本测试程序能够测试HT1621的每一个字段,依次点亮每一个字段

#include “main.h”

//包含51单片机头文件及数据类型声明

#include“HT1621.h”// HT1621的底层驱动程序

void main()

{

unsigned char i,j,t;

Ht1621_Init();// - - 上电初始化LCD

Ht1621_delayms(5000);//- -延时一段时间

while(1){

Ht1621_delayms(2000);//- -延时一段时间

Ht1621WrAllData(0,Ht1621Tab,16);

//- -清除1621寄存器数据,即清屏

for (i=0;i<32;i++)//- -循环点亮LED,共32个地址

{

t=0x01;

for (j=0;j<4;j++)//每个地址有4个段,数据依次为1、2、4、8

{

Ht1621WrOneData(i,t);

t<<=1;//数据左移 1 位

Ht1621_delayms(500);//延时长点,便于准确标记每个段的地址和数据

}

}

}

}

段码屏的每一个地址都有4个段,段值依次为1、2、4、8,向每一个地址依次写段值就可以逐段点亮,有了底层驱动程序,编写逐段点亮的显示程序main.c,编译生成16进制文件下载到单片机中,仔细观察段码屏的每一个段的显示次序,就可以知道该段的地址和数据了。知道这些数据,采用底层驱动程序,向对应的段写数据,可以按要求显示数字或个别特殊字符。

笔者使用Keil uVision4软件编译main.c没有错误后,下载到单片机里,连接好电路实验,结果段码屏显示不正常,见图2。屏上有一部分没有点亮,程序是没有问题的,想到以前碰到液晶屏的导电橡胶接触不良,难道这个也是?于是小心的把金属外框拆下,把电路板和导电橡胶的接触面都擦了一遍,结果还是那样,怀疑玻璃与导电橡胶接触有问题,拆下一看,不得了,液晶玻璃边缘大约1cm长×2mm宽的地方碎了,碎的地方刚好有导电条和导电橡胶接触,玻璃屑还未掉出来,看来是由于外力的撞击,金属框没有缓冲(这也是这种封装的液晶屏的缺点吧),直接导致玻璃碎了,好在只是边沿的导电部分碎了,如果显示面碎了,该液晶屏也只得报废了。

图2 显示不完整的ETM8812K4液晶屏

那能不能用仅有的7个数码管做个时钟呢?答案是肯定的。为了程序的通用性,同时结合附表数据的使用,笔者编写了1位数码管显示数字的各个段码和转为16进制数的函数—INT8U dat_buf(INT8U dat),该函数对ETM8812K4-01液晶屏中第1至第10个数码管是适用的,当要第11和12个数码管显示数字时,要把显示数据的高四位和低四位颠倒一下。当你把某一个“8”字的各段的地址和该段的数据按数码管画出来的话,该函数是不难理解的。如果想显示其它基于“8”字下的字符,还可以在该函数中继续添加相关代码,这是不难的。

既然该液晶屏还有LCD1602的功能,为何不用它来显示日期呢?经测试该屏虽然结构上可以显示1行共16个自定义字符,但在驱动时要分两行写入,每行可以显示8个自定义字符,第一行的起始地址是0x80,第2行的起始地址是0xc0。

3 DS1302的测试

笔者手头有多块DS1302时钟芯片,决定好好利用一下,在调试过程中,不知都怎么折腾的,有的工作时发烫,只得断电,不但显示不正常,还不走时。其中的3块,有的项为0,有的项不为0,但明显的特征是秒为80,可读写,但不走时,还有一块,全部的显示内容都为0,不可以写,也不走时,这几块似乎都坏了,见图3、图4。查网上资料,说这种芯片有国产的,质量比较差,很多人借此机会狠狠地黑了一把国产芯片,还有个问题是该芯片双电源工作时,未切断主电源而拆装纽扣电池,这时极易导致DS1302发烫,甚至损坏。我在调试DS1302时,时钟工作不正常,就曾拆过纽扣电池,应该是这个原因所致。找来旧设备拆下一块好的DS1302,连好电路,经过调试,时钟工作正常。

图3 显示不正常的DS1302时钟

图4 显示不正常的DS1302时钟

网上说DS1302芯片显示小时超过23,分或秒超过59的等等都是坏的。全部显示项为0的那块肯定是报废了,其余3块觉得似乎不大可能报废,能不能改改软件试试。笔者的程序中没有调整秒的这一项,能不能在调整分的时候把秒清零(这样调整时间可以更精准些),或者在此时先判断秒是否超过59,超过则把秒清零。按此想法把程序改了一下,结果那3块DS1302竟然起死回生了,每块实验一个周都没问题。当然若其他项超过正常值,是不是也可以这样做?应该可以,有类似问题的读者朋友不妨可以试一试,说不定你的DS1302也能起死回生了。

4 DS1302万年历可调时钟电路及软件

图5为笔者设计的DS1302万年历可调时钟电路,由于是Proteus仿真电路,只有LCD1602显示部分,而没有HT1621的段码显示部分,整个电路采用单面万能板制作,见图6~图8,还未来得及为这个时钟做一个漂亮的外壳。P0口的低3位作LCD1602的控制端,高4位作LCD1602的数据口。P2口的高3位作HT1621显示的接口,低3位作DS1302时钟芯片的控制。为了减小DS1302的功耗,其主电源VCC2端串有390Ω电阻,这里没有采用集成的4输入端的入门电路,而采用4只二极管构成的4输入端的入门电路,任何一个按键按下都能触发外部中断0,各按键下端都接地,上端分别接P3口的高四位。LCD1602显示年月天星期和调整项,正常工作时调整项Adjust_Index为-1,实际显示“/”,调整年显示6,调整月显示4,调整天显示3,调整小时显示2,调整分钟显示1。由于LCD1602能直接显示ASCII码,所以不用编写复杂的数据表。HT1621驱动的段码液晶屏使用前6个8字显示时分秒,时分是大字,秒是小字,这样看起来效果也是不错的。

图5 DS1302万年历可调时钟电路

图6 覆铜板的铜箔面

软件包含7部分:HT1621.h、DS1302.h、DS1302.c、LCD1602_4bit.h、LCD1602_4bit.c、main.h、 main.c,详细源代码见压缩包,图9为main.c文件流程图。

主程序的无限循环部分,不断读取DS1302的数据,如果达到闹铃时间则闹铃响。定时器0中断一次需50ms,每隔200ms LCD1602和段码屏作轮流显示。外部中断0作按键的处理工作。程序中注释详细,这里不再赘述。

笔者用keil uvision4编译时会出现 警 告:“WARNING L15: MULTIPLE CALL TO SEGMENT(意思是发生了重入)”。原来是液晶屏的两个显示函数同时被中断函数和主函数调用,这样有可能引起程序冲突,而出现重复调用的警告,笔者开始忽略了这个问题,定时器初始化后立即开启中断,然后主程序调用LCD1602和HT1621的显示函数,中断函数仍然调用这两个显示函数,这样主程序调用的显示函数未执行完,定时器中断调用的显示函数也发生了,从而使子函数调用发生冲突,所以导致调试不正常,因此就乱怀疑,导致DS1302损坏。最后,笔者把代码改了,主程序的初始化部分在开启中断前调用显示函数,LCD1602显示“年、月、W、:”,而段码屏则完成清屏动作,并且要延时2秒,确保液晶屏的显示完成,再开启中断,让LCD1602和HT1621分时显示,这样尽管出现了L15的警告代码,但实际上是不会出现冲突的,可以忽略这个警告,调试成功。

图7 覆铜板的元件面

图8 正常工作中的DS1302时钟

图9 main.c流程图

5 总结

(1)线路板的设计规划、甚至焊接技术都有待提高。(2)软件设计还可以优化,闹铃时间的设置能够调节就好了。当然,还可以设置多个闹铃。(3)DS1302运行还是有误差的,如果能在软件上自动修正就好了。(4)调整项在调整时能闪烁就好了。(5)如果能给时钟做个外壳就好了。

猜你喜欢
数码管液晶屏时钟
物理项目教学设计,用单片机控制四位数码管显示
蓝桥杯树莓派模拟题解析三:“电子测距仪”
Arduino编程
MC9S08FL16单片机数码管静态显示分析
这个时钟一根针
基于FPGA的车内环境监测系统设计
一种消除液晶屏高温MURA的工艺研究
基于单片机的点餐系统硬件设计
有趣的时钟
基于机器视觉的液晶屏字符缺陷检测系统设计