⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd12864.c

📁 液晶WGM12864的驱动程序和显示
💻 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 + -