导航:首页 > 编程语言 > 液晶显示模块编程

液晶显示模块编程

发布时间:2022-07-09 09:27:14

Ⅰ FYD12864-0402B液晶显示模块C语言程序

/*此程序适用于FYD12864-0402B*/
#include <REG932.H>

#define uchar unsigned char
#define uint unsigned int

//uchar data CMD;
//uchar data DATA;
uchar idata busy,Line,Col;
sbit RS= P2^0;
sbit RW= P2^1;
sbit E= P1^7;
sbit LCD_LIGHT= P2^7;
sbit LCD_RST= P2^6;
code char STR1[]= "成都飞宇达";
code char STR2[]= "欢迎您";
code char STR3[]= "谢谢";
code char STR4[]= "SCCDCYB";

void Read_Busy();
void Delay100us(volatile uint n);
void Clear_LCD();
void Write_Single_CMD(uchar cmd);
void Write_Single_Data(uchar a);
void Init_LCD();
void Display(uchar *ptr,uchar ddram) ;
void Init_IO(void);
void Reset_St7920(void);
void DispSetCursor(uchar LineNum,uchar ColumnNum);

void main(void)
{
uchar i,j;
Init_IO();
Reset_St7920();
// LCD_LIGHT=1;
Clear_LCD();
Init_LCD();
Write_Single_CMD(0X01);
Display(STR1,0X80);
Display(STR2,0X90);
Display(STR3,0X88);
Display(STR4,0X98);
Delay100us(200);
Write_Single_CMD(0x80);
j=0;
for (i=0;i<32;i++)
{
Write_Single_Data(0xb4);
Write_Single_Data(0xde+j);
// Write_Single_CMD(0x01); //将光标移到0x9C
j++;
}
// Write_Single_CMD(0x01); //将光标移到0x9C
Write_Single_CMD(0x01); //光标移到0x9C
Write_Single_CMD(0x34); //将光标移到0x9C
Write_Single_CMD(0x36); //将光标移到0x9C
for (i=0;i<32;i++)
{
Write_Single_CMD(0x80+i);
Write_Single_CMD(0x80);
// Write_Single_CMD(0x01); //将光标移到0x9C
for (j=0;j<8;j++)
{
Write_Single_Data(0x00);
Write_Single_Data(0x00);
}
}
for (i=0;i<32;i++)
{
Write_Single_CMD(0x80+i);
Write_Single_CMD(0x88);
// Write_Single_CMD(0x01); //将光标移到0x9C
for (j=0;j<8;j++)
{
Write_Single_Data(0x00);
Write_Single_Data(0x00);
}
}
for (i=0;i<32;i++)
{
Write_Single_CMD(0x80+i);
Write_Single_CMD(0x80);
// Write_Single_CMD(0x01); //将光标移到0x9C
for (j=0;j<8;j++)
{
Write_Single_Data(0xFF);
Write_Single_Data(0xFF);
}
}
for (i=0;i<32;i++)
{
Write_Single_CMD(0x80+i);
Write_Single_CMD(0x88);
// Write_Single_CMD(0x01); //将光标移到0x9C
for (j=0;j<8;j++)
{
Write_Single_Data(0xFF);
Write_Single_Data(0xFF);
}
}

// DispSetCursor(1,3);
// for (i=0;i<64;i++)
// {
// for (j=0;j<16;j++)
// {
// Write_Single_Data(0x3f);
// Write_Single_Data(0xff);
// }
// }

while(1)
{
}

}

void Init_IO(void)
{
P0M1=0X00;
P0M2=0X00; //P0=I/O
P1M1=0X00; //P1.4:输入(DR)
P1M2=0X00; //P1=P1.6为推挽,其它为I/O
P2M1=0X00; //P2.6、P2.7:输入(AM、CD)
P2M2=0X00; //P2=I/O
P3M1=0X00;
P3M2=0X00; //P3=I
}

void Read_Busy(void) //读忙操作
{
P0=0x0ff;
RS=0;
RW=1;
do{
E=1;
busy=P0;
E=0;
}while(busy>0x7f);
}

void Reset_St7920(void)
{
LCD_RST=0;
Delay100us(100);
LCD_RST=1;
Delay100us(200);
}

void Delay100us(volatile uint n)
{
uchar i;
while(n--)
for(i=0;i<40;i++)
;
}

void Write_Single_CMD(uchar cmd) //写单字节命令
{
Read_Busy();
RS=0;
RW=0;
E=1;
P0=cmd;
E=0;
P0=0xff;
}

void Write_Single_Data(uchar a) //写单字节数据
{
Read_Busy();
RS=1;
RW=0;
E=1;
P0=a;
E=0;
P0=0xff;
}

void Init_LCD(void) //初始化LCD模块
{
Write_Single_CMD(0x30); //功能设置--8BIT控制界面,基本指令集
Delay100us(10);
Write_Single_CMD(0x30); //功能设置--8BIT控制界面,基本指令集
Delay100us(5);
Write_Single_CMD(0X0C);
Delay100us(5);
Write_Single_CMD(0x01); //清除屏幕显示,将DDRAM的地址计数器清零
Delay100us(2);
Write_Single_CMD(0x06); //DDRAM的地址计数器(AC)加1
Delay100us(1);
}

void DispSetCursor(uchar LineNum,uchar ColumnNum)
{
uchar i=0x00;
switch(LineNum&0x0f) //确定行号
{
case 0x00: i=0x80; break;
case 0x01: i=0xa0; break;
case 0x02: i=0x88; break;
case 0x03: i=0xa8; break;
default : break;
}
i = (ColumnNum&0x0f)|i; //确定列号
Write_Single_CMD(i);

}

void Clear_LCD(void)
{
Read_Busy();
RS=0;
RW=0;
P0=0x01;
E=1;
E=0;
}

/*
void ExpandFucntionEnable(void)
Function:
*/
void ExpandFunctionEnable(void)
{
Write_Single_CMD(0x34);
}

/*
void ExpandFunctionDisable(void)
Function:
*/
void ExpandFunctionDisable(void)
{
Write_Single_CMD(0x30);
}

/*
void ClearScreen(void)
Function:
*/
void ClearScreen(void)
{
Write_Single_CMD(0x01);
Delay100us(100);
}

/*
void CursorGoHome(void)
Funtion:
Cursor go home,DDRAM's address counter 'AC=0x00'.
*/
void CursorGoHome(void)
{
Write_Single_CMD(0x02);
}

/*
void DisplayOn(void)
Function:
*/
void DisplayOn(void)

{
Write_Single_CMD(0x0d); //整体显示开,游标开,游标位置反白禁止

}

/*
void DisplayOff(void)
Function:
*/
void DisplayOff(void)
{
Write_Single_CMD(0x09);
}

/*
void IdleMode(void)
Function:
Expand instruction.
*/
void IdleMode(void)
{
Write_Single_CMD(0x01);
}

/*
void RollInstructionEnable(void)
Function:
Expand instruction.
*/
void RollInstructionEnable(void)
{
Write_Single_CMD(0x03);
}

/*
void RollInstructionDisable(void)
Function:
Expand instruction.
*/
void RollInstructionDisable(void)
{
Write_Single_CMD(0x02);
}

/*
void SetRollAddress(unsigned char WhichLine)
Function:
Expand instruction.
*/
void SetRollAddress(uchar WhichLine)
{
ExpandFunctionEnable();
RollInstructionEnable();
Write_Single_CMD(WhichLine|0x40);
ExpandFunctionDisable();
}

/*
void Sleep(void)
Function:
Expand instruction.
*/
void Sleep(void)
{
Write_Single_CMD(0x08);
}

/*
void Waken(void)
Function:
Expand instruction.
*/
void Waken(void)
{
Write_Single_CMD(0x0c);
}

/*
void NegativeDisplay(uchar WhichLine)
Function:
Expand instruction
WhichLine=1,2,3,4
*/
void NegativeDisplay(uchar WhichLine)
{
if(WhichLine>4)return;
if(WhichLine==0)return;
Write_Single_CMD((WhichLine-1)|0x04);
}

void Display(uchar *ptr,uchar ddram)
{
uchar i,l,x;
l=0;
if(ddram<0x88)
{ Line=0; } //定位行地址:第一行
else if(ddram<0xA0)
{ Line=2; } //定位行地址:第三行
else if(ddram<0xA8)
{ Line=1; } //定位行地址:第二行
else
{ Line=3; } //定位行地址:第四行

Col=0x0f&ddram; //定位列地址
if(Col>0x07)
{ Col=Col-0x08;}
x=Col*2;
Write_Single_CMD(ddram); // 定位显示起始地址
while ((ptr[l])!='\0')
{l++;}
for (i=0;i<l;i++)
{
Write_Single_Data(ptr[i]); //输出单个字符
x++;
if (x ==0x10)
{
x=0;
Line++;
switch (Line)
{
case 0:Write_Single_CMD(0x80);
break;
case 1:Write_Single_CMD(0xA0);
break;
case 2:Write_Single_CMD(0x88);
break;
case 3:Write_Single_CMD(0xA8);
}
if (Line>3)
{
Write_Single_CMD(0x80);
Line=0;
}
}
}
}

Ⅱ 51单片机的C语言液晶显示器编程中“首地址”是什么来的(什么意思)

举个例子,1602显示器,第一行第一个字符的地址是0x80,第二行开始的地址是0xC0,这就清楚了吧?在显示时先设置好地址,然后就可以写入要显示的字符了。

Ⅲ 关于单片机液晶屏LCD12864的程序

/*****************************************************************

*程序名称:带汉字库的12864液晶显示模块驱动

*程序功能:显示字符 、汉字和图片

*开发工具:Kile

* MCU型号:AT89S52-24PU

*时钟频率:11.0592MHZ

*程序作者:yuan

*版权说明:yuan

*****************************************************************/
#include<reg52.h>
#include "lcd.h"
#include "util.h"

sbit E=P1^5;//脉冲使能
sbit RW=P1^6;//读写选择
sbit RS=P1^7;//数据命令选择
sbit rst=P3^6;//12864复位

// 延时ms函数:

// 12864检查状态函数:
void Check12864State(void)
{

P0=0xff;
E=0;//读状态前三控制线的状态
RS=0;
RW=1;
E=1;//拉高,读状态
while((P0&0x80)==0x80);//等待空闲
E=0;//写命令后三控制线的状态
RS=1;
RW=0;

}

// 12864写命令函数:
void Write12864Command( unsigned char com)
{

Check12864State();//检查状态
P0=com;//赋值
E=0;//写命令前三控制线的状态
RS=0;
RW=0;
E=1;//拉高,写命令
E=0;//写命令后三控制线的状态
RS=1;
RW=1;

}

//12864写数据函数:
void Write12864Data( unsigned char dat)
{

Check12864State();//检查状态
P0=dat;//赋值
E=0;//写数据前三控制线的状态
RS=1;
RW=0;
E=1;//拉高,写数据
E=0;//写数据后三控制线的状态
RS=0;
RW=1;

}

//在指定的位置显示字符串(汉字和ASCII码字符)函数:
void LCD12864DisplayString( unsigned char y,unsigned char x, unsigned char *pstr)
//y-行数值0-3,x-列数值0-7,pstr-字符串指针
//12864可以显示32个汉字(四行每行8个),一个地址对应一个汉字
//可以显示64个ASCII码字符(四行每行16个),一个地址对应两个字符
//为了实现自动换行功能,这个函数比较繁琐
{

unsigned char row,n=0;
Write12864Command(0x30);//基本指令
Write12864Command(0x06);//地址计数器自动加以,光标右移
switch(y)//根据行号选择行地址
{

case 0:row=0x80;break;//第一行首地址
case 1:row=0x90;break;//第二行首地址
case 2:row=0x88;break;//第三行首地址
case 3:row=0x98;break;//第四行首地址
default:;

}

Write12864Command(row+x);//写地址
while(*pstr!='\0')
{

Write12864Data(*pstr);//写字符
pstr++;
n++;//计数
if((n+x*2)==16)//如果一行写完 ,继续写第二行
{
if(y==0) Write12864Command(0x90);//写下一行地址
else if(y==1) Write12864Command(0x88);//写下一行地址
else if(y==2) Write12864Command(0x98);//写下一行地址
else ;

}
else if((n+x*2)==32)//如果第二行写完 ,继续写第三行
{

if(y==0) Write12864Command(0x88);//写下一行地址
else if(y==1) Write12864Command(0x98);//写下一行地址
else ;
}

else if((n+x*2)==48)//如果第三行写完 ,继续写第四行
{
if(y==0) Write12864Command(0x98);//写下一行地址
else ;
}
else ;
}

}

//图片模式清屏函数:
void Clear12864Screen()
{

unsigned char i,j;
Write12864Command(0x34);//功能设定:8位控制方式,使用扩充指令
Write12864Command(0x36);//使用扩充指令,绘图显示控制
for(i=0;i<32;i++)

//ST7920可控制256*32点阵(32行256列),而12864液晶实际的行地址只有0-31行,

//12864液晶的32-63行的行是0-31行地址从第128列划分一半出来的,所以分为上下两半屏,

//也就是说第0行和第32行同属一行,行地址相同;第1行和第33行同属一行,以此类推

{

Write12864Command(0x80|i);//写行地址(垂直地址)
Write12864Command(0x80);//写列地址(水平地址)
for(j=0;j<32;j++)
Write12864Data(0x00);//清屏

}

}

//在任意位置显示任意大小的图片函数:

void LCD12864DisplayPictrue(unsigned char y,unsigned char x,

unsigned char px,unsigned char py, unsigned char *pp)

//y-起始行(数值0-63),x-起始列(16位宽,数值0-7),

//px-图片宽度,py-图片高度,pp-指针指向图片数组

//因为上下屏的地址不连续,要在任意位置显示完整的图像,处理起来比较繁琐

{

unsigned char i,j,k;
Clear12864Screen();//清屏
if(y<32)//如果起始行在上半屏
{

k=32-y;//算出上半屏的行数
for(i=0;i<k;i++,y++)//上半屏行数
{
Write12864Command(0x80|y);//写行地址(垂直地址)
Write12864Command(0x80|x);//写列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//写图片数据

}

y=0;//下半屏起始行,接上半屏继续写数据
for(;i<py;i++,y++)//下半屏剩下的行数
{

Write12864Command(0x80|y);//写行地址(垂直地址)
Write12864Command(0x80|(8+x));//写列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//写图片数据

}

}

else //如果起始行在下半屏

{

for(i=0;i<py;i++,y++)//行数
{
Write12864Command(0x80|(y-32));//写行地址(垂直地址)
Write12864Command(0x80|(8+x));//写列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//写图片数据

}

}

}

void Clear12864Text()
{
Write12864Command(0x34);//清屏
DelayMs(5);
Write12864Command(0x30);//清屏
DelayMs(5);
Write12864Command(0x01);//清屏
DelayMs(5);
}

//12864初始化函数:
void Initialize12864()
{

rst=0;//复位12864
DelayMs(30);
rst=1;
DelayMs(20);
Write12864Command(0x30);//功能设定:8位控制方式,使用基本指令
Write12864Command(0x08);//显示关
Write12864Command(0x01);//清屏
Write12864Command(0x06);//地址计数器加一、光标右移
Write12864Command(0x0c);//显示开

}

带字库的驱动

Ⅳ 跪求利用51单片机设计一个LCD液晶显示模块的毕业设计

#ifndef LCD_CHAR_1602_2005_4_9
#define LCD_CHAR_1602_2005_4_9

#include <intrins.h>

//Port Definitions**********************************************************
sbit LcdRs = P2^5;
sbit LcdRw = P2^6;
sbit LcdEn = P2^7;
sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

//内部等待函数**************************************************************************
unsigned char LCD_Wait(void)
{
LcdRs=0;
LcdRw=1; _nop_();
LcdEn=1; _nop_();
//while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,
//可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80
//实际硬件时打开此语句,重要!
LcdEn=0;
return DBPort;
}
//向LCD写入命令或数据************************************************************
#define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{
LcdEn=0;
LcdRs=style;
LcdRw=0; _nop_();
DBPort=input; _nop_();//注意顺序
LcdEn=1; _nop_();//注意顺序
LcdEn=0; _nop_();
LCD_Wait();
}

//设置显示模式************************************************************
#define LCD_SHOW 0x04 //显示开
#define LCD_HIDE 0x00 //显示关

#define LCD_CURSOR 0x02 //显示光标
#define LCD_NO_CURSOR 0x00 //无光标

#define LCD_FLASH 0x01 //光标闪动
#define LCD_NO_FLASH 0x00 //光标不闪动

void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}

//设置输入模式************************************************************
#define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00 // default

#define LCD_MOVE 0x01 // 画面可平移
#define LCD_NO_MOVE 0x00 //default

void LCD_SetInput(unsigned char InputMode)
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}

//移动光标或屏幕************************************************************
/*
#define LCD_CURSOR 0x02
#define LCD_SCREEN 0x08
#define LCD_LEFT 0x00
#define LCD_RIGHT 0x04
void LCD_Move(unsigned char object, unsigned char direction)
{
if(object==LCD_CURSOR)
LCD_Write(LCD_COMMAND,0x10|direction);
if(object==LCD_SCREEN)
LCD_Write(LCD_COMMAND,0x18|direction);
}
*/
//初始化LCD************************************************************
void LCD_Initial()
{
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
}

//************************************************************************
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
void Print(unsigned char *str)
{
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
/*
void LCD_LoadChar(unsigned char user[8], unsigned char place)
{
unsigned char i;
LCD_Write(LCD_COMMAND,0x40|(place*8));
for(i=0; i<8; i++)
LCD_Write(LCD_DATA,user[i]);
}
*/
//************************************************************************
#endif

Ⅳ 我想问,12864液晶显示模块,在编程时有9个汉字显示,设置0X80处开始显示。第九个汉字现在在哪个位子

我在做LCD12864实验时往第一行写得数据超了,它就显示到了第三行。
之后我仔细分析了下原因,因为第一行的起始地址是0x80,而第三行是0x88,仅相差8个字符,所以第一行显示的8个字符满了之后,在没有软件去写地址的情况下,地址指针就从0x87跳到了0x88,所以就显示到了第三行;同理,往第二行0x90写满数据之后,没有软件去改变这个地址指针时它就自动增加到了0x98,就是第四行。
希望我的回答能帮助到你。

Ⅵ JLX液晶显示屏,使用C语言对Stm32编程,怎么样才可以使显示屏某个地方实现一闪一闪的效果

TFT-LCD即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD也被叫做真彩液晶显示器。
上一节介绍了OLED模块,这一节,我们给大家介绍ALIENTEK TFTLCD模块,该模块有如下特点:
1,2.4’/2.8’两种大小的屏幕可选。
2,320×240的分辨率。
3,16位真彩显示。
4,自带触摸屏,可以用来作为控制输入。
5,通用的接口,除了ALIENTEK MiniSTM32开发板,该液晶模块还可以使用在优异特、STMSKY、红牛等开发板上。
本节,我们以2.8寸的ALIENTEK TFTLCD模块为例介绍,该模块采用的是显尚光电的DST2001PH TFTLCD,DST2001PH的控制器为ILI9320,采用26万色的TFTLCD屏,分辨率为320×240,采用16位的80并口。

Ⅶ 液晶显示器320240,C语言

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

阅读全文

与液晶显示模块编程相关的资料

热点内容
同城公众源码 浏览:474
一个服务器2个端口怎么映射 浏览:282
java字符串ascii码 浏览:59
台湾云服务器怎么租服务器 浏览:460
旅游手机网站源码 浏览:315
android关联表 浏览:929
安卓导航无声音怎么维修 浏览:320
app怎么装视频 浏览:423
安卓系统下的软件怎么移到桌面 浏览:80
windows拷贝到linux 浏览:753
mdr软件解压和别人不一样 浏览:886
单片机串行通信有什么好处 浏览:324
游戏开发程序员书籍 浏览:848
pdf中图片修改 浏览:275
汇编编译后 浏览:478
php和java整合 浏览:833
js中执行php代码 浏览:447
国产单片机厂商 浏览:62
苹果手机怎么设置不更新app软件 浏览:289
转行当程序员如何 浏览:498