您的当前位置:首页正文

单片机-LCD.C液晶驱动程序

来源:个人技术集锦


附录 二

LCD.C液晶驱动程序

#include\"REG51F.h\"

#include\"intrins.h\"

#include\"USEH1.h\"

#include\"lcd.h\"

#include\"HZcode.h\"

bit busy_bit=1;

//函数声明==============================

void nop(void);

bit CheckBusy(void); //状态检查

//写显示数据

//dat:显示数据

精选

void WriteByte(uchar dat);

//向LCD发送命令

//command :命令

SendCommandToLCD(uchar command);

//函数定义==============================

void nop(void)

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

精选

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

//状态检查

bit CheckBusy(void)

{

uchar state=0;

P1=0xFF;//空读操作

RW=1;

DI=0;

精选

EN=1;

state=P1;

EN=0;

P1=0xFF;//再读才有效

RW=1;

DI=0;

EN=1;

state=P1;

EN=0;

busy_bit=(bit)(state>>7);

return(busy_bit);

}

//写显示数据

精选

//dat:显示数据

void WriteByte(uchar dat)

{

while(CheckBusy());

DI=1;

RW=0;

LCD_P=dat;

EN=1;

EN=0;

}

/*-------------------------------------------------------------*/

//向LCD发送命令

//command :命令

精选

SendCommandToLCD(uchar command)

{

while(CheckBusy());

RW=0;

DI=0;

LCD_P=command;

EN=1;

EN=0;

}

/*-------------------------------------------------------------*/

//设定行地址(页)--X 0-7

void SetLine(uchar line)

{

精选

line &= 0x07; // 0<=line<=7

line |= 0xb8; //1011 1xxx

SendCommandToLCD(line);

}

//设定列地址--Y 0-63

void SetColumn(uchar column)

{

column &= 0x3f; // 0=column |= 0x40; //01xx xxxx

SendCommandToLCD(column);

}

//设定显示开始行--XX

void SetStartLine(uchar startline) //0--63

精选

{

//startline &= 0x07;

startline |= 0xc0; //1100 0000

SendCommandToLCD(startline);

}

//开关显示

void SetOnOff(uchar onoff)

{

onoff|=0x3e; //0011 111x

SendCommandToLCD(onoff);

}

/*-----------------------------------------------------------*/

//选择屏幕

精选

//screen: 0-全屏,1-左屏,2-右屏

void SelectScreen(uchar screen)

{ //显示器:负有效 CS1: 0--右; CS2: 0--左

switch(screen)

{

case 0:

CS1=0;//全屏

nop();

CS2=0;

nop();

break;

case 1:

CS1=1;//左屏

精选

nop();

CS2=0;

nop();

break;

case 2:

CS1=0;//右屏

nop();

CS2=1;

nop();

break;

default:

break;

}

精选

}

/*------------------------------------------------------------*/

//清屏

//screen: 0-全屏,1-左屏,2-右

void ClearScreen(uchar screen)

{

uchar i,j;

SelectScreen(screen);

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

{

SetLine(i);

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

{

精选

SetColumn(j);

WriteByte(0x00);

}

}

}

/*-------------------------------------------------------------*/

//显示8*8点阵

//lin:行(0-7), column: 列(0-127)

//address : 字模区首地址

void Show8x8(uchar lin,uchar column,uchar *address)

{

uchar i;

//if(column>128) {return;}

精选

if(column<64)

{

SelectScreen(1); //如果列数<64则从第一屏上开始写

SetLine(lin);

SetColumn(column);

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

{

if(column+i<64)

{

WriteByte(*(address+i));

}

else

{

精选

SelectScreen(2);

SetLine(lin);

SetColumn(column-64+i);

WriteByte(*(address+i));

}

}

}

else

{

SelectScreen(2); //否则从第二屏上开始写

column-=64; //防止越界

SetLine(lin);

SetColumn(column);

精选

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

{

if(column+i<64)

{

WriteByte(*(address+i));

}

else

{

SelectScreen(1);

SetLine(lin);

SetColumn(column-64+i);

WriteByte(*(address+i));

}

精选

}

}

}

/*-------------------------------------------------------------*/

//显示汉字16*16

void ShowChina(uchar lin,uchar column,uchar num)

{

uchar *address;

//if(lin>7 || column>127){return;}

address = &HZcode[num][0];

Show8x8(lin,column,address);

Show8x8(lin,column+8,address+8);

Show8x8(lin+1,column,address+16);

精选

Show8x8(lin+1,column+8,address+24);

}

/*------------------------------------------------------------*/

void InitLCD(void) //初始化LCD

{

uchar i=2000; //延时

while(i--);

SetOnOff(1); //开显示

ClearScreen(1);//清屏

ClearScreen(2);

SetStartLine(0); //开始行:0

}

/*-------------------------------------------------------------*/

精选

/*------------------------------------------------------------*/

//显示图片

//lin:行(0-7), column: 列(0-127)

//high:高度, width:宽度(要为8的倍数)

//address : 图片区首地址

void ShowPicture(uchar lin, uchar column, uchar high, uchar width, uchar *address)

{

uchar i, j;

//if(column>128) {return;}

if(column<64)

{

for(j=0;j{

精选

SelectScreen(1); //如果列数<64则从第一屏上开始写

SetLine(lin);

SetColumn(column);

for(i=0;i{

if(i+column>127)

break;

if(column+i<64)

{

WriteByte(*(address+i));

}

else

{

精选

SelectScreen(2);

SetLine(lin);

SetColumn(column-64+i);

WriteByte(*(address+i));

}

}

lin+=1;

address+=width;

}

}

else

{

column-=64; //防止越界

精选

for(j=0;j{

SelectScreen(2); //否则从第二屏上开始写

SetLine(lin);

SetColumn(column);

for(i=0;i{

if(i+column>64)

break;

if(column+i<64)

{

WriteByte(*(address+i));

}

精选

else

{

SelectScreen(1);

SetLine(lin);

SetColumn(column-64+i);

WriteByte(*(address+i));

}

}

lin+=1;

address+=width;

}

}

}

精选

因篇幅问题不能全部显示,请点此查看更多更全内容