📄 lcd12864.c
字号:
#include "lcd12864.h"
void delay( int x ) //延时X乘10 个2ns
{
int i,j;
for(i = 0;i < x;i++)
{
for(j = 0;j < 10;j++);
}
}
/***********************************************************************
* * * * * * * * * 液晶写左半屏指令 * * * * * * * * * *
***********************************************************************/
void write_l_cmd(unsigned char cmd)
{
CSA = 0;//关闭右半屏
CSB = 1;//选中左半屏
DI = 0; //DB7~DB0送指令
RW = 1; //指令在E下降沿到来时且RW下降沿有效时指令送入IR(指令寄存器)
do{
dataline = 0xff;
E = 1;
}while( BUSY ); //等待液晶不忙
E = 0; //E下降沿到来(时序要求E下降沿先到)
RW = 0; //RW下降沿到来
dataline = cmd; //指令送入IR(指令寄存器)
E = 1; //此时RW=“H”,当E下降沿来时锁存DB7~DB0
delay( 5 ); //E高电平450ns要求
E = 0; //E下降沿到来
}
/***********************************************************************
* * * * * * * * * 液晶写右半屏指令 * * * * * * * * * *
***********************************************************************/
void write_r_cmd(unsigned char cmd)
{
CSA = 1;//选中右半屏
CSB = 0;//关闭左半屏
DI = 0; //DB7~DB0送指令
RW = 1; //指令在E下降沿到来时且RW下降沿有效时指令送入IR(指令寄存器)
do{
dataline = 0xff;
E = 1;
}while( BUSY );//等待液晶不忙
E = 0; //E下降沿到来(时序要求E下降沿先到)
RW = 0; //RW下降沿到来
dataline = cmd; //指令送入IR(指令寄存器)
E = 1; //此时RW=“H”,当E下降沿来时锁存DB7~DB0
delay( 5 ); //E高电平450ns要求
E = 0; //E下降沿到来
}
/***********************************************************************
* * * * * * * * * 液晶写左半屏数据 * * * * * * * * * *
***********************************************************************/
void write_l_dat( unsigned char dat )
{
CSA = 0;//关闭右半屏
CSB = 1;//选中左半屏
DI = 0; //DI="L",DB7~DB0为指令数据
RW = 1; //E="H",RW="H",数据被读到DB7~DB0
do{
dataline = 0xff;
E=1;
}while(BUSY);//等待液晶不忙
E = 0; //先置E为低,为后面时序做准备
DI = 1; //DI="H",DB7~DB0为显示数据
RW = 0;
dataline = dat; //RW="L",E="H"--"L"数据送入DR(数据寄存器)
E = 1;
delay( 5 ); //E高电平450ns要求
E = 0;
}
/***********************************************************************
* * * * * * * * * 液晶写右半屏数据 * * * * * * * * * *
***********************************************************************/
void write_r_dat( unsigned char dat )
{
CSA = 1;//选中右半屏
CSB = 0;//关闭左半屏
DI = 0;
RW = 1;
do{
dataline = 0xff;
E = 1;
}while( BUSY );
E = 0;
DI = 1;
RW = 0;
dataline = dat;
E = 1;
delay( 5 );
E = 0;
}
/***********************************************************************
* * * * * * * * * 液晶写全屏数据 * * * * * * * * * *
***********************************************************************/
void write_dat( unsigned char xpos,unsigned char ypos,unsigned char lcddata )
{ //定义xpos:数据显示行起始地址;ypos:数据显示列起始地址;lcddata:显示数据
if( ( xpos & 0x40 ) == 0 ) //0x40=64,它是左半屏的结束地址
{
write_l_cmd( 0xb8 | ypos );
write_l_cmd( 0x40 | xpos );
write_l_dat( lcddata );
}
else
{
write_r_cmd( 0xb8 | ypos );
write_r_cmd( 0x40 | xpos );
write_r_dat( lcddata );
}
}
/***********************************************************************
* * * * * * * * * 液晶汉字显示控制 * * * * * * * * * *
***********************************************************************/
void hz_disp( unsigned char x,unsigned char y,unsigned char *hz)
{
unsigned char i;
for( i = 0;i < 16;i++ ) //定义一个字符显示长宽为16x16
{
write_dat( x+i,y,hz[i] ); //程序按照行列显示,循环16次共16列
write_dat( x+i,y+1,hz[16+i] );
}
}
/***********************************************************************
* * * * * * * * * 液晶显示12864图片 * * * * * * * * * *
***********************************************************************/
void disp_img(unsigned char code *img)
{
unsigned char j,k,page = 0;
for( k = 0; k < 8; k++ ) //注,显示图片时,一页为整个屏的一行
{
page = k;
page |= 0xb8;
write_l_cmd( page );
write_l_cmd( 0x40 );
for( j = 0; j < 64; j++ )
write_l_dat(img[k*128+j]);
write_r_cmd( page );
write_r_cmd( 0x40 );
for(j=64;j<128;j++)
write_r_dat(img[k*128+j]);
}
}
/***********************************************************************
* * * * * * * * * 液晶清屏控制 * * * * * * * * * *
***********************************************************************/
void lcd_clr( void )
{
unsigned char i,n,page; //液晶8行为一页,模块共64行8页
for( i = 0;i < 8;i++ )
{
page = i;
page |= 0xb8; //页地址是"1 0 1 1 1 A2 A1 A0" A2~A0表示0~7页
write_l_cmd( page );
write_l_cmd( 0x40 );
for( n = 0;n < 64;n++ ) //从第0页开始,对左半屏地址0X00~0X40,64个地址置0
{
write_l_dat( 0 );
}
write_r_cmd( page );
write_r_cmd( 0x40 );
for( n = 0;n < 64;n++ )
{
write_r_dat( 0 ); //从第0页开始,对右半屏地址0X00~0X40,64个地址置0
} }
}
/***********************************************************************
* * * * * * * * * 液晶初始化控制 * * * * * * * * * *
***********************************************************************/
void lcd_init( void )
{
write_l_cmd( 0x3e );//显示开关控制(DISPLAY ON/OFF)代码地址0 0 1 1 1 1 1 D ,D=1开显示;D=0关显示
write_r_cmd( 0x3e );
write_l_cmd( 0xc0 );//起始行设置(DISPLAY START LINE)代码地址1 1 A5 A4 A3 A2 A1 A0
write_r_cmd( 0xc0 );
write_l_cmd( 0x3f );//开显示
write_r_cmd( 0x3f );
lcd_clr( );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -