# 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在發送數據的時候,需要找出數據的位置,然後把數據發送到裏面。
只要再看幾個例子就很容易理解了