可编程字符显示器.docx
- 文档编号:10952456
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:18
- 大小:297.72KB
可编程字符显示器.docx
《可编程字符显示器.docx》由会员分享,可在线阅读,更多相关《可编程字符显示器.docx(18页珍藏版)》请在冰点文库上搜索。
可编程字符显示器
1.引言
随着人们生活水平的不断提高和电子科技的飞速发展,特别是近年来物质生活水平的提高对信息接受速度也有了很大要求。
而字符显示器就能够满足这些需求。
如列车次数与时刻表显示屏,商品广告宣传显示屏,舞台彩灯图案的显示等等,都是将显示的内容预先编程,再由控制电路或者计算机使要显示的内容按照一定的规律显示出来。
2.系统整体框图
3.字符显示的原理
3.1字符显示概述
我们以UCDOS中文宋体字库为例,每一个字由16行16列的点阵组成显示。
即国标汉字库中的每一个字均由256点阵来表示。
我们可以把每一个点理解为一个像素,而把每一个字的字形理解为一幅图像。
事实上这个汉字屏不仅可以显示汉字, 也可以显示在256像素范围内的任何图形。
3.2字符显示图例
3.3字符显示扫描原理
显示汉字“大”为例,来说明其扫描原理:
在UCDOS中文宋体字库中,每一个字由16行16列的点阵组成显示。
如果用8位的AT89C51单片机控制,由于单片机的总线为8位,一个字需要拆分为2个部分。
一般我们把它拆分为上部和下部,上部由8*16点阵组成,下部也由8*16点阵组成。
在本例中单片机首先显示的是左上角的第一列的上半部分,即第0列的p00---p07口。
方向为p00到p07 ,显示汉字“大”时,p05点亮,由上往下排列,为p0.0灭,p0.1灭,p0.2灭,p0.3灭,p0.4灭,p0.5亮,p0.6灭,p0.7灭。
即二进制00000100,转换为16进制为 04h.。
上半部第一列完成后,继续扫描下半部的第一列,为了接线的方便,我们仍设计成由上往下扫描,即从p27向p20方向扫描,从上图可以看到,这一列全部为不亮,即为00000000,16进制则为00h。
然后单片机转向上半部第二列,仍为p05点亮,为00000100,即16进制04h.
这一列完成后继续进行下半部分的扫描,p21点亮,为二进制00000010,即16进制02h.依照这个方法,继续进行下面的扫描,一共扫描32个8位,可以得出汉字“大”的扫描代码为:
04H,00H,04H,02H,04H,02H,04H,04H
04H,08H,04H,30H,05H,0CH,0FH,00H
05H,80H,04H,60H,04H,10H,04H,08H
04H,04H,0CH,06H,04H,04H,00H,00H
由这个原理可以看出,无论显示何种字体或图像, 都可以用这个方法来分析出它的扫描代码从而显示在屏幕上。
4.字符显示器电路及程序设计
4.1字符显示器电路概述
我们把行列总线接在单片机的i0口,然后把上面分析到的扫描代码入总线,就可以得到显示的汉字了。
在这个例子里,由于一共用到16行,16列,如果将其全部接入89c51单片机,一共使用32条io口,这样造成了io资源的耗尽,系统也再无扩充的余地。
实际应用中我们使用4-16线译码器74ls154来完成列方向的显示。
而行方向16条线则接在单片机,一共使用32条io口,这样造成了io资源的耗尽,系统也再无扩充的余地。
实际应用中我们使用4-16线译码器74ls154来完成列方向的显示。
而行方向16条线则接在p0口和p2口。
4.2字符显示器电路图及电路元件框图
图4-1字符显示器电路图
表4-1字符显示器元件框图
4.3字符显示器电路程序清单:
用C语言编程的源程序如下:
#include"conio.h"
#include"stdio.h"
#include"reg51.h"
char[32]=[];
P[16]={P00,P01,P02,P03,P04,P05,P06,P07,P27,P26,P25,P24,P23,P22,P21,P20};
intn=0,intj,i;
sbitP1^1=0,P2^2=0,
P1^3=0,P1^4=0;
p[16]={0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0};
//74LS154的十六个输出管脚//
i=(P00)*2^3+(P01)*2^2+(P02)*2^1+(P03)*2^0;
J=(P04)*2^3+(P05)*2^2+(P06)*2^1+(P07)*2^0;
char[0]="ij";//把数组转化成16进制//
I++;J++;
char[1]="ij";//把数组转化成16进制//
i=(P08)*2^3+(P09)*2^2+(P10)*2^1+(P11)*2^0;
J=(P12)*2^3+(P13)*2^2+(P14)*2^1+(P15)*2^0;
sbitP1^1=0,P2^2=0,
P1^3=0,P1^4=1;
intn=1;
p[16]={0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0};
i=(P00)*2^3+(P01)*2^2+(P02)*2^1+(P03)*2^0;
J=(P04)*2^3+(P05)*2^2+(P06)*2^1+(P07)*2^0;
char[2]="ij";//把数组转化成16进制//
I++;J++;
char[3]="ij";//把数组转化成16进制//
i=(P08)*2^3+(P09)*2^2+(P10)*2^1+(P11)*2^0;
J=(P12)*2^3+(P13)*2^2+(P14)*2^1+(P15)*2^0;
sbitP1^1=0,P2^2=0,
P1^3=1,P1^4=0;
intn=2;
p[16]={0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0};
i=(P00)*2^3+(P01)*2^2+(P02)*2^1+(P03)*2^0;
J=(P04)*2^3+(P05)*2^2+(P06)*2^1+(P07)*2^0;
char[4]="ij";//把数组转化成16进制//
I++;J++;
char[5]="ij";//把数组转化成16进制//
i=(P08)*2^3+(P09)*2^2+(P10)*2^1+(P11)*2^0;
J=(P12)*2^3+(P13)*2^2+(P14)*2^1+(P15)*2^0;
sbitP1^1=0,P2^2=0,
P1^3=1,P1^4=1;
intn=3;
p[16]={0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0};
i=(P00)*2^3+(P01)*2^2+(P02)*2^1+(P03)*2^0;
J=(P04)*2^3+(P05)*2^2+(P06)*2^1+(P07)*2^0;
char[6]="ij";//把数组转化成16进制//
I++;J++;
char[7]="ij";//把数组转化成16进制//
i=(P08)*2^3+(P09)*2^2+(P10)*2^1+(P11)*2^0;
J=(P12)*2^3+(P13)*2^2+(P14)*2^1+(P15)*2^0;
sbitP1^1=0,P2^2=1,
P1^3=0,P1^4=0;
intn=4;
p[16]={0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0};
i=(P00)*2^3+(P01)*2^2+(P02)*2^1+(P03)*2^0;
J=(P04)*2^3+(P05)*2^2+(P06)*2^1+(P07)*2^0;
char[8]="ij";//把数组转化成16进制//
I++;J++;
char[9]="ij";//把数组转化成16进制//
i=(P08)*2^3+(P09)*2^2+(P10)*2^1+(P11)*2^0;
J=(P12)*2^3+(P13)*2^2+(P14)*2^1+(P15)*2^0;
sbitP1^1=0,P2^2=1,
P1^3=0,P1^4=1;
intn=5;
p[16]={0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0};
i=(P00)*2^3+(P01)*2^2+(P02)*2^1+(P03)*2^0;
J=(P04)*2^3+(P05)*2^2+(P06)*2^1+(P07)*2^0;
char[10]="ij";//把数组转化成16进制//
I++;J++;
char[11]="ij";//把数组转化成16进制//
i=(P08)*2^3+(P09)*2^2+(P10)*2^1+(P11)*2^0;
J=(P12)*2^3+(P13)*2^2+(P14)*2^1+(P15)*2^0;
sbitP1^1=0,P2^2=1,
P1^3=1,P1^4=0;
intn=6;
p[16]={0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0};
i=(P00)*2^3+(P01)*2^2+(P02)*2^1+(P03)*2^0;
J=(P04)*2^3+(P05)*2^2+(P06)*2^1+(P07)*2^0;
char[12]="ij";//把数组转化成16进制//
I++;J++;
char[13]="ij";//把数组转化成16进制//
i=(P08)*2^3+(P09)*2^2+(P10)*2^1+(P11)*2^0;
J=(P12)*2^3+(P13)*2^2+(P14)*2^1+(P15)*2^0;
sbitP1^1=0,P2^2=1,
P1^3=1,P1^4=1;
intn=7;
p[16]={0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,};
i=(P00)*2^3+(P01)*2^2+(P02)*2^1+(P03)*2^0;
J=(P04)*2^3+(P05)*2^2+(P06)*2^1+(P07)*2^0;
char[14]="ij";//把数组转化成16进制//
I++;J++;
char[15]="ij";//把数组转化成16进制//
i=(P08)*2^3+(P09)*2^2+(P10)*2^1+(P11)*2^0;
J=(P12)*2^3+(P13)*2^2+(P14)*2^1+(P15)*2^0;
sbitP1^1=1,P2^2=0,
P1^3=0,P1^4=0;
intn=8;
p[16]={0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,};
i=(P00)*2^3+(P01)*2^2+(P02)*2^1+(P03)*2^0;
J=(P04)*2^3+(P05)*2^2+(P06)*2^1+(P07)*2^0;
char[16]="ij";//把数组转化成16进制//
I++;J++;
char[17]="ij";//把数组转化成16进制//
i=(P08)*2^3+(P09)*2^2+(P10)*2^1+(P11)*2^0;
J=(P12)*2^3+(P13)*2^2+(P14)*2^1+(P15)*2^0;
sbitP1^1=1,P2^2=0,
P1^3=0,P1^4=1;
intn=9;
p[16]={0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,};
i=(P00)*2^3+(P01)*2^2+(P02)*2^1+(P03)*2^0;
J=(P04)*2^3+(P05)*2^2+(P06)*2^1+(P07)*2^0;
char[18]="ij";//把数组转化成16进制//
I++;J++;
char[19]="ij";//把数组转化成16进制//
i=(P08)*2^3+(P09)*2^2+(P10)*2^1+(P11)*2^0;
J=(P12)*2^3+(P13)*2^2+(P14)*2^1+(P15)*2^0;
sbitP1^1=1,P2^2=0,
P1^3=1,P1^4=0;
intn=10;
p[16]={0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,};
i=(P00)*2^3+(P01)*2^2+(P02)*2^1+(P03)*2^0;
J=(P04)*2^3+(P05)*2^2+(P06)*2^1+(P07)*2^0;
char[20]="ij";//把数组转化成16进制//
I++;J++;
char[21]="ij";//把数组转化成16进制//
i=(P08)*2^3+(P09)*2^2+(P10)*2^1+(P11)*2^0;
J=(P12)*2^3+(P13)*2^2+(P14)*2^1+(P15)*2^0;
sbitP1^1=1,P2^2=0,
P1^3=1,P1^4=1;
intn=11;
p[16]={0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,};
i=(P00)*2^3+(P01)*2^2+(P02)*2^1+(P03)*2^0;
J=(P04)*2^3+(P05)*2^2+(P06)*2^1+(P07)*2^0;
char[22]="ij";//把数组转化成16进制//
I++;J++;
char[23]="ij";//把数组转化成16进制//
i=(P08)*2^3+(P09)*2^2+(P10)*2^1+(P11)*2^0;
J=(P12)*2^3+(P13)*2^2+(P14)*2^1+(P15)*2^0;
sbitP1^1=1,P2^2=1,
P1^3=0,P1^4=0;
intn=12;
p[16]={0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,};
i=(P00)*2^3+(P01)*2^2+(P02)*2^1+(P03)*2^0;
J=(P04)*2^3+(P05)*2^2+(P06)*2^1+(P07)*2^0;
char[24]="ij";//把数组转化成16进制//
I++;J++;
char[25]="ij";//把数组转化成16进制//
i=(P08)*2^3+(P09)*2^2+(P10)*2^1+(P11)*2^0;
J=(P12)*2^3+(P13)*2^2+(P14)*2^1+(P15)*2^0;
sbitP1^1=1,P2^2=1,
P1^3=0,P1^4=1;
intn=13;
p[16]={0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,};
i=(P00)*2^3+(P01)*2^2+(P02)*2^1+(P03)*2^0;
J=(P04)*2^3+(P05)*2^2+(P06)*2^1+(P07)*2^0;
char[26]="ij";//把数组转化成16进制//
I++;J++;
char[27]="ij";//把数组转化成16进制//
i=(P08)*2^3+(P09)*2^2+(P10)*2^1+(P11)*2^0;
J=(P12)*2^3+(P13)*2^2+(P14)*2^1+(P15)*2^0;
sbitP1^1=1,P2^2=1,
P1^3=1,P1^4=0;
intn=14;
p[16]={0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,};
i=(P00)*2^3+(P01)*2^2+(P02)*2^1+(P03)*2^0;
J=(P04)*2^3+(P05)*2^2+(P06)*2^1+(P07)*2^0;
char[28]="ij";//把数组转化成16进制//
I++;J++;
char[29]="ij";//把数组转化成16进制//
i=(P08)*2^3+(P09)*2^2+(P10)*2^1+(P11)*2^0;
J=(P12)*2^3+(P13)*2^2+(P14)*2^1+(P15)*2^0;
sbitP1^1=1,P2^2=1,
P1^3=1,P1^4=1;
intn=15;
p[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
i=(P00)*2^3+(P01)*2^2+(P02)*2^1+(P03)*2^0;
J=(P04)*2^3+(P05)*2^2+(P06)*2^1+(P07)*2^0;
char[30]="ij";//把数组转化成16进制//
I++;J++;
char[31]="ij";//把数组转化成16进制//
i=(P08)*2^3+(P09)*2^2+(P10)*2^1+(P11)*2^0;
J=(P12)*2^3+(P13)*2^2+(P14)*2^1+(P15)*2^0;
input(char());//输出"大"的代码//
4.4字符显示器电路程序清单:
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 ;取码指针的初值
l100:
MOV R1,#100 ;每个字的停留时间
L16:
MOV R6,#16 ;每个字16个码
MOV R4,#00H ;扫描指针清零
MOV R0,20H ;取码指针存入R0
L3:
MOV A,R4 ;扫描指针存入A
MOV P1,A ;扫描输出
INC R4 ;扫描指针加1,扫描下一个
MOV A,R0 ; 取码指针存入A
MOV DPTR,#TABLE ;取数据表的上半部分的代码
MOVC A,@A+DPTR
MOV P0,A ; 输出到P0
INC R0 ;取码指针加1,取下一个码。
MOV A,R0
MOV DPTR,#TABLE ;取数据表下半部份的代码
MOVC A,@A+DPTR
MOV P2,A ;输出到P2口
INC R0
MOV R3,#02 ;扫描1毫秒
DELAY2:
MOV R5,#248 ;
DJNZ R5,$
DJNZ R3,DELAY2
MOV A,#00H ;清除屏幕
MOV P0,A
ANL P2,#00H
DJNZ R6,L3 ;一个字16个码是否完成?
DJNZ R1,L16 ;每个字的停留时间是否到了?
MOV 20H,R0 ;取码指针存入20H
CJNE R0,#0FFH,L100 ;8个字256个码是否完成?
JMP LOOP ;反复循环
TABLE :
;汉字“致”的代码
db00H,00H,40H,02H,44H,04H,5CH,84H
db67H,F8H,44H,90H,4CH,20H,40H,24H
db04H,08H,08H,10H,16H,10H,36H,30H
db50H,C0H,13H,30H,1CH,18H,10H,04H
;汉字“知”的代码
db01H,04H,07H,04H,11H,10H,21H,10H
db61H,80H,38H,E0H,21H,10H,21H,08H
db01H,04H,1FH,FCH,10H,04H,10H,04H
db10H,04H,10H,04H,10H,04H,1FH,HCH
;汉字“于”的代码
db01H,00H,01H,00H,01H,00H,01H,00H
db01H,00H,21H,00H,21H,04H,21H,02H
db3FH,FFH,21H,00H,21H,00H,21H,00H
db01H,00H,01H,00H,01H,00H,01H,00H
;汉字“行”的代码
db01H,00H,0AH,00H,14H,00H,2HH,HHH
db50H,00H,20H,00H,40H,00H,04H,00H
db04H,00H,44H,00H,44H,04H,44H,02H
db47H,FFH,44H,00H,04H,00H,04H,00H
电路中行方向由p0口和p2口完成扫描,由于p0口没有上拉电阻,因此接一个4.7k*8的排阻上拉。
如没有排阻,也可用8个普通的4.7k 1/8w电阻。
为提供负载能力,接16个2n5551的NPN三极管驱动。
列方向则由4—16译码器74LS154完成扫描,它由89C51的P1.0---P1.3控制。
同样,驱动部分则是16个2N5401的三极管完成的。
电路的供电为一片LM7805三端稳压器,耗电电流为100Ma左右。
采用一块12*20cm的万能电路板,应当选用质量好些的发光管,(否则有坏点现象, 更换起来较麻烦)首先将256个发光管插入电路板,注意插入方向,同时使高度一致,行方向直接焊接起来, 列方向则搭桥架空焊接,完成后用万用表测试一下如有不亮的更换掉。
然后找一个电脑硬盘的数据线, 截取所需的长度,分别将行,列线引出至电路的相关管脚即可。
原理图为了简洁,故只画出了示意图,行列方向只画出了2个三极管,屏幕只画出4个发光管, 实际上发光管为256只,三极管行列方向各16只,一共32只。
焊接过程认真仔细一天时间即可完成全部制作。
将程序编译后烧写入89c51, 插入40pin Ic座,即可看到屏幕轮流显示:
“致知于行”。
4.5显示简易图形代码
以下为一简易正方形代码:
db01H,00H,02H,80H,04H,40H,08H,20H
db10H,01H,20H,08H,40H,40H,80H,01H
db40H,40H,20H,08H,10H,01H,08H,20H
db04H,40H,02H,80H,01H,00H,00H,00H
5.总结
通过两周的设计,课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.从选题到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
6.心得体会
通过这次课程设计学会了如何运用图书馆及网络中各种资料来考虑问题,并且对本学期所学过的很多知识印象加深。
了解了个别的芯片在实践中是如何运用的。
通过老师的讲解更是了解了很多的知识。
在这次的课程设计中,我不仅收获了知识,还收获了不少的阅历,使我成熟了许多,培养出了我独立思考,动手操作的能力。
这次课程设计中我更加了解了关于单片机的许多知识,我想对我以后的学习一定会有很大的帮助。
自己动手做课程设计是对于我自己一个不小的突破,感谢学校和老师能给我这么一次
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 可编程 字符 显示器