一般情况下,PC 要与多个单片机 89C51 系统进行主从式通讯,为了区分各单片机系统,可以使 89C51 采用串口工作方式 3,即 11
位异步接收/发送方式,该方式的有效数据为 9 位,其中第 9 位为地址/数据信息的标志位,其作用是使从机据此判断发送的数据是
否为地址,从而实现多机操作。但现在由于采用的是 MSCOMM 控件来实现 PC 机和单片机之间的通讯,这是一种标准的 10 位串口通信
方式,即 8 位标准数据位和该数据的起始位、停止位各 1 位。因此二者格式不相符,故很难利用上述方案。因此可考虑将单片机串口
设为工作方式 1,即改为 10 位异步接收/发送方式来解决,其通讯流程如下:
首先发通信开始标志,接着发送需要操作的单片机系统地址,然后发送显示工作命令字,该命令包括 2 个字节,前一字节用于设
定显示方式和滚动方向,后一字节则用于设定显示速度。再往下是传送显示内容的点阵数据,最后对数据进行校验。该通讯规约非常
简便,能够较好的解决上述问题,从而实现 PC 机与多单片机之间的主从式通讯及对显示的控制。
需要注意的是,当显示内容需要改变时,为了避免在单片机串行中断接收数据时,显示屏出现乱码,应使显示屏暂不显示(处于
“黑屏”状态),直到数据接收完全,串行中断处理结束时再显示。
汉字字模的提取非常关键,本文的字模数据取自 UCDOS 下的字库文件 HZK16。关于这方面的介绍较多,文献
[2]
给出了较为具体
的在 VC 下提取汉字字模的方案,这里不再赘述。对于特殊字符或图形点阵数据的提取,简便的方法可以先做一个 BMP 文件,然后用
一些取模软件(如字模提取 v2.1)来获得。为了显示方便,点阵数据的格式应为 n×(16×8),不足要求的则应以 0 数据补充。
b.动态效果模拟显示
为了方便调节 LED 的显示效果,笔者在 PC 机的控制界面上设计了 LED 显示屏的模拟显示,它同实际的显示效果完全一样。用户
可以设定显示的模式,并调节显示速度,然后在界面上对显示效果进行预览,同时还可以随时修改和设定参数,因而十分方便简捷。
为此,可先在界面上描绘出虚拟的 LED 显示屏,由于实际的显示屏为 160×16 点阵,故须在界面 上设定相同的区域。
实现动态显示效果的方法和以上几种基本类似,这里以滚动显示为例作一说明。对于需要滚动的文字,可以将其设置为位图格式,
暂存于内存中,然后利用 VC 提供的位图拷贝函数 BitBlt 将位图复制到显示位置。对于特殊字符或图形,则可以直接利用 BitBlt 函
数调用到显示位置。然后在类 CLEDDlg 的 OnTimer 函数中调用该函数,以实现文字的滚动显示。另外,也可以通过设定不同的响应时
间间隔来改变文字的滚动速度。
汉字显示屏广泛应用与汽车报站器,广告屏等。本文介绍一种实用的汉字显示屏的制作,考虑到电路元件的易购性,没有使用 8*8 的
点阵发光管模块, 而是直接使用了 256 个高量度发光管,组成了 16 行 16 列的发光点阵。同时为了降低制作难度, 仅作了一个字的
轮流显示,实际使用时可根据这个原理自行扩充显示的字数。
1 汉字显示的原理:
我们以 UCDOS 中文宋体字库为例,每一个字由 16 行 16 列的点阵组成显示。即国标汉字库中的每一个字均由 256 点阵来表示。我们可
以把每一个点理解为一个像素,而把每一个字的字形理解为一幅图像。事实上这个汉字屏不仅可以显示汉字, 也可以显示在 256 像
素 范围内的任何图形。
用 8 位的 AT89C51 单片机控制, 由于单片机的总线为 8 位,一个字需要拆分为 2 个部分。
软件打开后输入汉字,点“检取”,十六进制数据的汉字代码即可自动生成,把我们所需要的竖排数据复制到我们的程序中即可。
我们把行列总线接在单片机的 i0 口,然后把上面分析到的扫描代码送入总线, 就可以得到显示的汉字了。 在这个例子里,由
于一共用到 16 行,16 列, 如果将其全部接入 89c51
单片机, 一共使用 32 条 io 口,这样造成了 io 资源的耗尽,系统也再无扩充的余地。 实际应用中我们使用 4-16 线译码器 74ls154
来完成列方向的显示。 而行方向 16 条线则接在
p0 口和 p2 口。
程序清单:
ORG 00H
LOOP: MOV A,#0FFH ;开机初始化,清除画面
MOV P0,A ;清除 P0 口
ANL P2,#00 ;清除 P2 口
MOV R2,#200
D100MS: MOV R3,#250 ;延时 100 毫秒
DJNZ R3,$
DJNZ R2,D100MS
MOV 20H,#00H ;取码指针的初值