基于嵌入式系统的LCD广告牌设计.docx
《基于嵌入式系统的LCD广告牌设计.docx》由会员分享,可在线阅读,更多相关《基于嵌入式系统的LCD广告牌设计.docx(21页珍藏版)》请在冰豆网上搜索。
![基于嵌入式系统的LCD广告牌设计.docx](https://file1.bdocx.com/fileroot1/2023-6/14/a1452479-69d6-44b9-ade1-c9d48b56f836/a1452479-69d6-44b9-ade1-c9d48b56f8361.gif)
基于嵌入式系统的LCD广告牌设计
电子信息工程学院
《嵌入式原理》课程考核
设计报告
题目:
基于嵌入式系统的LCD广告牌设计
专业班级:
2014物联网工程2班
姓名:
王一中
学号:
时间:
2016.11~2016.12
成绩:
完成日期:
2016年12月20日
基于嵌入式系统的LCD广告牌设计
1.设计目的与要求
大街上绚丽多彩的液晶广告牌已经融入到我们生活中了,本学期学习了《嵌入式系统原理与应用》后,要求设计一个基于嵌入式系统的LCD1602广告牌,该设计要能满足以下要求:
(1).在ARM7—LPC2103核心板上设计一个LCD广告牌,能显示常见一些字符;
(2).采用LCD1602液晶屏,要求能够滚动显示字符;
(3).在LCD1602液晶屏上电后第一行显示“Hello!
”,第二行显示“Smilence_L”。
之后从第一行左侧滚动移入“0123456789ABCDEFGHIGKLMN”,第二行左侧滚动移入“ABCDEFGHIJKLMN987654321”,然后从右侧滚动移出。
(4).要求LCD1602液晶屏两行同时滚动显示,显示完后延时一段时间,能够循环显示。
2.设计内容
2.设计内容
(1)硬件电路设计及描述,画出电路原理图;
(2)确定元器件及型号;
(3)软件设计流程及描述;(重点内容)
(4)源程序代码(有注释);
(5)进行电路模拟仿真;
3.编写设计报告
写出设计的全过程,附录中有图纸及源代码,有心得体会。
4.答辩
在规定时间内,完成叙述并回答问题。
基于嵌入式系统的LCD广告牌设计
摘要:
随着科技的发展,ARM在社会各个方面的应用越来越广。
ARM芯片广泛应用于无线产品、PDA、GPS、网络、消费电子产品、STB及智能卡。
LPC2103是PHILIPS公司生产的基于ARM7TDMI的RISC微处理器,工作频率可达70MHZ。
液晶显示是嵌入式系统中反映系统输入/输出的人机交互界面,液晶显示以其微功耗、体积小、显示内容丰富、模块化,接口电路简单等诸多优点得到广泛应用。
我们在看重高性价比的情况下,利用LPC2103的通用I/O口来控制液晶显示屏的软硬件方法,实现了与LCD控制模块一样的功能。
关键词:
嵌入式系统、LCD、GPIO、数据传输。
1引言
嵌入式系统是嵌入到对象体系中的专用计算机系统。
以嵌入式计算机为核心的嵌入式系统是继IT网络技术之后,又一个新的技术发展方向。
本文以LPC2103为控制核心介绍和设计了一款基于的ARM嵌入式系统的LCD显示系统。
该系统在功耗、体积、集成度、成本等都有较好的优势,具有一定的实用意义。
由于LCD液晶显示器具有功耗低、体积小、重量轻、超薄等诸多其他显示器无法比拟的优点已广泛应用于各种智能型仪表和低功耗电子产品中。
液晶显示器分为笔段式、字符点阵式和图形点阵式三种。
前两种可显示数字、字符和符号等,而图形点阵式液晶显示器还可以显示汉字和任意图形,达到图文并茂的效果。
其应用已越来越广泛。
本文以液晶显示器1602为例介绍了液晶显示器的基本原理及在ARM嵌入式系统下的程序设计。
2总体设计方案
2.1设计思路
LCD1602广告牌设计采用ARM7微处理器为核心,采用RAM和UART分别存储和传输数据,实现了LPC2103与LCD1602之间的数据传输。
首先进行lpc2103进行管脚配置,通过管脚连接模块PINSEL0,PINSEL1设置管脚连接GPIO,但要先进行复位,复位值为0x00000000。
设置管脚方向IODIR,也就是输入或者输出,其中对应为1表示输出,为0表示输入。
设置高低电平,相关寄存器采用IOSET/IOCLR,IOSET表示让引脚输出1,IOCLR表示让引脚输出0。
完成LPC2103管脚的配置后,才可以对它进行操作。
液晶屏在LPC2103的控制下进行显示,需要先向液晶屏写入一些显示设置命令,然后再写入显示数据。
向液晶屏写入显示设置命令时,先将管脚RS清0。
当设置完成后,需要使管脚RS置1以写入显示数据。
同时,R/W也接入低电平,数据从液晶屏的管脚DB0-DB7写入。
当管脚RS和R/W设置好后,执行对管脚E清零,就会在管脚E上形成一个由高到低的跳变,这个跳变使得命令或显示数据从数据总线DB0-DB7进入液晶屏。
在进行程序设计时,对液晶屏的操作设计到写数据和写命令的操作,我们可以将写数据、写命令以及液晶屏显示做成一个函数。
我们将要显示的字符存储在数据中,对液晶屏执行初始化操作后,通过调用这些函数,来完成LCD的显示。
2.1.1LCD广告牌显示流程
LCD1602液晶屏广告牌显示流程图如下
2.2程序流程图
LCD广告牌设计程序流程图
开始
ARM微控制器管脚配置
液晶屏初始化
检测是否繁忙
是
否
写命令
写数据
循
环
显
示
3开发环境
1.硬件:
PC机一台,畅学ARM7—LPC2103核心板一块;
2.软件:
Windows10系统,KeiluVision4、Proteus7.8、LaunchLPC210x_ISP开发环境。
4设计原理分析
4.1LPC2103简介
LPC2103是基于一个支持实时仿真的32位ARM7的TDMI-SCPU的微控制器,并带有32kB嵌入的高速Flash存储器。
128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速率下运行。
对中断服务程序和DSP算法中性能要求严格的应用,这增加的性能比在Thumb模式下的性能超出多达30%。
对代码规模有严格控制的应用,使用16位Thumb模式将代码规模降低超过30%,而性能的损失却很小。
较小的封装和很低的功耗使LPC2103特别适用于访问控制和POS机等小型应用中;由于内置了宽范围的串行通信接口(范围从多个UART、SPI和SSP到两条I2C总线)和8kB的片内SRAM,它们也非常适合于通信网关和协议转换器。
高级性能还使这些器件适合用作数学协处理器。
多个32位和16位定时器、1个改良的10位ADC、所有定时器上输出匹配的PWM特性、以及具有多达13个边沿或电平触发的外部中断管脚的32条高速GPIO线,使这些微控制器特别适用于工业控制和医疗系统中。
(1).特性
32位ARM7TDMI-S微控制器,超小LQFP48封装。
8kB的片内静态RAM和8kB/16kB/32kB的片内Flash程序存储器。
128位宽度接口/加速器可实现高达70MHz工作频率。
通过片内boot装载程序实现在系统/在应用编程(ISP/IAP)。
单个Flash扇区或整片擦除时间为100ms。
256字节编程时间为1ms。
嵌入式ICERT通过片内RealMonitor软件提供实时调试。
10位A/D转换器提供8路模拟输入(每个通道的转换时间低至2.44us),以及特定的结果寄存器来最大限度地减少中断开销。
2个32位定时器/外部事件计数器(带7路捕获和7路比较通道)。
2个16位定时器/外部事件计数器(带3路捕获和7路比较通道)。
低功耗实时时钟(RTC)具有独立的电源和特定的32kHz时钟输入。
多个串行接口,包括2个UART(16C550)、2个高速I2C总线(400kbit/s)、SPI和具有缓冲作用和数据长度可变功能的SSP。
向量中断控制器(VIC),可配置优先级和向量地址。
多达32个通用I/O口(可承受5V电压)。
多达13个边沿或电平触发的外部中断管脚。
通过一个可编程的片内PLL(100us的设置时间)可实现最大为70MHz的CPU操作频率,其具有10MHz~25MHz的输入频率。
片内集成振荡器与外部晶体的操作频率范围为1~25MHz。
低功耗模式包括空闲模式、掉电模式和带有效RTC的掉电模式。
可通过个别使能/禁止外围功能和外围时钟分频来优化额外功耗。
通过外部中断或RTC将处理器从掉电模式中唤醒。
(2).结构简介
LPC2103包含一个支持仿真的ARM7TDMI-SCPU,片内存储器控制器接口的ARM7局部总线,中断控制器接口的AMBA先进高性能总线(AHB)和连接片内外设功能的ARM外设总线(APB,ARMAMBA先进外设总线的兼容超集)。
LPC2103将ARM7TDMI-S处理器配置为小端字节顺序。
AHB外设分配了2M字节的地址范围,它位于4G字节ARM存储器空间的最顶端。
每个AHB外设都在AHB地址空间内分配了16k字节的地址空间。
LPC2103的外设功能(中断控制器除外)都连接到APB总线。
AHB到APB的桥将APB总线与AHB总线相连。
APB外设也分配了2M字节的地址范围,从3.5G字节地址点开始。
每个APB外设在APB地址空间内都分配了16k字节地址空间。
(3).LPC2103存储器系统
片内Flash存储器系统:
LPC2103含有32kBFlash存储器系统。
该存储器可用作代码和数据的存储。
对FLASH存储器的编程可通过几种方法来实现:
使用内置的串JTAG接口、使用在系统编程(ISP)和UART、使用在应用编程(IAP)功能、使用IAP功能的应用程序也可以在应用程序运行时对Flash进行擦除和/或编程。
片内静态RAM(SRAM):
片内静态RAM(SRAM)可用作代码和/或数据的存储,它支持32位的访问。
LPC2103含有8kB的静态RAM。
LPC2103SRAM可作为一个字节寻址的存储器访问。
对存储器进行字和半字访问时将忽略地址对准,并访问被寻址的自然对准值(因此,对存储器进行字访问时将忽略地址位0和1,半字访问时将忽略地址位0)。
因此,有效的读写操作要求半字数据访问的地址线0为0(地址以0、2、4、6、8、A、C和E结尾),字数据访问的地址线0和1都为0地址(以0、4、8和C结尾)。
该原则同样用于片外和片内存储器。
SRAM控制器包含一个回写缓冲区,它用于防止CPU在连续的写操作时停止运行。
回写缓冲区总是保存着软件发送到SRAM的最后一个字节。
该数据只有在软件请求下一次写操作时才写入SRAM(数据只有在软件执行另外一次写操作时被写入SRAM)。
如果发生芯片复位,实际的SRAM内容将不会反映最近一次的写请求(即:
在一次“热”芯片复位后,SRAM不会反映最后一次写入的内容)。
任何在复位后检查SRAM内容的程序都必须注意这一点。
通过对一个单元执行两次相同的写操作可保证复位后数据的写入。
或者,也可通过在进入空闲或掉电模式前执行虚写(dummywrite)操作来保证最后的数据在复位后被真正写入到SRAM。
(4).晶体振荡器
LPC2103板上振荡器电路仅支持1MHz~25MHz的外部晶振。
如果片内PLL系统或引导装载程序被使用,那么输入时钟频率将被限制到10MHz~25MHz。
LPC2103的振荡器可工作在两种模式下:
从属模式和振荡模式。
从属模式下,输入时钟信号与一个100pF的电容(图6的Cc,a图)相连,其幅值至少为200mVrms。
该配置下的X2管脚不连接。
如果选择从属模式,Fosc信号(占空比为50-50)的频率被限制在1MHz~50MHz。
如果选择器件的振荡器模式为板上振荡模式,那么Fosc时钟限制在1MHz~30MHz。
(5).外部中断输入
LPC2103含有3个外部中断输入(作为可选的管脚功能)。
当组合管脚时,外部事件可作为3个独立的中断信号处理。
外部中断输入可用于将处理器从掉电模式中唤醒。
此外,所有10个捕获输入还可以用作外部中断而无需将器件从掉电模式中唤醒。
4.2LCD1602显示电路
“1602”代表该屏每行最多显示16个字符,能显示两行。
显示能容可以是英文大小写字母、数字、标点符号、常用符号等。
1602液晶屏上通常有16个管脚,其背面会看到驱动电路。
在液晶屏的显示区域中还安装有光源器件,称之为液晶屏的背光,用来照亮显示屏。
(1).LCD1602接口信号说明表:
(2).LCD102原理图
(3).RAM地址映射区
(4).LCD1602指令表
命令代码(D7-D0)
命令
命令功能说明
01H
清屏
清除液晶屏的显示数据
02H
归位
光标、画面回到起始位置
04H
光标左移
光标左移1位
05H
画面右移
显示画面右移
06H
光标右移
光标向右移动一位
07H
画面左移
画面向左移动
08H
关闭显示
显示、光标、闪烁关闭
0AH
打开光标
只打开光标,显示、闪烁关闭
0CH
打开显示
只打开显示,闪烁、光标关闭
0EH
光标不闪烁
打开光标,光标不闪烁
0FH
光标闪烁
打开显示和光标、光标闪烁
10H
光标位置左移
光标的位置向左移动
14H
光标位置右移
光标位置向右移动
18H
整个画面左移
整个显示画面向左移动1位
1CH
整个画面右移
整个显示画面向右移动1位
38H
显示设定
设定显示为2行,5*7的点阵
80H
光标回到第一行开头
强制光标回到第一行开头
C0H
光标回到第二行开头
强制光标回到第二行开头
(5).LCD1602基本操作时序
读状态输入:
RS=L,R/W=H,E=H输出:
D0—D7=状态字。
读数据输入:
RS=H,R/W=H,E=H输出:
无。
写指令输入:
RS=L,R/W=L,D0-D7=指令码,E=高脉冲输出:
D0-D7=数据。
写数据输入:
RS=H,R/W=L,D0-D7=数据,E=高脉冲输出:
无。
5系统测试
下面为实物效果图:
6总结与体会
作为一名物联网工程专业的大三学生,我觉得学好嵌入式是十分有意义的,而且是十分必要的。
在已度过的大学时间里,我们大多数接触的是专业课。
我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?
如何把我们所学的专业基础课理论知识运用到实践中去呢?
而传统的期末理论考试无法让我们真正理解嵌入式系统,这次嵌入式系统的课程考核改革就为我们提供了良好的实践平台,将理论付诸于实践。
在这次《ARM嵌入式系统原理》期末课程考核中,我设计的题目是《基于嵌入式系统的LCD广告牌设计》。
通过这次设计,我对ARM嵌入式系统尤其是嵌入式系统程序设计有了初步的了解,同时知识面也进一步得到了扩展和加深。
由于以前一直学的是51单片机,对于嵌入式的学习也只停留在理论上,甚至都没有见过真正的ARM芯片。
刚开始做嵌入式作品时,我拿到一块ARM7-LPC2103核心板时也是一头雾水,翻开芯片手册,只感觉ARM的管脚配置和寄存器配置和我之前学过的51有很大差别,感觉似懂非懂。
但既然拿到了板子就要把嵌入式的作品做出来。
在做本次嵌入式作品的过程中,我感触最深的当属查阅大量的设计资料了。
为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。
我们是在做作品,但我们不是艺术家,他们可以抛开实际尽情在幻想的世界里翱翔,而我们一切都要有据可依,有理可寻,不切实际的构想永远只能是构想,永远无法升级为设计。
其次,在这次课程设计中,我们运用到了以前所学的专业课知识,如:
Proteus仿真、C语言、模拟和数字电路知识等,并且也熟悉了keil环境下开发ARM的过程。
虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次嵌入式作品后的又一收获。
要做好一个作品,就必须做到:
在设计程序之前,对所用微控制器的内部结构有一个系统的了解,知道该控制器内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路。
要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计作品过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。
虽然作品做出来了,但是从中学到的知识会让我受益终身。
参考文献
[1]胡汉才.单片机原理及系统设计[M].北京:
清华大学出版社,2012.
[2]王守中.51单片机开发入门与典型实例[M].北京:
人民邮电出版社,2007.
[3]陈雪丽.单片机原理及接口技术[M].北京:
化学工业出版社,2005.
[4]薛均义,张彦斌.MCS-51系列单片微型计算机及其应用.西安:
西安交通大学出版社,2008.
[5]唐颖,程菊花,任条娟.单片机原理与应用及C51程序设计[M].北京:
北京大学出版社,2011
[6]钟勇,范森海,王永辉.高速公路事故的诱因及预防对策[J].公路交通科技.2010(6).
[7]郑安国.我国高速公路交通事故的基本特点与预防对策[J].公路交通科技学报.2012(4).
[8]陈晓东.郑建祥汽车用微机可靠性试验研究[J].汽车与电器.2009(增刊).
[9]周立功.发展有限公司.P89V51RD2器件手册.2013.3.
附录1:
电路图
附录2:
源代码设计
#include"lpc2103.h"
#defineucharunsignedchar
#defineBUSY1<<11
#defineRS1<<12
#defineRW1<<13
#defineEN1<<15
ucharhello[]="Hello!
Smilence_L";
ucharL1[]="0123456789ABCDEFGHIJKLMN";
ucharL2[]="ABCDEFGHIJKLMN9876543210";
//****毫秒延时函数*****//
voidDelay10ms(ucharc)
{
uchara,b;
for(;c>0;c--)
{
for(b=38;b>0;b--)
{
for(a=130;a>0;a--);
}
}
}
voiddelay(ucharc)
{
uchara,b;
for(;c>0;c--)
{
for(b=200;b>0;b--)
{
for(a=220;a>0;a--);
}
}
}
//******液晶屏繁忙检测******//
voidcheckbusy()
{
IODIR=0x0000b000;//将P0^12,P0^13,P0^15设置为输出口
while
(1)
{
IOCLR|=RS;//RS管脚清零,选择命令
IOSET|=RW;//RW管脚置1,选择读
IOSET|=EN;//EN管脚置1,使能端打开
if(!
(IOPIN&BUSY))//LCD1602的D0-D7中,D7=1为忙碌,0为空闲
break;
else
{Delay10ms
(1);
IOCLR|=EN;
}
}
IODIR=0x0000bff0;//设置P0.4-P0.13,及P0^15为输出
}
//********写命令操作函数*********//
voidlcd_wcom(ucharcom)
{
checkbusy();//在写命令之前检测液晶屏是否繁忙
IOCLR|=RS;//RS管脚清零,选择命令
IOCLR|=RW;//RW管脚清零,选择写操作
IOCLR|=0x00000ff0;//对D0-D7清零,防止因之前写入数据或命令产生干扰
Delay10ms
(1);
IOSET|=(com<<4);//对D0-D7写入命令
Delay10ms
(1);
IOSET|=EN;//EN管脚置1
Delay10ms
(1);
IOCLR|=EN;//EN管脚清零
}
//******写数据操作函数*****//
voidlcd_wdat(uchardat)
{
checkbusy();//检测液晶屏是否繁忙
IOSET|=RS;//RS管脚置1
IOCLR|=RW;//RW管脚清零
IOCLR|=0x00000ff0;//对D0-D7清零,防止因之前写入数据或命令产生干扰
Delay10ms
(1);
IOSET|=(dat<<4);//对D0-D7写入数据
Delay10ms
(1);
IOSET|=EN;//EN管脚置1
Delay10ms
(1);
IOCLR|=EN;//EN管脚清零
}
//****液晶屏初始化*******//
voidlcd_init()
{
lcd_wcom(0x38);//显示设定,显示为两行,5*7点阵
lcd_wcom(0x0c);//打开显示
lcd_wcom(0x06);//光标右移
}
//********滚动显示函数********//
voidriverlcd()
{
ucharLA1=0x80,LA2=0xc0,n=0;
for(;n<25;n++)
{
lcd_wcom(LA1);//在第一行显示
lcd_wdat(L1[n]);
lcd_wcom(LA2);//在第二行显示
lcd_wdat(L2[n]);
LA1++,LA2++;
delay(220);
if(n>15&&n<24)
{
lcd_wcom(0x18);//写满16个字符后,整个画面左移,达到滚动显示效果
}
}
}
voidmain()
{
uchari=0;
PINSEL0=0x00000000;//PINSEL0复位
PINSEL1=0x00000000;//PINSEL1复位
IODIR=0x0000bff0;//设置P0.4-P0.13,及P0^15为输出
Lcd_init();//液晶屏初始化
lcd_wcom(0x85);//从第一行第六位开始显示
for(;i<16;i++)
{
if(i==6)
lcd_wcom(0xc5);//从第二行第六位开始显示
lcd_wdat(hello[i]);
}
delay(220);
while
(1)//循环滚动显示
{
delay(200);
lcd_wcom(0x01);//清屏
delay(100);
riverlcd();//调用滚动显示函数