LCD显示电子日历.docx
《LCD显示电子日历.docx》由会员分享,可在线阅读,更多相关《LCD显示电子日历.docx(60页珍藏版)》请在冰点文库上搜索。
![LCD显示电子日历.docx](https://file1.bingdoc.com/fileroot1/2023-7/17/cb10a0c3-a201-4e5a-82a3-728c09c9e31c/cb10a0c3-a201-4e5a-82a3-728c09c9e31c1.gif)
LCD显示电子日历
摘要
传统的液晶显示往往采用单片机控制。
但在系统有大量高速实时数据的情况下,单片机由于受到处理速度的限制就显得力不从心。
为了解决这些问题,本文提出了一种基于DSP控制的液晶显示屏的设计,有效地解决以上所遇到的问题。
本文提出了一种基于DSP控制的液晶显示数字日历的设计。
通过对DSP芯片TMS320LVC5416PGE和液晶模块LCM12864ZK的分析和研究,利用TMS320LVC5416PGE的DSP最小系统板构建了一个时间显示系统,采用LCM12864ZK液晶模块显示时间,用按键调整时间。
该时钟系统包括硬件电路的实现和系统程序设计两部分。
对液晶显示时钟系统的硬件原理和主程序流程图进行了介绍,并给出了定时器的初始化程序和按照液晶显示模块接口读写时序编写的在DSP芯片TMS320LVC5416PGE上的液晶显示初始化程序。
关键词:
DSP;TMS320LVC5416PGE;LCM12864ZK液晶模块
Abstract
Electroniccalendarwithstableperformance,highprecision,lowcost,convenientandpractical,andeasy-to-productandothercharacteristics.Suitableforfamilies,companiesandinstitutions,andmanyotherplaces,forpeople'sdailylife,travelrrangementsprovidedforconvenienceonly.
ThispaperpresentsaDSP-basedcontrolLCDelectroniccalendardesign.ThroughtheDSPchipandLCDmodulesTMS320LVC5416PGEanalysisandresearch,theuseofTMS320LVC5416PGEtheDSPminimumsystemboardtobuildatimedisplaysystemthatusesaliquidcrystaldisplaymoduletime,withbuttonstoadjustthetime.Theclocksystemimplementationandsystemprograms,includinghardwarecircuitdesignintwoparts.OntheLCDhardwareprincipleandthemainclocksystemflowchartwereintroduced,andgivesthetimerinitializationprocedureandinaccordancewiththeliquidcrystaldisplaymoduleinterfacetoreadandwritetiminginthepreparationofaliquidcrystaldisplayDSPchipTMS320LVC5416PGEinitializationprocedure.
[Keywords]dsp TMS320L VC5416PGE LCDModule
Abstract................................................Ⅱ
第二章系统硬件的组成....................................2
第一章绪论
DSP芯片,也称数字信号处理器,是一种特别适合与数字信号处理运算的微处理器,其主要应用是实时快速地实现各种数字信号处理算法。
既具有高速数字信号处理功能,又具有实时性强、功耗低、集成度高等嵌入式微计算机的特点,所以随着科技的发展,DSP技术在机电控制领域的应用愈加广泛。
本文利用DSP芯片TMS320LVC5416PGE的数字I/O口来控制慢速LCM12864ZK液晶显示模块,用软件编程来实现对外设LCM12864ZK液晶显示模块的读写接口时序,并且按照LCM12864ZK液晶显示模块的时序要求加入相应的等待延时来实现高速的DSP芯片和低速的液晶显示模块的工作匹配,从而实现基于DSP的液晶显示日历设计。
1.1LCD及电子日历的概述
(1)LCD是LiquidCrystalDisplay的简称,它的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置TFT(薄膜晶体管),上基板玻璃上设置彩色滤光片,通过TFT上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目的。
电子日历是LCD显示器,分时显示当前时间和日历。
即时间(时:
分),日历(月:
日)。
利用尽可能小的小键盘实现其时间的加减。
1.2本设计任务及要求
第二章系统硬件组成
完整系统所需的模块有DSP模块、液晶显示模块、键盘模块。
2.1DSP模块
使用TI公司的TMS320LVC5416PGE型号的DSP芯片构成最小系统板,该系统板是DSP芯片工作的最小系统,主要由DSP芯片TMS320LVC5416PGE、StaticRAM芯片CY7C1021和3.3V电源组成。
DSP芯片的引脚可以在实验中根据需要通过拓展插口引出。
最小系统可引出的DSP功能有:
I/O,AD,SPI,SCI,CAN,PWM,Interrupt,AP和电源引脚。
根据本系统的需要,从最小系统板拓展插口引出所用到的DSP芯片引脚试验箱上液晶显示模块的访问、控制是由5416DSP对扩展I/O接口的操作完成。
试验箱上液晶显示模块的访问、控制是由5416DSP对扩展I/O接口的操作完成。
2.1.1TMS320C5416的特点和硬件组成框图
TMS320C5416采用TMS320C54x系列内核,其主要特性如下所示:
●CPU
先进的多总线结构。
40位算术逻辑运算单元(ALU)。
17位×17位并行乘法器与40位专用加法器相连。
比较、选择、存储单元(CSSU)。
指数编码器可以在单个周期内计算40位累加器中数值的指数。
双地址生成器包括8个辅助寄存器和两个辅助寄存器算术运算单元(ARAU)。
●存储器
64K字程序存储器、64K字数据存储器以及64K字I/O空间。
●指令系统
单指令重复和块指令重复操作。
块存储器传送指令。
32位长操作数指令。
同时读入两个或3个操作数的指令。
并行存储和并行加载的算术指令。
条件存储指令。
从中断快速返回指令
●在片外围电路
软件可编程等待状态发生器。
可编程分区转换逻辑电路。
带有内部振荡器。
外部总线关断控制,以断开外部的数据总线、地址总线和控制信号。
数据总线具有总线保持器特性。
可编程定时器。
并行主机接口(HPl)。
●电源
可用IDLEl、IDLE2和IDLE3指令控制功耗,以工作在省电方式。
可以控制关断CLKOUT输出信号。
在片仿真接口
具有符合IEEEll49.1标准的在片仿真接口(JTAG)。
●速度
单周期定点指令的执行时间为25/20/15/12.5/10-ns(40MIPS/50MIPS/66MIPS/80MIPS/100MIPS)
2.2液晶显示模块
LCM12864ZK液晶模块用于字符、数字和汉字的显示,该模块有128×64个像素,可以显示4行汉字,每行8个,共计32个汉字;或者4行半角字符,每行16个,共计64个半角字符。
通过各点亮灭的组合,即可显示出文字、图片的信息。
需要强调的是,LCM12864ZK液晶模块的VR和VO引脚端需要串连一个10
的可调电阻,且在初次使用时要微调10
电阻,使得液晶屏的字符显示清晰明亮。
系统中的液晶显示单元采用LCM128645ZK型中文液晶显示模块。
该模块电源操作范围宽(2.7Vto5.5V),其低功耗设计可满足产品的省电要求;同时,模块与微控器的接口界面灵活(三种模式:
并行8位/4位,串行3线/2线),可实现汉字、ASCII码、点阵图形的同屏显示,支持所有的主流液晶操作指令,预留多种控制线(复位/串并选择/亮度调整)供用户灵活使用。
液晶显示模块的访问、控制是由5416DSP对扩展I/O接口的操作完成。
控制I/O口的寻址:
命令控制I/O接口的地址为0x8001,数据控制I/O接口的地址为0x8003和0x8004,辅助控制I/O接口的地址为0x8002。
2.2.1显示数据控制方法:
液晶显示模块中有两片显示缓冲存储器,分别对应屏幕显示的象素,向其中写入数值将改变显示,写入“1”则显示一点,写入“0”则不显示。
其地址与象素的对应方式如图2所示:
图2.液晶数据显示格式
2.2.2发送控制命令:
向液晶显示模块发送控制命令的方法是通过向命令控制I/O接口写入命令控制字,然后再向辅助控制接口写入0。
下面给出的是基本命令字、解释和C语言控制语句举例。
.设置液晶显示开关:
0x3f打开显示;0x3e关闭显示;
Port8001=0x3f;port8002=0;//将液晶显示打开:
00111111
Port8001=0x3e;port8002=0;//将液晶显示关闭:
00111110
.设置显示起始行:
0x0c0+起始行取值,其中起始行取值为0至63;
Port8001=0x0c0;port8002=0;//设置从存储器第0行开始显示
Port8001=0x0c8;port8002=0;//设置从存储器第8行开始显示
.设置操作页:
0x0b8+页号,其中页号取值为0-7:
10111000+页号
Port8001=0x0b8;port8002=0;//设置即将操作的存储器第0页
Port8001=0x0ba;port8002=0;//设置即将操作的存储器第2页
.设置操作列:
0x40+列号,其中列号为取值为0-63:
01000000
Port8001=0x40;port8002=0;//设置即将操作的存储器第0列
Port8001=0x44;port8002=0;//设置即将操作的存储器第4列
2.2.3写显示数据:
在使用命令控制字选择操作位置(页数、列数)之后,可以将待显示的数据写
入液晶显示模块的缓存。
将数据发送到相应数据控制I/O接口即可。
液晶显示器的硬件电路上有自动移到下列的功能。
发送到下列的数据,不必先设置其列号。
由于液晶模块相对于DSP来讲是慢速设备,在命令之间可能需要增加延时语句。
举例说明:
Port8003=0x80;port8002=0;//向左侧屏幕缓存存入数据0x80,如果显示行、页号和列号均//为0时,屏幕上第8行第1列将显示黑色象素(数据位从高到低,//显示在一列的从下到上)。
Port8004=0x01;port8002=0;//向右侧屏幕缓存存入数据0x01,如果显示行、页号和列号均//为0时,屏幕上第1行第65列将显示黑色象素(数据位从高到低,//显示在一列的从下到上)。
2.2.4其它问题:
数据信号的传送:
由于液晶显示模块相对运行在8MHz主频下的DSP属于较为慢速设备,连接时需要考虑数据线上信号的等待问题;
电平转换:
由于DSP为3.3v设备,而液晶显示模块属于5v设备,所以在连接控制线、数据线时需要加电平隔离和转换设备。
液晶显示器与DSP的连接:
图3.液晶显示器与DSP的连接
2.3键盘模块
ICETEK-VC5416-A是一块以TMS320VC5416DSP为核心的DSP扩展评估板,它通过扩展接口与实验箱的显示/控制模块连接,可以控制其各种外围设备,也可以接收外设发送的各种数据、信息。
键盘的扫描码由DSP的I/O扩展地址0x8001给出,当有键盘输入时,读此端口得到扫描码,
当无键被按下时读此端口的结果为0。
读取的方法如下:
nScanCode=port8001;temp=port8002;//nScanCode中为扫描码先读,然后清零。
第三章程序设计
3.1设计思路
本次设计采用C语言编程,通过编程实现在液晶的左侧显示图片,在液晶的右侧从上到下依次显示“电子日历”、“x月x日”、“星期x”、及时间。
其主程序流程图如下:
图4.主程序流程图
整个系统软件设计主要包括程序、中断服务程序、显示程序等几个部分。
各个模块均写成函数形式,便于结构化程序设计。
各个模块之间可能需要交换数据,我们采取定义公共变量的方法来实现,这样就不必通过形参和实参方式来交换数据,简化了程序设计。
主程序主要完成系统初始化,中断初始化和构建一个循环不得地显示当前时间。
本系统采用的是显示芯片来实现系统显示的。
显示时主要根据LCD芯片时序要求,模拟产生相应的时序,选中芯片,向LCD芯片送相应的控制字设定其工作方式,再送相应数据完成显示工作。
当“秒”计至60时,“分”加1,当“分”计到60时,“时”加1,当“时”计到24时,“时”清0,”星期”加1完成一天计时。
3.2主程序
#include"su_zi_code.h"
#include"scancode.h"
#defineTIM*(int*)0x24
#definePRD*(int*)0x25
#defineTCR*(int*)0x26
#defineIMR*(int*)0x0
#defineIFR*(int*)0x1
#definePMST*(int*)0x1d
#defineucharunsignedchar
#defineuintunsignedint
voidinterrupttime(void);
voidtimer_init();
voidget_time();
charConvertScanToChar(unsignedcharcScanCode);
voiddisp2();
unsignedintuWork,nCount,nCountLed;
charshi=23,fen=18,miao=16;
ucharyue=12,ri=28;
ucharshi_s,shi_g,fen_s,fen_g,miao_s,miao_g,yue_s,yue_g,ri_s,ri_g;
#defineLCDDELAY1
#defineLCDCMDTURNON0x3f
#defineLCDCMDTURNOFF0x3e
#defineLCDCMDSTARTLINE0xc0
#defineLCDCMDPAGE0xb8
#defineLCDCMDVERADDRESS0x40
#defineCLKMD*(unsignedint*)0x58
//#defineWAITSTATUS*(unsignedint*)0x28
ioportunsignedintport8000;
ioportunsignedintport8001;
ioportunsignedintport8002;
ioportunsignedintport8003;
ioportunsignedintport8004;
ioportunsignedintport8007;
voidTurnOnLCD();
voidLCDCLS();
voidDelay(unsignedintnTime);
ucharreg_shi_s=11,reg_shi_g=11,reg_fen_s=11,reg_fen_g=11,reg_miao_s=11,reg_miao_g=11,reg_yue_s=11,reg_yue_g=11,reg_ri_s=11,reg_ri_g=11;
ucharx;
uintnKeyCode;
ucharflag1=0,flag2=0;
charConvertScanToChar(unsignedcharcScanCode)
{charcReturn;
cReturn=0;
switch(cScanCode)
{caseSCANCODE_0:
cReturn='0';break;
caseSCANCODE_1:
cReturn='1';break;
caseSCANCODE_2:
cReturn='2';break;
caseSCANCODE_3:
cReturn='3';break;
caseSCANCODE_4:
cReturn='4';break;
caseSCANCODE_5:
cReturn='5';break;
caseSCANCODE_6:
cReturn='6';break;
caseSCANCODE_7:
cReturn='7';break;
caseSCANCODE_8:
cReturn='8';break;
caseSCANCODE_9:
cReturn='9';break;
}
returncReturn;
}
voidget_key()
{uinttemp;
uintnScanCode;
ucharcKey;
nScanCode=port8001;
nScanCode&=0x0ff;
temp=port8002;
if(nScanCode!
=0&&nScanCode!
=0x0ff)
{cKey=ConvertScanToChar(nScanCode);
if(cKey!
=0)
{nKeyCode=cKey-'0';
}
}
}
}
voidtiao()
{
get_key();
if(nKeyCode==5)
{
nKeyCode=0;
flag1=1;
flag2=1;
fanxian
(1);
asm("ssbxINTM");
}
while(flag2)
{
get_key();
if(nKeyCode==5)
{
nKeyCode=0;
flag1=0;
flag2=0;
fanxian
(1);
IFR=0x0;
asm("rsbxINTM");
}
if(nKeyCode==6)
{
if(flag1>5)flag1=5;
elseflag1=flag1+1;
nKeyCode=0;
nKeyCode=0;
}
if(nKeyCode==4)
{
if(flag1<1)flag1=1;
flag1=flag1-1;
if(flag1==0)flag1=5;
nKeyCode=0;
}
if(flag1==1)//调月
{
if(nKeyCode==8)
{
nKeyCode=0;
yue=yue+1;
if(yue>12)yue=1;
}
if(nKeyCode==2)
{
nKeyCode=0;
yue=yue-1;
if(yue==0)yue=12;
}
}
if(flag1==2)//调日
{
if(nKeyCode==8)
{
nKeyCode=0;
ri=ri+1;
if(ri>31)ri=1;
}
if(nKeyCode==2)
{
nKeyCode=0;
ri=ri-1;
if(ri==0)ri=31;
}
}
if(flag1==3)//调时
{
if(nKeyCode==8)
{
nKeyCode=0;
shi=shi+1;
if(shi>23)shi=0;
}
if(nKeyCode==2)
{
nKeyCode=0;
shi=shi-1;
if(shi<0)shi=23;
}
}
if(flag1==4)//调分
{
if(nKeyCode==8)
{
nKeyCode=0;
fen=fen+1;
if(fen>59)fen=0;
}
if(nKeyCode==2)
{
nKeyCode=0;
fen=fen-1;
if(fen<0)fen=59;
}
}
if(flag1==5)//调秒
{
if(nKeyCode==8)
{
nKeyCode=0;
miao=miao+1;
if(miao>59)miao=0;
}
if(nKeyCode==2)
{
nKeyCode=0;
miao=miao-1;
if(miao<0)miao=59;
}
}
get_time();
disp2();
}
}
voidtimer_init()
{
asm("ssbxINTM");
uWork=PMST;
PMST=uWork&0xff;
//
//IMRANDIFROFVC5416
//15~14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
//reserved|DMAC5|DMAC4|XINT1|RINT1|HINT|INT3|XINT2|RINT2|XINT0|RINT0|TINT|INT2|INT1|INT0|
IMR=0x8;//TINT
//TCROFVC5416
//15~12|11|10|9~6|5|4|3~0|
//reserved|Soft|Free|PSC|TRB|TSS|TDDR|
TCR=0x041f;//(TDDR+1)=0xf+1=16
TIM=0;//0
PRD=0xf423;//(PRD+1)=0xf423+1=62500
TCR=0x042f;//
IFR=0x0;
asm("rsbxINTM");
}
voidinterrupttime(void)
{
x++;
if(x>9)
{
x=0;
miao