液晶显示器320240,C语言

液晶显示器320240,C语言,第1张

1 引言

图形点阵液晶显示模块由于具有显示信息丰富、功耗低、体积小、重量轻、寿命长、不产生电磁辐射污染等优点而成为单片机系统中理想的显示器件,并被广泛应用于单片机控制的智能仪器仪表、工业控制领域、通信器材和家用电器中。但普通图形点阵液晶显示模块用于显示图形界面时是非常困难的,首先图形显示要占用大量的用户ROM空间。以320×240点阵液晶模块为例,显示一幅图片(全屏幕)占用的ROM空间为�320×240 /8=9.6k Byte,这对片内仅有几k字节的FLASH闪存单片机来说是不可能的;其次,显示图片过程极其复杂,应根据待显示的图形计算好各点阵的位置,再以字节为单位写入数据来控制各点阵的亮灭。如果显示多幅图片,复杂程度更加令人生畏。

另外,图形点阵液晶显示模块在显示汉字时也存在着占用ROM容量大、与单片机的硬件接口电路复杂以及接口时序复杂,软件编程繁复等问题。

正是由于上述几点不足限制了图形点阵液晶显示模块在生成复杂精美的中文人机界面时的应用。而中文界面及图形显示又是电子产品人机界面发展的必然趋势。实际上任何一种显示界面本质上都是由若干像素排列组合生成,若能将图形点阵液晶模块显示控制的底层 *** 作集成在模块内的单片机中,并将生成显示界面中所用到的各种图形界面和标准汉字库预先存入模块中,用户使用时就可以仅通过串口向其发送简单的控制命令以生成图文显示界面,从而使得复杂的图形界面生成变得简单容易,最终解决电子产品开发过程中难以生成精美的人机界面的难题。

VLCM320240即是一款具有上述功能的图形点阵液晶模块。该模块是由深圳研安佳公司推出的。

2 VLCM320240性能特点

VLCM320240图形点阵液晶显示模块具有如下主要特点:

● 该液晶显示模块采用台湾EDT公司的蓝膜负显EW32F10BCW�它具有320×240的点阵分辨率和CCFT背光源;

● 内部含有台湾华邦公司生产的高速单片机档埋W78E516BP;

● 内含GB2312 16×16点阵国标一级、二级简体字库,字库中的汉字可显示在液晶屏的任意位置;

● 内含ASCⅡ 8×16点阵英文字库;

● 内含64kB自造图库或美术字库、显示资料现场可在线编程FLASH;

● 内含SED1330F LCD控制器及32kB显示缓冲区;

● 配套Visual LCM仿真调试软件可在电脑上独立完成显示界面的编辑、资料下载及界面生成;

● 具有标准RS232串行通信控制,可方便地由上位计算机或单片机进行控制;

● 具有最小的硬件资源占用,使用单片机做上位机时,可使用两根I/O口线模拟串口,而使用TTL电平控制历皮时,仅需一根I/O口线。

VLCM320240留给用户的接口有两个,即电源口POWER和RS232通信口。

其中电源口包括以下几个端口:

●+9V电源:稳压后供给单片机;

●GND:模块电源地;

●+5V电源:供逆变器使用。

RS232口定义如下:

●BUSY:忙标志输出,低电平时为忙;

●RX:控制命令输入,其中有8位数据位,行烂蚂1个起始位,一个停止位;

●GND:信号地。

3 用户命令

在具体使用时,可通过上位机的用户命令来控制VLCM320240的显示.

汉字或ASCII字符显示命令中的参数为所显示汉字的两个字节国标码或ASCII字符代码。

4 具体应用

VLCM320240可视化编程液晶显示模块可广泛应用于显示信息内容丰富或显示信息容量巨大的应用场合,如信息家电,通信器材、工业控制、智能仪器仪表等领域,模块在使用时可分为显示界面生成及实时显示两个步骤。

4.1 显示界面的模拟生成

显示界面的生成在上位计算机上完成,利用可视化编程软件Visual LCM可将系统设计中用到的各种图形或文字进行归纳并编辑成图案,但图案的大小不得超过320×240像素,同时图案必须选为黑白两色。然后将编辑好的图案下载到模块ISP FLASH存储器中,图案的数量应小于256幅。对于显示较多的文字信息,也应尽量生成美观的艺术字体并保存为图案。这样可大大加快文字信息的显示速度。图案下载到模块后,可通过串口发送BMP命令以便将任意一张图片在液晶模块的任意位置上显示。

4.2 实时信息显示

由上位计算机生成的各种图形信息最终要在单片机的控制下实现相应信息的显示。图1所示是以AT89C52为例给出的单片机与VLCM320240的接口电路。

在图1所示的电路中,AT89C52的RXD端与VLCM320240RS232通信口的BUSY端相连,而将单片机TXD端与模块RX端相连,为保证波特率的准确性,应将AT89C52的晶振选取为11.0592MHz。此外,在编制相应的显示控制软件时,还应注意以下几点:

●串行口模式应设为模式1(1个起始位,8个数据位,1个停止位);

●波特率设应当为19200(TH1=TL1=0FDH,SMOD=1);

●在发送命令之前应检测模块为闲态(BUSY=1)�否则所发的命令可能失效;

●串口发送的必须是完整命令的ASCII码(汉字为其机内码,ASCII字符为其ASCII码),如命令“BMP0B000C0D”,实际由串口发送的内容是“424D503042303030433044”,顺序为:

“B→M→P→0→B→0→0→0→C→0→D”;

●在每条命令的首末还要加上命令结束码“回车键”的ASCII码“0DH”,以表明该命令的结束。

●若单片机AT89C52的串口已被占为它用,那么用一根口线来摸拟生成一个通讯协议为(19200,N,8,1)的软串口发送命令即可。

下面给出与上述电路配套的显示控制子程序:

; 位定义

BUSY BIT P3 ; 定义忙信号线

; 数据字节定义

X V EQU 30H; 定义参数x

XH V EQU 31H; 定义参数xH

Y V EQU 32H; 定义参数y

NUBER EQU 33H; 定义参数n

WIDTH EQU 34H; 定义参数w

HIGHT EQU 35H; 定义参数h

ASC XH EQU 36H; 定义参数x高四位

ASC XL EQU 37H; 定义参数x低四位

ASC XHH EQU 38H; 定义参数xH高四位

ASC XHL EQU 39H; 定义参数xH低四位

ASC YH EQU 3AH; 定义参数y高四位

ASC YL EQU 3BH; 定义参数y低四位

ASC NH EQU 3CH; 定义参数n高四位

ASC NL EQU 3DH; 定义参数n低四位

ASC WH EQU 3EH; 定义参数w高四位

ASC WL EQU 3FH; 定义参数w低四位

ASC HH EQU 40H; 定义参数h高四位

ASC HL EQU 41H; 定义参数h低四位

;初始化子程序

INIT SIO:MOV SCON,#50H;串行口方式1

MOV TMOD,#21H

MOV TH1,#0FDH;波特率=19200�

MOV TL1�#0FDH

ORL PCON�#80H;SMOD=1

SETB TR1 ; 启动T1

RET

;设置汉字或ASCII字符显示首地址命令

ORDER HZA:MOV A� X V

MOV R0� #REG ASC XH

LCALL H ASC ;将参数x转换为

两个字节的ASCII码

MOV A�XH V

MOV R0� #REG ASC XHH

LCALL H ASC ; 将参数xH转换为

两个字节的ASCII码

MOV A�Y V

MOV R0� #REG ASC YH

LCALL H ASC ;将参数y转换为

两个字节的ASCII码

LCALL BUSY CK

MOV A� #“H” ;发送命令码HZA

的ASCII码

LCALL SEND BYTE

MOV A�#“Z”

LCALL SEND BYTE

MOV A� #“A”

LCALL SEND BYTE

MOV R0� #REG ASC XHH

LCALL SEND CS;发参数H的ASCII码

MOV R0� #REG ASC XH

LCALL SEND CS;发参数x的ASCII码

MOV R0� #REG ASC YH

LCALL SEND CS;发参数y的ASCII码

LJMP ORDER END

;显示汉字串子程序

ORDER HZ� LCALL BUSY CK;检测模块闲状态

MOV A� #“H”

LCALL SEND BYTE

MOV A�#“Z”

LCALL SEND BYTE

MOV A� #“D”

LCALL SEND BYTE

NEXT HZ: CLR A; 取汉字的高八位内码

MOVC A,@A+DPTR

INC DPTR;调整内码指针

LCALL SEND BYTE

CLR A; 取汉字的低八位内码

MOVC A,@A+DPTR

INC DPTR;调整内码指针

LCALL SEND BYTE

DJNZ R7,NEXT HZ

MOV A,#0DH;命令结束

LCALL SEND BYTE

RET

;显示ASCII字符串子程序

ORDER ASCII:

LCALL BUSY CK

MOV A,#“H”;

LCALL SEND BYTE

MOV A,#“Z”

LCALL SEND BYTE

MOV A�#“D”

LCALL SEND BYTE

NEXT ASCII� CLR A �取ASCII码

MOVC A�@A+DPTR

INC DPTR

LCALL SEND BYTE

DJNZ R7�NEXT ASCII

MOV A�#0DH

LCALL SEND BYTE

RET

;清屏子程序

ORDER CLR:LCALL BUSY CK

MOV A,#“C”

LCALL SEND BYTE

MOV A�#“L”

LCALL SEND BYTE

MOV A� #“R”

LCALL SEND BYTE

LJMP ORDER END

;显示下载到模块内图形子程序

ORDER BMP:MOV A,X V

MOV R0, #REG ASC XH

LCALL H ASC ;将参数x转换为两个

字节的ASCII码

MOV A,XH V

MOV R0�#REG ASC XHH

LCALL H ASC ;将参数xH转换为两

个字节的ASCII码

MOV A,Y V

MOV R0, #REG ASC YH

LCALL H ASC ;将参数y转换为两个

字节的ASCII码

MOV A,NUBER

MOV R0�#REG ASC NH

LCALL H ASC ;将参数n转换为两

个字节的ASCII码

LCALL BUSY CK ;检测模块闲状态

MOV A,#“B” ; 先发送命令码

BMP的ASCII码

LCALL SEND BYTE

MOV A,#“M”

LCALL SEND BYTE

MOV A�#“P”

LCALL SEND BYTE

MOV R0, #REG ASC NH

LCALL SEND CS;发参数n的ASCII码

MOV R0, #REG ASC XHH

LCALL SEND CS;发参数xH的ASCII码 MOV R0,#REG ASC XH

LCALL SEND CS;发参数x的ASCII码

MOV R0, #REG ASC YH

LCALL SEND CS;发参数y的ASCII码

ORDER END:MOV A,#0DH ;发送命令结标

志“0DH”

MOV SBUF,A

JNB TI,$

CLR TI

RET

;结束上次命令子程序

BUSY CK: MOV A,#0DH

MOV SBUF,A

JNB TI,$

CLR TI

JNB BUSY�$

RET

;发送参数子程序

SEND CS: MOV A,@R0

LCALL SEND BYTE

INC R0

MOV A,@R0

LCALL SEND BYTE

RET

;发送字节数据子程序

SEND BYTE: MOV SBUF,A

JNB TI,$

CLR TI

RET

TAB HZ: DB “汉字内码表”

TAB ASCII: DB “ASCII字符表”

5 结束语

VLCM320240可视化编程液晶显示模块由于可将系统中用到的画面预置到液晶显示模块内部,因而使得图形界面与中文界面的生成变得非常容易,因此,该模块无疑将是显示信息要求较高的应用领域中理想的显示器件选择之一。

关于串口设备,最好联系厂家询问是否提供API接口。

关于API接口一般是一个可供调用的DLL文件。

如果有可以直接旅裂扒在C#中引用,作为类库来 *** 作设备。

具体调用方式需要询问厂家或参阅api的文档说明。

不提供软件接口的设备是无法进行开发的。

我大概源祥搜了下这个设备,设备是提供配套软件的,那么这款设备是有相关通讯接口类库的,也就是可以用C#进行开发。

如果找不到API文档,

请尝试用串口调试工具,跟踪配套软件的每一步 *** 作,获取串口通讯报文,拆昌用C#模拟 *** 作报文自己封装通讯类后进行开发。

没能直接找出你程序的明显问题,但有几点可以考虑下:

void LCD_Status()中,仔细对照12864的说明书,看你口线的 *** 作逻辑,是否完全符合说明书。你写开关屏命令正确,但也并不能保证逻辑就是正确的,Y? 因为你锁出去的数据是不同的,不仔细看你程序,理论上讲,对后续的程序的影响是不一样的。不同厂家的LCD *** 作,大同小异,但确实各有不同之处。

在AVR中,asm("郑册nop")是可以用NOP()来代替的,后者比前者看起来舒服些。

你没说你的CPU连接LCD的排线的长度,此长度小于5cm时,考虑可以很少;>10cm时,需要考虑电容效应,信号会被延裂高迟,肆丛尺你程序中NOP()的个数可能会不够,因为AVR的机器周期其实是可以小于us级的(看你的晶振速度了),一个NOP可能起不到作用,需要N个。

个人观点供参考,我用LCD时,根本就不去查询LCD是否繁忙,因为现在的LCD接收端口都是硬件锁存的,速度非常快,根本不会出现繁忙拥堵的情况。下面是我使用320240LCD的写命令和数据的函数,没查询,大量使用从来也不出问题:

void LcmWriteADataByte(uchar mydata)     //写数据.

{

 pinLcmA00()

 LCM=mydata

 NOP()

 pinLcmCS0()

 pinLcmWR0()

 NOP()

 pinLcmWR1()

 pinLcmCS1()

}

void LcmWriteAControlByte(uchar mycommand)    //写指令.

{

 pinLcmA01()

 LCM=mycommand

 pinLcmCS0()

 pinLcmWR0()

 NOP()

 pinLcmWR1()

 pinLcmCS1()

 pinLcmA01()

}

总结,不正常工作最可能的两个原因(不是全部原因):A逻辑不完全符合说明书;B延时不够,或某些地点漏做延时了。希望有所帮助。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12333959.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存