汉字显示器.docx

上传人:b****6 文档编号:7973939 上传时间:2023-01-27 格式:DOCX 页数:13 大小:480.62KB
下载 相关 举报
汉字显示器.docx_第1页
第1页 / 共13页
汉字显示器.docx_第2页
第2页 / 共13页
汉字显示器.docx_第3页
第3页 / 共13页
汉字显示器.docx_第4页
第4页 / 共13页
汉字显示器.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

汉字显示器.docx

《汉字显示器.docx》由会员分享,可在线阅读,更多相关《汉字显示器.docx(13页珍藏版)》请在冰豆网上搜索。

汉字显示器.docx

汉字显示器

一.题义分析及解决方案

1.题义需求分析:

(1)设计内容:

该题目要求使用LED8*8显示矩阵设计接口显示汉字。

使用8255把cpu与显示外设LED联系起来。

8*8LED是8列阴极连在一起,8列阳极连在一起的64个二极管矩阵,当阳极为高电平,阴极为低电平时,二极管发光。

通过8255的A口接每一行,低电平有效,b口接每一列,高电平有效。

由于每次只可显示一行,LED矩阵一共要显示8次才可以显示完一个汉字。

则可以取汉字的点阵码。

把二极管看成点,通过发光显示出很多点,由这些点连接起来便可以组成一个汉字。

根据人肉眼所具有的暂留效应,保证二极管的闪烁频率足够高,达到人肉眼无法辨别的程度(人眼分辨时间的能力是25毫秒),即使8行显示的时间小于25毫秒,则人眼会认为这是一个汉字而不是单独的8行。

(2)内容分析:

当某一个二极管阳极为高电平,阴极为低电平的时候,此时二极管发光。

8*8矩阵是有8行8列组成的,分别与A口和B口、c口相连,于是一次可以是一行或是一列同时有效。

每一次只可显示一行,8*8矩阵一共要显示8次才可以显示完一次。

汉字是有笔画组成的,而笔画可以看成是很多点连接起来所组成的,这就给我们提供了方法。

把发光的二极管看成是一个点,由8*8矩阵‘同时’显示,通过发光显示出很多点,由这些点连接起来便可以组成一个汉字。

这里所说的‘同时’是指在人的肉眼看来是这样的,因为某一时刻内只有一行可以发光。

由上可知,只要使b口的8个接线为高电平有效,是a口的其中一个接线为低电平有效,就可以显示8*8矩阵的某一行。

同理,根据以上的原理,分别显示其他的行,一共显示8次。

(3)提出问题:

1、接口问题。

2、选用何种芯片,为何选用该芯片。

3、汉字如何显示4、汉字如何输入。

5、如何设计控制程序

2.解决问题方法及思路

(1)硬件部分

8255是一个多功能,多通道的可编程接口,使用它与8086cpu和LED8*8矩阵相连,实现数据的输出。

其中8255的a口与8*8矩阵的八行相连,低电平有效,8255的b口与8*8矩阵的八列相连,低电平有效,通过高低电平决定二极管是否发光。

LED8*8矩阵是由64个发光二极管所组成的,其中每一列共阳极,每一行共阴极,分别与8255A的a口、b口相接,实现数据的输入输出。

8086的引脚具有地址复用的功能,使用74L373实现地址的锁存,使用74L245实现数据的

收发,使用74L138实现地址译码。

74Ls244是一种三态输出的八缓冲器和线驱动器,使用它可以驱动LED8*8矩阵,使它

可以正常的工作。

1>主芯片选择

选择8255作为输入输出设备,它是一个多功能,多通道的可编程接口,通过8255的a口接每一行,低电平有效,b口接每一列,高电平有效。

2>汉字显示方法

汉字是有笔画组成的,而笔画可以看成是很多点连接起来所组成的,这就给我们提

供了方法。

把发光的二极管看成是一个点,由8*8矩阵‘同时’显示,通过发光显示出很多点,由这些点连接起来便可以组成一个汉字。

3>二极管亮灭选择

用0、1编码来表示汉字,通过8255来输入这些编码,用1来表示二极管发光,用0来表示二极管不发光,用这些发光的二极管来显示出汉字。

(2)软件部分

汉字是由笔画组成的,笔画可以看成是由点组成的,由发光二极管的发光代表一个点,通过连线,把每个发光点连起来,从而形成一个汉字。

这样就是说,笔画中的每个点代表一个发光二极管发光,通过行编码,使每一次显示都是显示一行,分8次显示,那么每个汉字都有8个编码,则所要显示的汉字的编码就要通过代码段定义,其中二极管发光,表示为1,二极管不发光,表示为0,通过对代码段的不同定义来显示不同的汉字。

要使人肉眼可以看到所显示的汉字,就要使汉字的显示次数满足一定的条件,也即循环次数要选择好,实验中选择循环显示2秒,为了使字显示不抖动和有较高的亮度,要使用延时程序,实验中采用延时2ms。

要有序的显示每个汉字,且显示中间要延时,首先要把汉字的编码按顺序定义,通过一个固定的寄存器存储汉字编码的有效地址,每一个汉字显示,都是先取汉字的有效地址到寄存器中,然后再对寄存器中的内容进行操作。

要循环显示每一个汉字,可以使用无条件转移指令,是显示可以无限循环。

此实验要求滚动的显示汉字,通过汉字的编码来控制列选码,行选码用二进制编码来

制,这样来控制二极管的发光与否,从而显示不同汉字

3.硬件设计

1.选择芯片8255A

(1)芯片在本设计中的作用

用于连接8086cpu和8*8LED发光二极管矩阵,实现端口数据的输出和控制功能。

(2)芯片的功能分析

8255A是一种通用的可编程的并行I/O接口芯片,可用与连接cpu与外设,实现数据的的输入输出功能,可以对输入/输出的数据进行数据锁存和数据缓冲,有中断请求信号,可以向cpu发出中断请求,能进行单向和双向通信。

8255A有三个8位端口,其中A口具有数据输入锁存和数据输出锁存和缓冲功能,B口具有数据输入缓冲和数据输入/输出锁存/缓冲功能,C口具有数据出入缓冲和数据输出锁存/缓冲功能。

各口中含有控制电路,它还具有读写控制逻辑。

共有三种工作方式,通过初始化控制字的不同设置,决定8255A的工作方式和3个端口所具有的功能。

实验中的初始化控制字是80H,它使用C口的高位和低位作为输入,使用A口和B口都作为输出口,且A口和B口都工作于工作方式0,在该方式下,每一个口都作为基本的输入

/输出口,C口的高4位和低4位以及A口.B口都可以独立地设置为输入/输出口,所以4个口作为输入/输出一共可以有16种组合。

方式0下,cpu可以采用无条件读/写方式与8255A交换数据,C口的二部分如果用作控制可状态口,与外设的控制和状态口相连,cpu可以通过C口的读/写,实现A口与B口的查询方式工作。

其中初始化控制端口的地址为00F3H,A端口的地址为00F0H,B端口的地址为00F1H。

(3)芯片8255A的技术参数

表3-18255a技术参数

参数名称

符号

测试条件

最大

最小

输入低电平电压

Vol

0.8

-0.5V

输入高电平电压

Vih

Vcc

2.0V

输出低电平电压(数据端口)

Vol

Iol=2.5mA

0.45

输出低电平电压(外部端口)

Vol

Iol=1.7mA

0.45

输出高电平电压(数据端口)

Voh

Ioh=-400mA

2.4V

输出高电平电压(外部端口)

Voh

Ioh=-200mA

2.4V

达林顿驱动电流

Idar

Rrxt=750v

-4.0mA

-1.0mA

电源电流

Icc

Vrxt=1.5V

120mA

输入负载电流

Ill

Vin

+10/-10mA

输出浮动电流

Iofl

Vofl

+10/-10mA

参数分析:

达林顿驱动电流最大为4.0mA,LED工作电流为20mA,8255A的工作电流为低时,最大为0.45V,工作电流为高时,最小为2.4V,而LED为5V,因此需要一个驱动器来驱动,使工作电流和电压相匹配。

74Ls244的工作电流高电平为15mA,低电平为24mA,因此,244可以作为驱动器在8255A和LED之间起驱动作用。

2.选择芯片8*8LED矩阵

(1)芯片在本设计中的作用

通过发光二极管的明和暗区分笔画中的点,其中发光表示一个笔画中的点。

通过连续发光和延时来显示汉字和图形等。

(2)芯片的功能分析

 

图3-2LED引脚图

把每一列的阳极连在一起,每一行的阴极连在一起,通过高低电平的有效电平差,确定二极管是否发光,通过64个二极管连续发光,使人眼看起来好象是一起发光来显示汉字和图形。

图3-3逻辑结构图

3.选择芯片74Ls244

(1)芯片在本设计中的作用

用于在8255A和LED8*8矩阵之间起驱动的作用,使其工作在正常的电压电流内。

(2)芯片的功能分析

它主要用于三态输出,作为地址驱动器,时钟驱动器和总线驱动器,定向发送器等。

其真值表如下:

最小

典型

最大

VCC

4.25V

5V

5.25V

高电平输出电流

-15mA

低电平输出电流

24mA

工作温度

0

70

参数分析:

低电平输出电流为24mA,高电平输出电流为-15mA,工作电压典型的为5V,介于8255A和LED8*8矩阵的工作电流和工作电压之间,它可以给LED工作提供足够的电压和电流,使LED可以正常的工作。

图4-3硬件总逻辑图

说明:

8255A口与B口分别与LED的行和列相连,同时使用74LS244作为驱动器,在A口和B口以及LED之间起驱动的作用。

8086的数据和地址线分别与8255的数据线相连,译码器与8255的CS8255片选相连

 

三.控制程序设计

1.控制程序设计思路说明

首先要解决的是汉字的编码问题,汉字是通过发光二极管的发光表示一个点,然后把这些点连接起来就构成了一个汉字,那么我们要解决的是设计汉字的线和点,就是确定我们要显示的汉字对应二极管矩阵的哪些二极管发光,其中编码中的”1”表示的是发光,”0”表示的是不发光.那么就把每一个汉字的编码在一起组成程序的数据段.

要对芯片进行操作之前需要对其控制字和端口,以及工作方式的设定,这是完成正常工作所必须要做的,其中8255A的控制端口地址是00F3H,A端口的地址为00F0H,B端口的地址为00F1H。

设置的工作方式为A口基本输入,B口基本输出,而且A口和B口都是工作与方式0.

对子程序的编写是整个程序的重点,按照要求要使每个汉字显示2秒,就要在子程序最外面使用一个循环,其循环的次数是有循环里面的指令执行的时间决定的,指令越少,循环的次数就越大.汉字的显示是根据动态扫描原理来实现的,把一个汉字的编码分为8*8矩阵,每一时刻只显示一行,一个汉字分八次显示,则从第一行显示,利用循环左移,每循环一次就移动一次,共循环8次,这样就完成了一个汉字的一次显示.但是由于显示的频率太高,人的肉眼更本就看不见,所以一个汉字要重复的显示多次才可以使人的肉眼看到,还要增加延时程序,除了上述的作用外,还具有使汉字之间的显示过度平滑.

2.程序流程图如下

流程图

3.控制程序

.MODELTINY

PCIBAR3EQU1CH;8位I/O空间基地址(它就是实验仪的基地址,也为DMA&32BITRAM板卡上的8237提供基地址)

Vendor_IDEQU10EBH;厂商ID号

Device_IDEQU8376;设备ID号

.STACK100

.DATA

IO_Bit8_BaseAddressDW?

msg0DB'BIOS不支持访问PCI$'

msg1DB'找不到StarPCI9052板卡$'

msg2DB'读8位I/O空间基地址时出错$'

COM_ADDDW00F3H;控制口偏移量

PA_ADDDW00F0H;PA口偏移量

PB_ADDDW00F1H;PB口偏移量

PC_ADDDW00F2H;PC口偏移量

shundb04h,044h,0eeh,024h,024h,024h,34h,024h;计

db08h,01ch,07fh,3eh,1ch,024h,42h,00h;★db00h,042h,0e7h,42h,0e7h,0e7h,0e7h,42h;算

db08h,01ch,07fh,3eh,1ch,024h,42h,00h;★db020h,020h,7eh,02ah,7ah,2ah,02bh,020h;机db08h,01ch,07fh,3eh,1ch,024h,42h,00h;★db08h,0ch,3eh,08h,0eh,02h,0ch,1ch;专

db08h,01ch,07fh,3eh,1ch,024h,42h,00h;★db00h,024h,24h,0a5h,066h,024h,0ffh,00h;业

db08h,01ch,07fh,3eh,1ch,024h,42h,00h;★

db04h,044h,0eeh,024h,024h,024h,34h,024h;计

.CODE

START:

MOVAX,@DATA

MOVDS,AX

NOP

CALLInitPCI

CALLModifyAddress;根据PCI提供的基地址,将偏移地址转化为实地址

START1:

movdx,COM_ADD;控制端口地址

moval,10000000b;初试化8255的A口和B口

outdx,al

loop1:

movdi,offsetshun;汉字代码偏移地址

loop2:

movbh,99h

adddi,7

loop6:

adddi,1

loop3:

subdi,8

movcx,8

moval,11111110b;首行行码

loop4:

movdx,PA_ADD;a口地址

outdx,al

pushax

moval,[di];获得shun表中的数值

movdx,PB_ADD;b口地址

outdx,al;把AL中的值传到DX中

popax

rolal,1

incdi;指向下一行对应的列码

pushcx

movcx,800h;控制每一行的执行时间

loop5:

looploop5

popcx

looploop4;显示8行

decbh

cmpbh,0

jnzloop3;上面的99H是否已经循环完毕

cmpdi,offset[shun+58h];因为表的长度11*8=88即它的长度是58h

jnzloop6;未完继续显示

movdi,offset[shun+1]

jmploop2

InitPCIPROCNEAR

MOVAH,00H

MOVAL,03H

INT10H;清屏

MOVAH,0B1H

MOVAL,01H

INT1AH

CMPAH,0

JZInitPCI2

LEADX,msg0

InitPCI1:

MOVAH,09H

INT21H

JMPExit

InitPCI2:

MOVAH,0B1H

MOVAL,02H

MOVCX,Device_ID

MOVDX,Vendor_ID

MOVdi,0

INT1AH

JNCInitPCI3;是否存在StarPCI9052板卡

LEADX,msg1

JMPInitPCI1

InitPCI3:

MOVDI,PCIBAR3

MOVAH,0B1H

MOVAL,09H

INT1AH;读取该卡PCI9052基地址

JNCInitPCI4

LEADX,msg2

JMPInitPCI1

InitPCI4:

ANDCX,0FFFCH

MOVIO_Bit8_BaseAddress,CX

RET

InitPCIENDP

ModifyAddressPROCNEAR

ADDCOM_ADD,CX

ADDPA_ADD,CX

ADDPB_ADD,CX

ADDPC_ADD,CX

RET

ModifyAddressENDP

Exit:

MOVAH,4CH

INT21H

ENDSTART

四.上机调试过程

(1)硬件调试

8255A是一个可编程的接口,共有三个口,其中A口和B口作为输出数据端口,分别与LED矩阵相连,用于输出汉字的编码,PCI地址数据线通过锁存器和收发器与8255相连,同时通过译码器同8255的片选CS0相连。

调试的时候,由A口在开关处置数,然后观察发光二极管显示的数据是否与所置的数相同,或者是否有数据显示,如果数据显示正确的话,表示所接的硬件连线是正确的,可以正常使用了;否则则需要更换连线和硬件设备,直到能正确显示为止。

对于LED的调试是通过编写简单的显示程序来判断。

引用程序中显示汉字的一部分程序段,通过LED显示,首先确定的是有没有正确显示,其次是汉字显示的方式是否正确,通过对LED的调试,发现要把B口的B0到B7与LED的第七列到第一列相连,才可以使汉字按照书写习惯那样的显示。

(2)软件调试

设计的程序是使用汇编语言编写的,程序写完成后就可以对它进行编译和链接,如果发现有错误,则返回程序中修改,完成后再次编译和链接,就这样周而复始的重复进行,知道没有出现编译错误之后就可以运行了。

运行的时候也有问题出现。

程序的结构有问题,对于寄存器的使用不合法,或者是对于寄存器的重复使用导致数据混乱,循环不能正常的结束等问题。

要解决这些问题就要对汇编用深入的理解,画清楚流程图,使用结构简单的循环,分布编写程序,同时注意对程序的注释可以减少问题。

对于循环,注意结束循环的条件,避免在程序中产生无限循环的情况。

注意一些寄存器的隐含用法要对于控制端口地址的写入,数据的输出,都有特定的寄存器提供使用。

在软件和硬件独自调试后,就要把二者连接起来一起调试,调试正确所得的结果就是程序设计的最终结果了。

由于各个部件都单独调试正常,如果出现的结果和理论的有所不同,那么就要分析是硬件的问题还是软件的问题,并对相应的地方做出改动。

实验中显示的汉字出现过模糊不清的现象,所有的汉字都是这样的显示,通过对硬件和软件的调试,发现是程序延时的问题,导致每个汉字的刷新次数不够多,把程序中的刷新次数设置合理就看到了正确的结果。

对于显示汉字的亮度,速度和闪动问题的解决是通过改变循环次数和延时子程序的延时时间来改变的,延时时间大,亮度就大,一个汉字的显示时间就长,同时汉字与汉字之间的过度就相对平滑。

对于汉字的编码,要使显示看起来是那样的一个汉字,要看的出来是这样一个汉字,这样就要求对汉字的编码要精益求精,务求达到使人一眼就可以识别这个汉字的程度。

(3)调试结果及问题的提出

问题:

显示的字体看不清,还出现很严重的抖动现象。

字体显示的并不是很清晰,只有仔细观看才可以看的见。

循环滚动显示的时候,一个字体会显示二次显示字体的跳度太大不平滑。

程序的代码太繁琐,需要优化处理。

五.设计结果分析及问题讨论

(1)课程设计结果及分析

设计结果:

在LED上循环显示“计☆算☆机☆专☆业”,每个汉字或是图形都显示2秒。

结果分析:

显示汉字和字符,图形等,都是通过循环扫描汉字编码和循环显示实现的。

它们都是由发光二极管发光所表示的点通过连线连接起来的。

每个汉字和图形都有自己对应的编码。

LED每次显示一行,一个汉字或是字符要显示8次才可以显示完毕。

通过对汉字编码的循环调用,以及适当的延时,就出现了以上的设计结果。

显示的时间是有循环显示的次数决定的,显示的清晰度是有延时子程序决定的。

实验中循环显示的次数设置为200次,延时子程序的延时时间为2ms,这样设置就可以使汉字很清晰的显示出来,同时就使得每个汉字的显示时间为2s。

汉字的编码的有效地址是放在寄存器中的,汉字显示程序所需要的数据只要从寄存器中取出即可使用。

由一个汉字的显示转到另一个汉字或图形的显示是通过循环次数来决定的。

(2)问题讨论

解决方法:

最重要的环节是解决一个汉字的显示问题,其次是汉字的编码问题,这个将直接影响实验的结果,对于每个汉字和图形之间的切换也是需要解决的一个问题之一。

汉字显示的问题的重点是解决一个汉字的显示问题,一个汉字显示的问题解决了,那么显示其他汉字就很容易了,其次是汉字的编码问题,这个将直接影响实验的结果。

实验的一开始,出现了很多程序上的问题,解决后才发现显示的字体好象和实际的字体是反过来的,于是就把原来的B端口的线全部反接过来,然后在实验中调试,就得到了正面显示的字体了。

关于代码的优化问题是,采用的是按字符串的形式进行编码,用少许内存空间换取直接进行地址映射,方便每显示一个汉字都要使用取有效地址。

采用指针解决的好处是,如果要增加显示的字体很方便,不需要对代码进行大幅度修改。

·运行中字体的显示很快,而且还有明显的抖动现象?

解决方法:

这一问题的关键是循环显示的次数设定和延时子程序的延时时间,循环次数要设置的适中,太大则显示的时间长,太短则显示太快看不见,同是延时是一个很重要的环节,也是消除抖动的关键,它可以使显示时间长——汉字更清晰,消除抖动,在循环滚动显示中还可使显示的过渡更为平滑。

·如何解决滚动的速度和是否平滑的问题?

解决方法:

当完成基本的实验要求是,就对实验提出了更高的要求,就是循环滚动显示汉字。

一开始也是从一个汉字开始。

这些可以通过改变延时时间和循环滚动显示时间来解决。

多个汉字显示的问题更多,字体之间的衔接问题,程序代码的重用和优化问题。

·改进设想:

原来我的程序当中汉字的显示是一直往上滚动显示的,为了让汉字在LED上显示得更人性化,就是让汉字滚动一边结束后,接下来是往上滚动,然后一边滚动玩后接着再往下滚动,反复的如此循环,达到滚动显示汉字的目的.改进的方法是,在程序中添加了一段和往上滚动大体上相同的代码,只不过设置的起始点和采用递减的方法来实现.在这两端基本相同的代码显示完了之后,我们会看到汉字是经过了往上滚动后再往下滚动的.把循环的最后的语句放在程序的最后,以便跳到程序的开头.实现程序的反复循环.

(3)收获和体会

整个的课程设计最大的体会是在设计过程中我的思考问题、解决问题的能力和动手能力到得到了提高。

设计结束在编写实验报告的过程中有可以锻炼运用办公软件的能力。

在设计的准备阶段,为了得到更多的专业资料,我查看了很多的专业书,甚至是通过网络检索,这在以前是没有过的。

我认为这次课程设计锻炼了我获取知识的能力。

在考虑逻辑图的具体设计方案时几经权衡取舍才定稿,我认为这方面锻炼了我思考问题的能力和知识的应用能力。

在写控制程序时,因为很多指令不熟悉所以要从头看起,对着汇编课本逐条的看,形成思路,画流程图,写程序,编译运行,最终应用。

根据结果忧化再执行。

这不但提高了我汇编语言的水平,还第一次把所写的程序应用到了具体的设计中,并且实现里预期的效果,加深了对汇编语言的理解。

在编写实验报告的过程中,运用了不同的工具,以及其中更多

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1