導航:首頁 > 編程語言 > 液晶顯示模塊編程

液晶顯示模塊編程

發布時間: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可視化編程液晶顯示模塊由於可將系統中用到的畫面預置到液晶顯示模塊內部,因而使得圖形界面與中文界面的生成變得非常容易,因此,該模塊無疑將是顯示信息要求較高的應用領域中理想的顯示器件選擇之一。

閱讀全文

與液晶顯示模塊編程相關的資料

熱點內容
單片機串列通信有什麼好處 瀏覽:319
游戲開發程序員書籍 瀏覽:843
pdf中圖片修改 瀏覽:268
匯編編譯後 瀏覽:474
php和java整合 瀏覽:829
js中執行php代碼 瀏覽:440
國產單片機廠商 瀏覽:57
蘋果手機怎麼設置不更新app軟體 瀏覽:284
轉行當程序員如何 瀏覽:492
蘋果id怎麼驗證app 瀏覽:864
查看手機命令 瀏覽:953
抖音反編譯地址 瀏覽:226
如何加密軟體oppoa5 瀏覽:233
java從入門到精通明日科技 瀏覽:95
拆解汽車解壓視頻 瀏覽:598
新版百度雲解壓縮 瀏覽:592
android上下拉刷新 瀏覽:880
centos可執行文件反編譯 瀏覽:839
林清玄pdf 瀏覽:271
黑馬程序員java基礎 瀏覽:284