您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 基于单片机的LED显示屏硬件设计方案
基于单片机的LED显示屏硬件设计方案摘要:设计使用8位单片机STC12C5A60S2作为中央控制器,结合NAND闪存芯片K9F4008存储汉字库的8×128点阵LED数字屏,该点阵LED数字屏具有存储信息后离线显示的功能。可应用到多种显示环境,尤其像汽车等移动工具上的脱机显示环境。自上世纪90年代以来,随着LED显示屏显示技术设计制造水平的不断提高,LED数字屏逐渐在生产和生活中大量使用,LED数字屏以其特有的显示介质,在大面积,全天候,高亮度和超高亮度显示屏领域凸现优势。LED显示技术发展的十几年中,新器件和新技术不断采用,制造成本逐渐降低,生产分工不断细化,但大量应用的同时也暴露出LED显示技术的若干缺陷,总体上技术尚未成熟,标准尚未完全建立,有许多方面值得进行更深入的研究与改进。随着大规模集成电路的迅猛发展,微处理器的运算、控制能力大大增加,单片计算机已在很多工业及民用系统中承担智能化的任务,与迅猛发展的运算速度相比,其端口扩展能力则逊色得多(数目有限且扩展困难),因此研发过程中不得不在节省端口上投入大量精力,目前国内为解决端口扩展问题可采用软件处理的方式,这样加重了软件编写的难度,或采用扩展端口的专用芯片。这两种方法将引起软件成本的提高或硬件电路复杂度的提高,不利于一些小型系统的研发,STC12C5A60S2单片机具有多种串行传输模式,在一定程度上解决了这个矛盾。LED数字屏应用非常广泛,不仅能显示文字,还能显示各种图形、图表,甚至各种动画效果,是广告宣传、新闻传播的有力工具。本文采用STC12C5A60S2单片机、接口NAND闪存和上位PC机,实现了对16×128点阵LED数字屏的控制。1芯片选型1.1屏体由于LED显示屏体是商业成品,因此系统芯片的选型首选为能与屏体配合的芯片。屏体自备电源,能直接将蓄电池的能量转变为5V的直流电源,并且这个电源也通过屏体的接口电缆输出到系统板上。因此系统可直接引用该电源,不必自备电源电路。1.2单片机综合考虑屏体和系统需求,选用单片机STC12C5A60S2。STC12C5A60S2是新一代高速8051单片机,其指令代码完全兼容传统8051,但速度快8~12倍。内部集成MAX810专用复位电路,其工作电压范围是3.5V~5.5V,满足要求的电压。由于是单周期的8051(传统8051是12周期),可选择较易于获得准确波特率的11.0592MHz晶振,而不必担心工作速度降低。STC12C5A60S2有60KB的用户应用程序空间,256B的RAM和1024B的XRAM.能满足程序代码的需求和缓冲区定义的需求。另有与程序存储空间独立的一片闪存区域,可在应用编程中作EEPROM使用。STC12C5A60S2有双UART以及ISP串口,串口资源足够系统使用。使用UART可很容易地实现程序下载。STC12C5A60S2有36个通用I/O口,大部分可位控,并具有强推挽输出的能力,足够系统使用。STC12C5A60S2有4个16bit定时器和一个独立的波特率发生器,另外还有两个PCA模块,能获得丰富的定时器资源。STC12C5A60S2有PDIP-40封装的芯片,易于快速进入实验。1.3闪存因为16×16点阵的汉字库容量在250KB左右,而MCS51的寻址空间只有64KB.接口大于64KB容量的普通存储芯片就必须进行总线扩展,采用两次锁存地址的方法来读写,既需要复杂的电路,又占用较长的存取时间。同样,NOR闪存与EPROM的引脚结构相类似,有同样的接口复杂性,成本也十分高。要实现单片机与字库芯片的简单接口(不需扩展),只能选用串行结构的存储器或命令、地址和数据复用总线结构的存储器。串行结构的存储器多为EEPROM,没有很大的容量,不适合做字库芯片。因此只有选用命令、地址和数据复用总线的NAND闪存作为字库存储芯片。字库所需的容量不大,但最好能5V供电,且编程的缓存要求较小的芯片。K9F4008W是一款512KB的NAND闪存,仅有8个IO端口,且工作电压范围较广(3V~5.5V),可以兼容3V和5V的硬件系统,并且帧编程时仅需要32B的缓冲,正适合作为字库存储的芯片。因此,闪存芯片的可电擦写特性页非常适用于需要更换字库的场合。故该芯片是十分理想的汉字库存储器。3总体设计3.1屏体接口模块LED显示屏屏体接口包括屏体接口头文件、屏幕缓冲区的定义、屏体接口初始化、刷新定时器中断服务程序和SPI中断服务程序几个部分。屏体接口的头文件screen.h应该使屏幕缓冲区对其他应用可见,并提供屏体初始化函数。具体定义如下:#ifndef_SCREEN_H_#define_SCREEN_H_#includeincboard.hexternu8xdataSCR_BUF[16][16];voidscreen_init(void);#endif这样就把屏幕缓冲区的结构暴露给应用,但应用不必关心具体的屏幕刷新操作。具体LED显示屏屏体接口的实现集中在一个文件screen.c中定义。具体如下:首先是屏幕缓冲区定义:u8xdataSCR_BUF[16][16]_at_0x0000;//~0x00ff256Bytes其次是当前显示行和输出列变量定义,属于静态变量,应用程序不可见。staticu8datarow,col;然后是屏幕初始化,包括刷新定时器0的初始化、SPI的初始化、锁存bLatch信号的初始化、屏幕缓冲区的初始清零以及定时器和SPI中断的优先权和使能位的初始化代码略。SPI和定时器0的中断服务程序是屏体接口的关键。定时器0的中断服务程序首先进行扫描行增量取模运算,并将扫描行输出。然后依据扫描行取出屏幕缓冲区对应行的第一个字节发送到SPI端口。同时列增量。voiddisplay_ONe_screen(void)interrupt1using3{row=(++row)&0x0f;P0=(P0&0xf0)|((~row)&0xf);col=0;SPDAT=~SCR_BUF[row][col++];}这样编写的屏体驱动,应用只要在初始化屏体后,向屏幕缓冲区中写入要显示的数据即可,而不必关心屏幕显示的细节。3.2UART接口UART接口负责与上位机的数据收发,尽管发送可以同步进行,但接收必须异步进行。因而UART接口的核心仍然应该是一个中断服务程序。UART接口的头文件uart.h隐藏了接收缓冲区的信息,用户可调用的函数只有初始化、发送和接收。#ifndef_UART_H_#define_UART_H_voiduart_init(void);voiduart_put_c(u8ch);u8uart_get_c(u8*);#endifUART的接口实现首先定义一个接收缓冲FIFO,以及对FIFO的读下标uart_rd和写下标uart_wr,他们都是文件内可见的静态变量:staticu8xdatauart_buf[64];staticu8uart_rd,uart_wr;bitfSendUART的初始化包括进行FIFO的初始化和UART格式、波特率、中断的初始化。代码略。UART的ISR主要是服务于接收,无条件地将数据装入FIFO,并调整写入指针。staticvoiduart_isr(void)interrupt4using1{if(RI){RI=0;uart_buf[uart_wr++]=SBUF;uart_wr&=0x0f;}}提供给用户的发送程序首先检测发送结束标记,如果为0,表示上次发送尚未结束,直接返回错误信息1。否则将要发送的信息发送并清零发送结束标记。这样设计的发送程序,其目的是将发送等待不限制在接口底层,而是给上层一个决定是否等待发送结束的机会。u8uart_put_c(u8ch){if(!TI)return1;TI=0;SBUF=ch;return0;}同样,接收程序也给上层一个选择等待的机会。接收函数首先判断接收FIFO是否为空,如果为空或输入指针参数错误,则直接返回错误,否则才从FIFO中读取数据并将数据存储到指针指向的地址,然后返回成功。u8uart_get_c(u8*ch){u8i;if(!ch)return1;if((i=(uart_rd+1)&0x0f)==uart_wr)return1;uart_rd=i;*ch=uart_buf[i];return0;}3.3闪存接口闪存的存取有特殊的时序,闪存的内部结构也和具体应用要求有很大的不同。因此闪存的接口需要仔细设计。K9F4008闪存芯片的存储结构组织如图2所示。K9F4008闪存的存储以块为单位,每个芯片共有128块。每块有32行,每行有4个帧,每帧含有32B.全部芯片为512KB。闪存接口提供的闪存初始化函数中就包括对这样情况的处理。初始化函数要从闪存的第一个块中读出一个块映射表,该表下标是逻辑扇区,表内每项存储的是该逻辑扇区对应的物理块编号。初始化函数在必要时对闪存进行读写校验,然后将坏块从表中删除。再寻找新的良好块,将其编号填入到对应逻辑扇区的表项中。这样对应用来说,只见到连续的扇区编号,而不知道扇区究竟对应到那个块。闪存的接口头文件Flash.h如下:#ifndef_K9F4008_H_#define_K9F4008_H_voidread_log_page(u8sector,u8page,u8xdata*buf);u8prog_log_page(u8sector,u8page,u8xdata*buf);voiderase_log_blk(u8sector);bitflash_init(void);#endif实现闪存的接口,首先就是依据说明书的时序定义闪存的基本操作。这里是以宏定义实现基本操作的。#defineW_CMD(cmd_)bCLE=1;bWE=0;P2=(cmd_);bWE=1;bCLE=0#defineW_ADDR(addr1_,addr2_,addr3_)bALE=1;bWE=0;P2=(addr1_);bWE=1;bWE=0;P2=(addr2_);bWE=1;bWE=0;P2=(addr3_);bWE=1;bALE=0#defineW_DAT(dat_)bWE=0;P2=(dat_);bWE=1#definewait_RBwhile(!bRB)#definel2p(x_)fat_tbl[(x_)]3.4EEPROM内部集成的EEPROM是与程序空间分开的,利用ISP/IAP技术可将内部DATAFLASH当EEPROM,擦写次数10万次以上。EEPROM可分为若干个扇区,每个扇区包含512B.使用时,建议同一次修改的数据放在同一个扇区,不是同一次修改的数据放在不同的扇区,不一定要用满。数据存储器的擦除操作是按扇区进行的。sfrIAP_DATA=0xC2;//FlashdataregistersfrIAP_ADDRH=0xC3;//FlashaddressHIGHsfrIAP_ADDRL=0xC4;//FlashaddressLOWsfrIAP_CMD=0xC5;//FlashcommandregistersfrIAP_TRIG=0xC6;//FlashcommandtriggersfrIAP_CONTR=0xC7;//Flashcontrolregister根据使用说明对EEPROM的寄存器进行定义。文章由视爵光旭LED显示屏公司编写
本文标题:基于单片机的LED显示屏硬件设计方案
链接地址:https://www.777doc.com/doc-3489597 .html