点阵动态显示汉字与LCMLCD显示图片.docx
- 文档编号:19766256
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:25
- 大小:876.98KB
点阵动态显示汉字与LCMLCD显示图片.docx
《点阵动态显示汉字与LCMLCD显示图片.docx》由会员分享,可在线阅读,更多相关《点阵动态显示汉字与LCMLCD显示图片.docx(25页珍藏版)》请在冰豆网上搜索。
点阵动态显示汉字与LCMLCD显示图片
一.电脑仿真
(一).实验目的
设计一个采用8x8点阵的汉字显示屏,要求能连续动态显示多个汉字,字体最少为16x16点阵。
(二).题目分析
题目要求能动态显示多个汉字,且字体最少为16x16点阵,所以最少要用到4块8x8的点阵;如果采用常规的并口连接的话要使用到4个并口(32个输出),显然这是不现实的,而且使用并口也很不经济,占用太多的IO会大大降低单片机的扩张能力,如果要想后继加入一些功能模块的话,IO的个数将十分捉襟见肘。
现今的趋势是串行化,很多东西的数据传输紧靠一两根数据线实现,这既方便,又经济;在做实物的时候连线很简单,看起来美观,同时还不用占用单片机太多的IO口;虽然编程复杂点,但利远大于弊,我设计的电路和程序就是围绕串行这个思想来做的。
我们知道,51单片机有一个全双工的串行接口(RXD,TXD),它有四种工作方式,其中方式0串行口是专门作为同步移位寄存器使用的,这时RXD端作为数据移入的入口和出口,而TXD端提供移位脉冲。
移位数据的发送和接收以8位为一帧,不设起始位和停止位,地位在前,高位在后。
这种方式常用于扩张IO口。
在这里要用单片机控制点阵的汉字显示,作为数据输出,所以要用到串进并出的芯片。
74LS595是一块8位的串进并出芯片,它里面有一个8位的移位寄存器和一个8位的数据锁存器,其封装如下:
其引脚名称及下所示:
引脚号
名称
I/0
说明
11
SH_CP
I
脉冲输入端,上升沿有效,一个上升沿打入移位寄存器一位数据、
12
ST_CP
I
脉冲输入端,下降沿有效,一个下降沿打入锁存器一位数据。
14
DS
I
串行数据输入端
15&1~7
Q0~Q7
O
并行数据输出
10
MR
I
锁存器数据擦除信号,低电平有效
13
OE
I
并行数据输出,低电平有效,在该信号的触发下,芯片输出并行数据,否则为高组态。
要控制多块点阵的话就要使用多块74LS595芯片,可见要产生一个片选信号来选定不同的芯片。
而74LS595并没有特定的片选口,只能通过移位脉冲的输入来间接片选不同的芯片了,这里我使用了译码器74LS138。
它是一块3位输入,8列输入的译码器,其封装如下所示:
当E1为高电平,E2,E3为电平时输入有效,其译码逻辑如下:
C
B
A
Y0Y1Y2Y3Y4Y5Y6Y7
0
0
1
011111111111111
0
1
0
101111111111111
0
1
1
110111111111111
1
0
0
111011111111111
1
0
1
111101111111111
依次类推……
74LS138输出的片选信号是低电平,经过非门转换后于移位脉冲相与就能控制74LS595移位脉冲的输入了。
(三).框图设计
从上面的分析就大概可以构思出电路的总体架构了,以下是系统框图:
(四).硬件设计
综上考虑,我在硬件设计时,用P2口产生片选信号,而P3口的4端和5端控制74LS595数据的擦除和输出,以下是电路图:
连线的特写如下:
译码器参数片选信号IN。
IN信号控制移位脉冲的输出管道。
74LS595除了脉冲信号CLK(相当于芯片使能)外,其他信号都是并联共用的。
点阵行是并联的,可以看出是行扫描显示。
(五).程序清单
结合硬件电路,考虑好实现的具体细节,经过不断摸索,终于把程序调试的差不多,以下是单片机的C语言程序代码:
/*----------------------------*/
/*48*16点阵显示*/
/*----------------------------------*/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineCSP2//片选信号
#defineN12//字数12
#defineLIST8//点阵(块数)2行6列,共8块
sbitCLK=P3^1;//移位脉冲产出端
sbit_OE=P3^5;//595输出使能端
sbit_MR=P3^4;//595数据擦除端
uchari=0,j=0,time=0,moverow=0;//全局变量,i为行扫描行数;j为595
//芯片标号;time为时间中断次数,计时用;
//moverow为汉字左移列数。
ucharcodeword[32*N]={
/*以下是'昆'的16点阵宋体字模,32byte*/
0x00,0x00,
0x3F,0xF0,
0x20,0x10,
0x20,0x10,
0x3F,0xF0,
……
//字形码数据,为节省篇幅,不全列出,格式对照上面,每字32byte,共12字。
};
ucharwordata()//根据行、列和左移列数定位字形码。
{
uinta,b,c,d;
uchartemp,shang,yu;
TR0=0;
shang=moverow/16;
yu=moverow%16;
if(j>1)
{
a=2*i+32*shang+32*((j-2)/2)+j%2;//字形码算子,是我推导出来的,很复杂。
b=2*i+32*shang+32*((j-1)/2)+(j+1)%2;
c=2*i+32*shang+32*((j-1)/2)+(j+1)%2;
d=2*i+32*shang+32*(j/2)+j%2;
if(a>32*N)//超过字形码地址就从头开始
//用于汉字移动时连续显示(末尾接上首部)
a=a-32*N;
if(b>32*N)
b=b-32*N;
if(c>32*N)
c=c-32*N;
if(d>32*N)
d=d-32*N;
if(yu<8)
temp=(word[a]<
else
temp=(word[c]<<(yu-8))|(word[d]>>(16-yu));
}
else;
TR0=1;
returntemp;
}
voidsend()//数据发送函数,写入595芯片数据
{
_MR=0;//595清零,跟新数据
if(i==16)
i=0;//扫描完16行就从头继续扫描显示
_OE=1;//禁止595输出数据
_MR=1;
for(j=0;j { CS=j;//片选信号 if(j==0)//选中控制0~7行的595芯片 { if(i<8) { SBUF=~(0x01< while(! TI);//未发送完毕则等待 TI=0; } else { SBUF=0XFF; while(! TI); TI=0; } } elseif(j==1)//选中控制8~15行的595芯片 { if(i>=8) { SBUF=~(0x01<<(i-8)); while(! TI); TI=0; } else {SBUF=0XFF; while(! TI); TI=0; } } else//选中列控制芯片 { SBUF=wordata();//输给列控制的595芯片字形码数据 while(! TI); TI=0; } CLK=0; _nop_(); CLK=1;//上升沿,让移位寄存器最后移位数据打入锁存器 _nop_(); } _OE=0;//595输出使能,一次输出1行共8X(6+2)byte的数据 i++; } voiddelay(uchart)//延时程序 { unsignedcharm,n,k; for(m=t;m>0;m--) for(n=5;n>0;n--) for(k=250;k>0;k--); } voidTIMER0()interrupt1using1//时间中断0 { TH0=0X3C; TL0=0Xb0;//50毫秒 time++; if(time==5) { time=0; //i=7; moverow++;//250毫秒左移一列 } if(moverow==(16*N)+1)//左移超过字数限制则清零 moverow=0; } voidmain() { TMOD=0x01; TH0=0X3C; TL0=0Xb0;//初始化时间中断 EA=1; ET0=1;//时间中断0 TR0=1; SCON=0x00;//串口方式0 while (1) { send(); delay (1); } } 二.仿真与实物制作 (一).实验目的 设计一个LCD显示程序,能实现一定的功能,并且把结果在LCD上显示出来。 (二).题目分析 题目要求要用到LCD,现在市场上有很多LCD集成模块(LCM),使用简单方便。 从显示内容上可以分为字符型液晶(1602)和点阵型液晶(12864);从功能上分为带字库和不带字库。 我使用的LCM是LM4229;为点阵型,不带字库,其封装如下所示: LM4229分辨率是240X128,共20个引脚,其引脚名称和功能如下: 1.VSS: GND 2.VDD: VCC(LCD供电电源) 3.VO: LCD背光调节电压 4.C/D: WR=0、C/D=1写命令WR=0、C/D=0写数据 RD=0、C/D=1读状态RD=0、C/D=0读数据 5.RD: 读,低电平有效 6.WR: 写,低电平有效 7.D0-D7: 数据总线 15.CE: 使能,低电平有效 16.RST: 复位,低电平有效 17.VEE: LCD负电压 18.MD2: 方式选择 19.FS1: 终端字体大小选择(高电平为8X8模式,低电平为8X6模式) 20.HALF: HalfFunction(H=NormalL=Stoposcillation停止振动,功能不详) LM4229使用的主控芯片是T6963C,不带字库,其描述如下: 从上面的英文资料可以知道T6963C的命令格式和使用方法;其中几条比较重要的命令(16进制)是: 24: 设置地址 B0: 设置数据自动写,地址自加 B2: 自动复位,地址清零 42: 图形首地址设置 43: 图形区域设置 80: 设置为OR模式,先前数据不覆盖 98: 关闭文本显示,开图形显示 现在我要使用LM4229做一个图形化的单片机操作软件,可以有很多的功能,现在只实现了日历和键盘输入的功能。 在做日历模块时,我使用的是DS1302芯片,该芯片自带31byte的RAM和计时器,其封装如下: 上图中,第6脚“I/0”既是读取时间的通道,又是该芯片时间设置的通道,SCLK为读写脉冲输入端。 (三).框图设计 从上面的分析就大概可以构思出电路的总体架构了,以下是系统框图: (四).硬件设计 综上考虑,我在硬件设计时,用P0口扫描矩阵键盘,而P1口用于输给LCM字形码,P2产生LCM控制信号。 以下是电路图: 现在我在仿真时只实现了时间显示和大图浏览功能: 实物制作时由于条件限制和其他多方面原因,只实现了基本的主菜单显示,如下所示: (五).程序清单 结合硬件电路,考虑好实现的具体细节,经过不断摸索,终于把程序调试的差不多,由于篇幅所限,以下是单片机的C语言程序函数声明和表格数据格式: 1.主程序: Main.c #include #include #include #defineuintunsignedint #defineucharunsignedchar /*********************************************************************/ //LM4229(240128)屏GUI多功能智能设备V1.0*/ //昆明理工大学应用技术学院*/ //08级电子信息工程*/ //熊子良*/ /*********************************************************************/ voidtrans(); voidmenu();//-------函数声明-------- struct//全局变量初始化 { ucharindex1,index2,Page; ucharselected; }Menu_Index; ucharcount; charh=0,w=0; //============================================ //主函数入口 //============================================ voidmain() { TMOD=0X11; TH0=0xD8; TL0=0xF0; EA=1; ET0=1; TR0=1; TH1=0xD8; TL1=0xF0; TH0=0xD8; TL0=0xEF; menu(); while (1); } voidmainmenu(charx,ucharindx);//主菜单界面 voidTime_Page(ucharindx);//时钟界面 voidTime_Page_RiLi();//时钟—>日历界面 voidmenu();//菜单切换函数,根据Index调用相应的菜单函数 voidselect(uchari);//按键响应函数,改变全局变量Index和w,h的值 //============================================ //时间中断0,操作时间刷新和键盘扫描 //============================================ voidTIMER0()interrupt1 { ucharx; TH0=0xD8; TL0=0xF0; if(count==10) { count=0; trans(); } x=findkey(); if(x! =16) select(x); count++; } voidtrans();//数据转换,用于显示时间 2.LM4229液晶显示驱动程序: LM4229.h //----------------------------------------- //本页程序参考仿真社区()网友 //的LCD240*128显示程序,在此表示感谢! //同时自己也加了相当的函数和修改 //========================================= #include #include #include #include #defineucharunsignedchar #defineuintunsignedint #defineDATA_PORTP0 //------------------------------------------- //管脚定义 //------------------------------------------ sbitHALT=P2^0;//暂不清楚 sbitFS1=P2^1;//字体模式选择 sbitMD2=P2^2;//方式选择 sbitRST=P2^3;//复位 sbitCD=P2^4;//数据(L)/命令(H)选择 sbitREAD=P2^5;//读,低电平有效 sbitWRIT=P2^6;//写,低电平有效 sbitCE=P2^7;//使能,低电平有效 voidlcd_init();//LM4229初始化函数 voidclr_all();//清屏 voidwrite_lcd(ucharx,uchary,char*cha,bitflag1,bitflag2); //指定位置向LCD写入指定字符 //参数说明: x、y坐标cha字符串flag1反白显示标志1正常,0反白 //flag2上下截止标志 voidwrite_image(intx,inty,uinta,uintb,uchar*tab_image,bitflag1,bitflag2); //LM4229在指定位置显示a*b图片 //a为图片长,b为图片宽(a为8的倍数) voiddraw_rect(); //LM4229在指定位置画矩形a*b //参数说明: x、y坐标a、b长度 3.DS1302驱动程序: ds1302.h /*********************************************************************/ //-----DS1302驱动程序---------------*/ //-----此驱动程序来自一名为聂金波*/ //的网友在此表示感谢! */ /*********************************************************************/ #defineucharunsignedchar #defineuintunsignedint //-------------------------- //------定义端口--------- sbitrst=P3^5; sbitsclk=P3^7; sbitio=P3^6; //--------------------------- uchartab_1302[7]={0,10,19,30,7,3,8};//初始化时时间日期设置 //秒分时日月星期年 //-------------------------- //-----函数声明------ //-------------------------- voidds1302();//获取DS1302时间 4.4x4键盘扫描驱动程序: keypad.h /*********************************************************************/ //------------------4x4键盘扫描驱动程序---------------*/ //-----此驱动程序来自我的尊师杜礼霞老师,在此感谢她的指导! */ /*********************************************************************/ #include #definekeypP0//宏定义,把P0口定义为keyp unsignedcharfindkey(void);//获取矩阵键盘键值的程序 5.西文字库: en_code.h //ASCII字模显示为8*16 charcodeASC_MSK[]={}; 5.中文字库: cn_code.h typedefstructtypFNT_GB16//汉字字模数据结构 { charIndex[2]; charMsk[32]; }; codestructtypFNT_GB16GB_16[]={}; 5.图片库: picture.h #defineucharunsignedchar ucharcodetab_pic0[]={}; 三、心得体会: 学了单片机这么久了,用单片机做过很多东西,我个人觉得自己基本把单片机的原理和应用都摸索透了,唯一感觉比较遗憾的是没有用过点阵和LCD显示屏,所以很想学学这方面的应用。 以前我也用PROTUES胡乱整这些东西,但一直不知道怎么用,也没刻意去网上找过这方面的资料,所以以前我用单片机基本上只停留在LED数码管的层面上。 但经过这次实训,我把点阵和LCM基本也掌握了,非常感谢老师您,是你们教会了我以前一直想学的东西。 这次实训过的很充实,学到了不少知识,在单片机应用上又前进了一个台阶,认识的东西多了,视角广了。 在这次实训中,因为编程中遇到了很多问题,所以我在网上找了很多资料,我觉得网络如果好好利用的话,真的能带给我们很多东西。 在网上几乎可以学到任何你想学到的知识,虽然会遇到很多问题,可能会走很多弯路,但也能给予我们很多营养。 譬如单片机编程,其实我个人觉得,有些底层的驱动软件真的完全没必要自己去写,一来是我们对硬件不是很熟悉,二是经验不足,很难留意到硬件的实现细节。 所以我觉得,这方面的东西最好还是去网上下源程序吧! 这并不是抄袭,那句牛顿的话说: 我们是站在巨人的肩膀上。 像我这个LCM程序的蓝本就来源于网上一名叫聂金波的网友(在此表示感谢),而他的LM4229驱动程序也不是他自己写的,可见很多东西还是要继承和发扬的。 虽然单片机这门课很好,应用很广泛,我也很喜欢用单片机做东西;但我觉得单片机有点过时了。 其实很羡慕嵌入式方向的同学,我觉得ARM就像初升的太阳,勃然生机;而单片机就像七八十岁的老翁,垂垂老矣,说不定多少年以后就要被淘汰了。 说了太多题外话了,言归正传。 这次单片机实训实在是经历了很多磨难,花费了不少心思。 在做这个LCD显示时一直没有图像显示,真的让我很沮丧;我花费了很多时间,去检查电路、换单片机、换晶振、换电容,可是一直没发现出问题! 真的感觉莫名其妙: 明明没问题可为什么就是没结果呢? 后来给老师一看,原来测试程序写错了,单片机最小系统没问题
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 点阵 动态 显示 汉字 LCMLCD 图片
![提示](https://static.bdocx.com/images/bang_tan.gif)