无字库12864程序


12864.h

#ifndef __12864_H__

#define __12864_H__

#include

#include

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

利用

I/O

口模拟点阵液晶所需时序



点阵液晶控制端口定义,需根据硬件适当改变



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

sbit LCD_RS = P2^0;//

控制端口定义



sbit LCD_RW = P2^1;

sbit LCD_E = P2^2;

sbit LCD_CSA = P2^3;//H

选通,即高电平有效



sbit LCD_CSB =



P2^4;

#define LCD_Data P0//LCD

数据端口

8





#define R 1

#define L 2

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

函数声明



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

void ReadStatusLCD(unsigned char select);//



LCD

读出忙标志位



unsigned char ReadDataLCD(unsigned char select);//



LCD

读出数据



void WriteDataLCD(unsigned char WDLCD,unsigned char select);//



LED

写入数据



void WriteCommandLCD(unsigned char WCLCD , unsigned char BusyC,unsigned char select);//



LCD

写入命令



void LcdReset(void) //

初始化函数,完成液晶模块的初始设置



void clear_LCD(unsigned char select);//

清屏函数



void Clr_All_Lcd(void);//

全清屏函数



void set_XY(unsigned char Column,unsigned char Page);//

设置数据写入或读出的地址,通过页

号和列数可以唯一确定一个地址



void



xy_Write(unsigned char Column,unsigned char Page,unsigned char dataW);//

向指定行列

写数据



void LcmPutDots(unsigned char Column,unsigned char Page, unsigned char DotByte );//

显示点



void whiteword(unsigned char Column,unsigned char Page, const unsigned char puts[][16] );//





16

×

16

点阵的编码



void WhiteWord_Com(unsigned char Column,unsigned char Page,unsigned char C_num,











































unsigned char V_num,



unsigned char * puts );//

通用的显示函数



void Drawing_dot(unsigned char x,unsigned char y);

void Drawing_line_vertical(unsigned x);

#endif



12864.c









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

LCD12864

点阵液晶屏,



通过

I/O

口直接控制,采用模拟时序控制



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

#include"12864.h"

#include

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

功能:从

LCD

读取状态位



变量:

select

用于选择

LCD

屏的左右

,1

选择左屏,

2

选择右屏



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

void ReadStatusLCD(unsigned char select)

{



switch(select)



{





case 1:{LCD_CSA=1;LCD

_CSB=0;break;}//









case 2:{LCD_CSA=0;LCD_CSB=1;break;}//









default: break;









}









LCD_Data = 0xff;//

置位输入口,已实现输入









LCD_RS=0;LCD_RW=1;LCD_E=1;//

高电平读取数据





//_nop_();







//

若晶振速度高,可在此作延时处理





while(LCD_Data&0x80);//

最高位为忙标志

,

检测忙信号状态









LCD_E=0;



//_nop_();







//

若晶振速度高,可在此作延时处理





}

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

功能:从

LCD

读取数据



变量:

select

用于选择

LCD

屏的左右

,1

选择左屏,

2

选择右屏



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

unsigned char ReadDataLCD(unsigned char select)

{



unsigned char dataR;









LCD_Data = 0xff;//

置位输入口,已实现输入





switch(select)



{





case 1:{LCD_CSA=1;LCD_CSB=0;break;}//









case 2:{LCD_CSA=0;LCD_CSB=1;break;}//









default: break;









}



LCD_RW=1;LCD_RS=1;LCD_E = 1;//

操作允许脉冲信号,高电平读出





//_nop_();



//

若晶振速度高,可在此作延时处理







dataR = LCD_Data;



LCD_E= 0;



return dataR;









}

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

功能:





LCD

写入数据



参数:



WDLCD

待写入的字符数据

















select

用于选择

LCD

屏的左右

,1

选择左屏,

2

选择右屏



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

void WriteDataLCD(unsigned char WDLCD,unsigned char select)

{



switch(select)



{





case 1:{LCD_CSA=1;LCD_CSB=0;break;}//









case 2:{LCD_CSA=0;LCD_CSB=1;break;}//









default: break;









}



ReadStatusLCD(select);//

检测忙标志





LCD_RS = 1;LCD_RW = 0;



LCD_Data = WDLCD;



LCD_E = 1;



//_nop_();







//

若晶振速度高,可在此作延时处理





LCD_E = 0; //

下降沿写入数据





//_nop_();







//

若晶振速度高,可在此作延时处理



}

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

功能:向

LCD

写入命令



参数:



WDLCD

待写入的字符数据















BusyC

是否要检查忙标志位选择标志,

1

为进行,

0

为不检测

















select

用于

选择

LCD

屏的左右

,1

选择左屏,

2

选择右屏



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

void WriteCommandLCD(unsigned char WCLCD , unsigned char BusyC,unsigned char select)

{



if(BusyC)



ReadStatusLCD(select);//

根据需要检测忙





switch(select)



{





case 1:{LCD_CSA=1;LCD_CSB=0;break;}//









case 2:{LCD_CSA=0;LCD_CSB=1;break;}//









default: break;









}



LCD_Data = WCLCD;



LCD_RS = 0;LCD_RW = 0;LCD_E = 1;



//_nop_();







//

若晶振速度高,可在此作延时处理





LCD_E = 0;

}

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

功能:清显示

RAM

区(清屏)











参数:

select

为驱动控制器选择



1

为左



2

为右



*******************************************************************************

*/

void clear_LCD(unsigned char select)

{



unsigned char i,j;



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



{









//

8

页,换页清零







WriteCommandLCD( 0xb8|i,1 ,select);//

页面地址设置,并分别写入左右模块中







WriteCommandLCD( 0x40,1 ,select);//

列地址设置,设置为

0

列,并分别写入左右三

个模块中







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





{









//

页内清零









WriteDataLCD( 0 ,select);





}



}

}

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

功能:清

LCD

左右屏



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

void Clr_All_Lcd(void)

{



clear_LCD(1);



clear_LCD(2);

}

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

功能:

LCD

初始化,分为左,右模块初始化



参数:

select

为驱动控制器选择





1

为左





2

为右



*******************************************************************************

*/

void LcdReset(void)



{



unsigned char i;



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



{





WriteCommandLCD( 0xc0,0 ,R);//

设置显示起始行为第一行,

并分别写入左右模块中

,

不检测忙标志







WriteCommandLCD( 0xc0,0 ,L);





//_nop_();







//

若晶振速度高,可在此作延时处理





}



WriteCommandLCD( 0xc0,1 ,R);//

设置显示起始行为第一行,并分别写入左右模块中,检

测忙标志





WriteCommandLCD( 0xc0,1 ,L);



WriteCommandLCD( 0x3f,1 ,R);//

开显示设置,并分别写入左右模块中













WriteCommandLCD( 0x3f,1 ,L);



clear_LCD(R);//

清左屏





clear_LCD(L);//

清右屏



}

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

功能:设置数据写入或读出的地址,通过页号和列数可以唯一确定一个地址



参数:

Column

表示列号,

Page

表示页号



*******************************************************************************

*/

void set_XY(unsigned char Column,unsigned char Page)

{





unsigned char x,y;



unsigned char select;



switch (Column&0x40) //

完成左右屏的判断



,根据列号完成区分

,<64

为左屏

,>=64



右屏







{















case 0x00: {select = 1;ReadStatusLCD(select);break;}/*

为左区



*/









case 0x40: {select = 2;ReadStatusLCD(select);break;}/*

为右区



*/





}



x = Column&0x3F|0x40; /* col.and.0x3f.or.Set Y Address*/





y = Page&0x07|0xB8; /* row.and.0x07.or.set Page */





WriteCommandLCD( y,1 ,select);//

设置页面地址





WriteCommandLCD( x,1 ,select);//

设置列地址







}

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

功能:根据地址值(页数和列号)

,写入数据,即写入显示缓冲区,便可以显示在

LCD

屏上



参数:

Column

表示列号,

Page

表示页号

,dataW

表示待写入的数据



*******************************************************************************

*/

void



xy_Write(unsigned char Column,unsigned char Page,unsigned char dataW)

{



set_XY(Column,Page);



LCD_RW=0;



LCD_RS=1;



_nop_();//

若晶振速度高,可在此作延时处理





LCD_Data = dataW;//

送数据







_nop_(); //

若晶振速度高,可在此作延时处理





LCD_E = 1;



_nop_(); //

若晶振速度高,可在此作延时处理





LCD_E= 0; //

操作允许脉冲信号,下降沿写入



}

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

功能:



用于显示点阵



参数:

Column

表示列号,

Page

表示页号

,
























相关文档
最新文档