當前位置:編程學習大全網 - 編程語言 - 液晶顯示編程

液晶顯示編程

# include & ltAT89C51XD2。H & gt

# include & ltABSACC。H & gt

# include & ltINTRINS。H & gt

#包含“common.h”

#定義屏幕寬度0x20

extern struct Pic * point _ Pic 1;

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

# define command _ port x byte[0x 8001]//定義命令端口地址。

# define data _ port x byte[0x 8000]//定義數據端口地址。

#define CODESTATE 0x01 //定義檢測位。

#定義數據狀態0x02

#定義數據自動讀取0x04

#定義數據自動寫入0x08

#定義控制器0x20

#定義屏幕拷貝0x40

#定義BLINKCONTITION 0x80

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

//檢查狀態

易失性位校驗狀態(uchar校驗位)

{

烏恰爾州;

state = COMMAND _ PORT

開關(檢查位)

{

案例代碼狀態:

{

如果(狀態& amp0x01)

返回1;

其他

返回0;

}

案例數據狀態:

{

如果(狀態& amp0x02)

返回1;

其他

返回0;

}

案例數據自動讀取:

{

如果(狀態& amp0x04)

返回1;

其他

返回0;

}

案例數據自動寫入:

{

如果(狀態& amp0x08)

返回1;

其他

返回0;

}

案例控制器:

{

如果(狀態& amp0x02)

返回1;

其他

返回0;

}

案例截圖:

{

如果(狀態& amp0x40)

返回0;

其他

返回1;

}

案例提示條件:

{

如果(狀態& amp0x80)

返回1;

其他

返回0;

}

}

}

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

//判斷自動書寫

void check_auto_write(void)可重入

{

而(!(check _ state(data auto write)));

}

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

volatile void check _ code _ data(void)可重入

{

而(!(check _ state(CODESTATE)));

而(!(check _ state(DATASTATE));

}

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

//指針設置

# define Set _ cursor _ pointer 0x 001//設置光標位置。

# define SET _ CG ram _ POINTER 0x 02//SET CG ram。

#定義設置地址指針0x04

Voidset _ point (uchari,uchar datadat1,uchar datadat 2)//要輸出到外部的數字要在數據區定義。

{

check_code_data()。

DATA _ PORT = dat 1;

check_code_data()。

DATA _ PORT = dat2

check_code_data()。

COMMAND _ PORT =(0x 20 | I);

}

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

//設置顯示模式

#定義邏輯_或0x00

#定義邏輯_XOR 0x01

#定義邏輯_和0x02

#define TEXT_CHAR 0x04

空設置_顯示_模式(uchar dat)

{

check_code_data()。

COMMAND _ PORT =(0x 80 | dat);

}

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

//顯示區域設置

#define TEXT_ADDRESS 0x00 //設置文本區的第壹個地址。

# define text _ width 0x 001//設置文本區域的寬度。

#define GRAPHIC_ADDRESS 0x02 //設置圖形區的頭地址。

#define GRAPHIC_WIDTH 0x03 //設置圖形區域的寬度。

void set_display_area(uchar i,uchar dat1,uchar dat2)

{

if((i==0x01)||(i==0x03))

dat 2 = 0;

check_code_data()。

DATA _ PORT = dat 1;

check_code_data()。

DATA _ PORT = dat2

check_code_data()。

COMMAND _ PORT =(0x 40 | I);

}

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

//顯示開關設置

#定義遊標LINK 0x01

#定義0x02上的光標

#在0x04上定義文本

#定義圖形圖標0x08

void set_display(uchar顯示模式)

{

check_code_data()。

COMMAND _ PORT =(display mode | 0x 90);

}

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

//光標形狀設置

//參數0-7

void set_cursor(uchar i)

{

check_code_data()。

COMMAND _ PORT =(0xa 0 | I);

}

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

//自動讀寫定義

#定義自動寫入0x00

#定義自動讀取0x01

#定義自動停止0x02

void set _ autoread write(uchar I)//可重入

{

check_code_data()。

COMMAND _ PORT =(0xb 0 | I);

}

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

//壹次性讀取定義

#定義寫地址添加0x00

#定義read_address_add 0x01

#定義寫地址_sub 0x02

#定義讀取地址子0x03

#定義寫地址nochange 0x04

#定義read_address_nochange 0x05

/* & amp;void set_once_read_write(uchar i,uchar letter)

{

check_code_data()。

DATA _ PORT = letter

check_code_data()。

COMMAND _ PORT =(0xc 0 | I);

}*/

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

//屏幕閱讀

/*void screen_read(無效)

{

check_code_data()。

COMMAND _ PORT = 0xe0

}*/

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

//屏幕復制

/*void screen_copy(無效)

{

check_code_data()。

COMMAND _ PORT = 0xe8

}*/

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

//位操作

//#定義set_bit 0x08

//#定義清零位0x00

/*void bit_operation(uchar op,uchar i)

{

check_code_data()。

COMMAND _ PORT =(0xf 0 | op | I);

}*/

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

/*void print_lcd(uchar str,uchar x,uchar y)

{

無符號整數地址;

addr = y * 16+x;

check_code_data()。

DATA _ PORT = addr

check_code_data()。

DATA _ PORT = addr & gt& gt8;

check_code_data()。

COMMAND _ PORT = 0x24

check_code_data()。

DATA _ PORT = str

check_code_data()。

COMMAND _ PORT = 0xc4

}*/

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

//顯示字符

void text _ display(uchar str)//可重入

{

//SET _ point(SET _ ADDRESS _ POINTER,lowaddr,high addr);

//set _ once _ read _ write(write _ address _ add,str-0x 20);

set_autoreadwrite(自動寫入);

check_auto_write()。

DATA _ PORT = str-0x 20;

set _ autoread write(AUTOSTOP);

}

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

//顯示字符串

void string _ display(uchar data * str,uchar lowaddr,uchar high addr)//可重入

{

set_point(SET_ADDRESS_POINTER,lowaddr,high addr);

set_autoreadwrite(自動寫入);

while(*str!='\0')

//set _ once _ read _ write(write _ address _ add,str[I]-0x 20);

{check_auto_write()。

DATA _ PORT = * str-0x 20;

str++;

}

set _ autoread write(AUTOSTOP);

}

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

//在代碼區域顯示字符串。

void string _ display _ code(uchar num,uchar code *str,uchar lowaddr,uchar high addr)//可重入

{

烏恰爾壹世;

set_point(SET_ADDRESS_POINTER,lowaddr,high addr);

set_autoreadwrite(自動寫入);

如果(數量==0)

{

while(*str!='\0')

{

check_auto_write()。

DATA _ PORT = * str-0x 20;

str++;

}

}

其他

for(I = 0;我& ltNUMi++)if(low addr F0 0x 1f # if(SCREEN _ WIDTH = " = 0x 20)" E0...haddr = " 0;addr = 0;caddr = 0;"low addr = " low addr+2;"3f 0x 10 20 0x 00 caddr = " low addr;"1f.............0x10100f..............0x10100256 * 256 LCD地址{顯示多少字?因為壹個字是16*16格,所以對於(k = " 0;k & lt(num/32);k++)“數據I,j,k,haddr,addr,caddruchar highaddr) lowaddr,uchar num,uchar *str,Uinthanzi _ display (uchiarvoid顯示中文字符* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *。str++;DATA _ PORT = " * str-0x 20;"check_auto_write()。& gt0x1e) //換行

{

lowaddr = 0x00//低位地址

high addr = high addr+2;;//高位地址

}

#否則

If(SCREEN_WIDTH==0x10) //註意不要用#else換行。

if(low addr & gt;0x0e) //換行

{

lowaddr = 0x00//低位地址

high addr = high addr+1;;//高位地址

}

#endif

for(I = 0;我& lt16;i++)

{

#if(SCREEN_WIDTH==0x20)

addr = caddr+32 * I;

如果(i==8)

had dr++;

#否則

if(SCREEN_WIDTH==0x10)

addr = caddr+16 * I;

#endif

set_point(SET_ADDRESS_POINTER,addr,haddr);

set_autoreadwrite(自動寫入);

for(j = 0;j & lt2;j++)

{

check_auto_write()。

DATA _ PORT = * str

str++;

}

set _ autoread write(AUTOSTOP);

}

}

}

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

//清除圖形顯示緩沖區

無效圖形(無效)

{

uint j;

set_point(SET_ADDRESS_POINTER,0x00,0x 04);

set_autoreadwrite(自動寫入);

for(j = 0;j & lt4096;j++)

{

check_auto_write()。

DATA _ PORT = 0x00

}

set _ autoread write(AUTOSTOP);

}

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

//清除字符顯示緩沖區

void clrtext(void)

{

uint j;

set_point(SET_ADDRESS_POINTER,0x00,0x 30);

set_autoreadwrite(自動寫入);

for(j = 0;j & lt1024;j++)

{

check_auto_write()。

DATA _ PORT = 0x00

}

set _ autoread write(AUTOSTOP);

}

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

//圖片顯示

volatile void Picture _ display(Picture * point 1,uchar lowaddr,uchar highaddr,bit inverse)

{

uchar數據I,j,laddr

圖片*點;

point = point 1;

laddr = lowaddr

CY = 0;

for(I = 0;我& lt(點-& gt;長度);i++)

{

CY = 0;

如果(我)

laddr = laddr+32;

如果(CY)

high addr = high addr+1;

set_point(SET_ADDRESS_POINTER,laddr,high addr);

set_autoreadwrite(自動寫入);

for(j = 0;j & lt(點-& gt;寬度/8);j++)

{

如果((laddr!= 0x 00)& amp;& amp(j!=0)) //如果沒有J!=0,當laddr=0x20,0x40時...,顯示不正常。

if((laddr+j)%32==0)

{

(點-& gt;picturecode)=(point-& gt;picturecode)+(點-& gt;寬度/8-j);

打破;

}

check_auto_write()。

如果(!逆)

DATA_PORT=*(點-& gt;picturecode);

其他

DATA _ PORT = ~ *(point-& gt;picturecode);

(點-& gt;picturecode)++;

}

set _ autoread write(AUTOSTOP);

}

}

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

//初始化lcd

void init_lcd(void)

{

//uint i,j;

set_display_area(TEXT_ADDRESS,0x00,0x 30);

set_display_area(TEXT_WIDTH,SCREEN_WIDTH,0x 00);//因為3228是128*64,顯示的字符是8*8,所以字符寬度是16。

set _ display _ area(GRAPHIC _ ADDRESS,0x00,0x 00);

set_display_area(GRAPHIC_WIDTH,SCREEN_WIDTH,0x 00);

set _ display(TEXTON | GRAPHICON);//cursor link | cursor on |

set_point(SET_ADDRESS_POINTER,0x00,0x 00);

//set_point(SET_CURSOR_POINTER,0x4e,0x 30);

set_display_mode(邏輯_ OR);

//SET _ point(SET _ ADDRESS _ POINTER,0x1c,0x2e);

}

對了,lcd的原理其實也是壹樣的,只是用字體庫編程更簡單。壹般來說,液晶顯示器的編程包括以下步驟。

1.讀取狀態

讀取數據

3.寫入狀態

4、寫數據

初始化

只是意味著沒有字體的點陣lcd在發送數據的時候,需要找出數據的位置,然後把數據發送到裏面。

只要再看幾個例子就很容易理解了

  • 上一篇:2023年工業母機股龍頭壹覽
  • 下一篇:python和java哪個比較好學呀?
  • copyright 2024編程學習大全網