當前位置:編程學習大全網 - 編程語言 - 誰幫我寫個單片機液晶顯示的程序,簡單壹點就行(電路如下)

誰幫我寫個單片機液晶顯示的程序,簡單壹點就行(電路如下)

#include <AT89C51XD2.H>

#include <ABSACC.H>

#include <INTRINS.H>

#include "common.h"

#define SCREEN_WIDTH 0x20

extern struct Pic *point_pic1;

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

#define COMMAND_PORT XBYTE[0x8001] //定義命令端口地址

#define DATA_PORT XBYTE[0x8000] //定義數據端口地址

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

#define DATASTATE 0x02

#define DATAAUTOREAD 0x04

#define DATAAUTOWRITE 0x08

#define CONTROLLER 0x20

#define SCREENCOPY 0x40

#define BLINKCONTITION 0x80

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

//檢查狀態

volatile bit check_state(uchar check_bit)

{

uchar state;

state=COMMAND_PORT;

switch(check_bit)

{

case CODESTATE:

{

if(state&0x01)

return 1;

else

return 0;

}

case DATASTATE:

{

if(state&0x02)

return 1;

else

return 0;

}

case DATAAUTOREAD:

{

if(state&0x04)

return 1;

else

return 0;

}

case DATAAUTOWRITE:

{

if(state&0x08)

return 1;

else

return 0;

}

case CONTROLLER:

{

if(state&0x02)

return 1;

else

return 0;

}

case SCREENCOPY:

{

if(state&0x40)

return 0;

else

return 1;

}

case BLINKCONTITION:

{

if(state&0x80)

return 1;

else

return 0;

}

}

}

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

//判斷自動寫

void check_auto_write(void) reentrant

{

while(!(check_state(DATAAUTOWRITE)));

}

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

volatile void check_code_data(void) reentrant

{

while(!(check_state(CODESTATE)));

while(!(check_state(DATASTATE)));

}

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

//指針設置

#define SET_CURSOR_POINTER 0x01 //設置光標位置

#define SET_CGRAM_POINTER 0X02 //設置CGRAM

#define SET_ADDRESS_POINTER 0x04

void set_point(uchar i,uchar data dat1,uchar data dat2) //向外部輸出的數要定義在 data 區中

{

check_code_data();

DATA_PORT=dat1;

check_code_data();

DATA_PORT=dat2;

check_code_data();

COMMAND_PORT=(0x20|i);

}

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

//設置顯示模式

#define LOGIC_OR 0x00

#define LOGIC_XOR 0x01

#define LOGIC_AND 0x02

#define TEXT_CHAR 0x04

void set_display_mode(uchar dat)

{

check_code_data();

COMMAND_PORT=(0x80|dat);

}

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

//顯示區域設置

#define TEXT_ADDRESS 0x00 //設置文本區首址

#define TEXT_WIDTH 0x01 //設置文本區寬度

#define GRAPHIC_ADDRESS 0x02 //設置圖形區首址

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

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

{

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

dat2=0;

check_code_data();

DATA_PORT=dat1;

check_code_data();

DATA_PORT=dat2;

check_code_data();

COMMAND_PORT=(0x40|i);

}

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

//顯示開關設置

#define CURSORBLINK 0x01

#define CURSORON 0x02

#define TEXTON 0x04

#define GRAPHICON 0x08

void set_display(uchar displaymode)

{

check_code_data();

COMMAND_PORT=(displaymode|0x90);

}

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

//光標形狀設置

//參數0-7

void set_cursor(uchar i)

{

check_code_data();

COMMAND_PORT=(0xa0|i);

}

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

//自動讀寫定義

#define AUTOWRITE 0x00

#define AUTOREAD 0x01

#define AUTOSTOP 0x02

void set_autoreadwrite(uchar i) //reentrant

{

check_code_data();

COMMAND_PORT=(0xb0|i);

}

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

//壹次讀寫定義

#define write_address_add 0x00

#define read_address_add 0x01

#define write_address_sub 0x02

#define read_address_sub 0x03

#define write_address_nochange 0x04

#define read_address_nochange 0x05

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

{

check_code_data();

DATA_PORT=letter;

check_code_data();

COMMAND_PORT=(0xc0|i);

}*/

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

//屏讀

/*void screen_read(void)

{

check_code_data();

COMMAND_PORT=0xe0;

}*/

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

//屏拷貝

/*void screen_copy(void)

{

check_code_data();

COMMAND_PORT=0xe8;

}*/

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

//位操作

//#define set_bit 0x08

//#define clear_bit 0x00

/*void bit_operation(uchar op,uchar i)

{

check_code_data();

COMMAND_PORT=(0xf0|op|i);

}*/

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

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

{

unsigned int addr;

addr=y*16+x;

check_code_data();

DATA_PORT=addr;

check_code_data();

DATA_PORT=addr>>8;

check_code_data();

COMMAND_PORT=0x24;

check_code_data();

DATA_PORT=str;

check_code_data();

COMMAND_PORT=0xc4;

}*/

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

//顯示字符

void text_display(uchar str) //reentrant

{

//set_point(SET_ADDRESS_POINTER,lowaddr,highaddr);

//set_once_read_write(write_address_add,str-0x20);

set_autoreadwrite(AUTOWRITE);

check_auto_write();

DATA_PORT=str-0x20;

set_autoreadwrite(AUTOSTOP);

}

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

//顯示字符串

void string_display(uchar data *str,uchar lowaddr,uchar highaddr) //reentrant

{

set_point(SET_ADDRESS_POINTER,lowaddr,highaddr);

set_autoreadwrite(AUTOWRITE);

while(*str!='\0')

//set_once_read_write(write_address_add,str[i]-0x20);

{check_auto_write();

DATA_PORT=*str-0x20;

str++;

}

set_autoreadwrite(AUTOSTOP);

}

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

//顯示代碼區中的字符串

void string_display_code(uchar num,uchar code *str,uchar lowaddr,uchar highaddr) //reentrant

{

uchar i;

set_point(SET_ADDRESS_POINTER,lowaddr,highaddr);

set_autoreadwrite(AUTOWRITE);

if(num==0)

{

while(*str!='\0')

{

check_auto_write();

DATA_PORT=*str-0x20;

str++;

}

}

else

for(i=0;i<NUM;I++) if(lowaddr f0 0x1f #if(SCREEN_WIDTH="=0x20)" e0 ... haddr="0;addr=0;caddr=0;" lowaddr="lowaddr+2;" 3f 0x10 20 0x00 caddr="lowaddr;" 1f .............0x10 10 0f ..............0x10 01 00 256*256液晶的地址 { 顯示多少字因為壹個字是16*16點陣,所以占32字節空間 for(k="0;k<(num/32);k++)" data i,j,k,haddr,addr,caddr; uchar highaddr) lowaddr,uchar num,uchar *str,uint hanzi_display(uchar void 顯示漢字 ******************************************************************************************** } set_autoreadwrite(AUTOSTOP); str++; DATA_PORT="*str-0x20;" check_auto_write();>0x1e) //換行

{

lowaddr=0x00; //低地址

highaddr=highaddr+2;; //高位地址

}

#else

if(SCREEN_WIDTH==0x10) //註意不要和#else在壹行

if(lowaddr>0x0e) //換行

{

lowaddr=0x00; //低地址

highaddr=highaddr+1;; //高位地址

}

#endif

for(i=0;i<16;i++)

{

#if(SCREEN_WIDTH==0x20)

addr=caddr+32*i;

if(i==8)

haddr++;

#else

if(SCREEN_WIDTH==0x10)

addr=caddr+16*i;

#endif

set_point(SET_ADDRESS_POINTER,addr,haddr);

set_autoreadwrite(AUTOWRITE);

for(j=0;j<2;j++)

{

check_auto_write();

DATA_PORT=*str;

str++;

}

set_autoreadwrite(AUTOSTOP);

}

}

}

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

//清圖形顯示緩沖區

void clrgraphic(void)

{

uint j;

set_point(SET_ADDRESS_POINTER,0x00,0x04);

set_autoreadwrite(AUTOWRITE);

for(j=0;j<4096;j++)

{

check_auto_write();

DATA_PORT=0x00;

}

set_autoreadwrite(AUTOSTOP);

}

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

//清字符顯示緩沖區

void clrtext(void)

{

uint j;

set_point(SET_ADDRESS_POINTER,0x00,0x30);

set_autoreadwrite(AUTOWRITE);

for(j=0;j<1024;j++)

{

check_auto_write();

DATA_PORT=0x00;

}

set_autoreadwrite(AUTOSTOP);

}

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

//圖片顯示

volatile void picture_display(Picture *point1,uchar lowaddr,uchar highaddr,bit inverse)

{

uchar data i,j,laddr;

Picture *point;

point=point1;

laddr=lowaddr;

CY=0;

for(i=0;i<(point->length);i++)

{

CY=0;

if(i)

laddr=laddr+32;

if(CY)

highaddr=highaddr+1;

set_point(SET_ADDRESS_POINTER,laddr,highaddr);

set_autoreadwrite(AUTOWRITE);

for(j=0;j<(point->width/8);j++)

{

if((laddr!=0x00)&&(j!=0)) //如果沒j!=0,當laddr=0x20、0x40..時,顯示不正常

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

{

(point->picturecode)=(point->picturecode)+(point->width/8-j);

break;

}

check_auto_write();

if(!inverse)

DATA_PORT=*(point->picturecode);

else

DATA_PORT=~*(point->picturecode);

(point->picturecode)++;

}

set_autoreadwrite(AUTOSTOP);

}

}

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

//初始化lcd

void init_lcd(void)

{

//uint i,j;

set_display_area(TEXT_ADDRESS,0x00,0x30);

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

set_display_area(GRAPHIC_ADDRESS,0x00,0x00);

set_display_area(GRAPHIC_WIDTH,SCREEN_WIDTH,0x00);

set_display(TEXTON|GRAPHICON); //CURSORBLINK|CURSORON|

set_point(SET_ADDRESS_POINTER,0x00,0x00);

//set_point(SET_CURSOR_POINTER,0x4e,0x30);

set_display_mode(LOGIC_OR);

//set_point(SET_ADDRESS_POINTER,0x1c,0x2e);

}

順便說幾句,液晶的現實其實原理都是壹樣的,只是說帶字庫的編程要簡單壹些,壹般來說,對lcd的編程包括以下幾個步驟

1.讀狀態

2.讀數據

3.寫狀態

4,寫數據

5.初始化

只是說不帶字庫的點陣式lcd送數據的時候需要將數據的位置找出來再往裏面送數據。

多看幾個例子就可以了。很容易理解的

  • 上一篇:計算機編程黑客名人
  • 下一篇:spss姓名打不出來
  • copyright 2024編程學習大全網