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

📄 12864.h

📁 very useful to pactising ps2 keyboard
💻 H
字号:
//包含液晶驱动得所有底层函数
//汉字取模时为一页页取得,汉字可以上下列一起送,16次完成.
void lcd_init( void )               //初始化函数
{
	write_cmd_L( 0x3e );		    //关显示  00111110B
	write_cmd_R( 0x3e );
	write_cmd_L( 0xc0 );		    //设定起始行  11000000B ,设定第0行是显示的顶端
	write_cmd_R( 0xc0 );	
	write_cmd_L( 0x3f );		    //开显示
	write_cmd_R( 0x3f );
	lcd_clr( );		                //清屏

}


void lcd_clr( void )                //清屏函数
{
     unsigned char i,j,page;        //page为页数
     for( i = 0; i < 8; i++ )
	{
	  page = i; 
	  page |= 0xb8;                 // 10111000B 设定页值  ,低三位决定为第几页
	  write_cmd_L( page );          //设定RAM中的页值
	  write_cmd_L( 0x40 );          //设定列值,01000000从第0列起
	  for( j = 0; j < 64; j++ )
	    write_dat_L( 0 );           //列清零是一列一列完成的  一列清0完成后列值自动加1
	  write_cmd_R( page );          //右屏与左屏一样设置
	  write_cmd_R( 0x40 );
	  for( j = 0; j < 64; j++ )
	    write_dat_R( 0 );
         }	
}


void write_cmd_L( unsigned char cmd ) //写左命令
{
	CSB = 1;
	CSA = 0;
	DI = 0;                           //此时符合状态码的读取条件
	RW = 1;
	do
	{
	  DataLine = 0xff;                
	  E = 1;
	  _nop_();			
	}while( BUSY );                   //为忙态则等待,这是一个读单片机端口的过程
	E = 0;
	RW = 0;
	DataLine = cmd;
	E = 1;
	_nop_();                         
	E = 0;
}


void write_cmd_R( unsigned char cmd ) //写右命令
{
	CSB = 0;
	CSA = 1;
	DI = 0;
	RW = 1;
	do
	{
	  DataLine = 0xff;
	  E = 1;
	  _nop_();	
		
	}while( BUSY );
	E = 0;
	RW = 0;
	DataLine = cmd;
	E = 1;
	_nop_();
	E = 0;
}


void write_dat_L( unsigned char dat )//写左数据,按照器件手册,编制函数
{
	CSB = 1; 
	CSA = 0;
	DI = 0;
	RW = 1;
	do
	{
	  DataLine = 0xff;
	  E = 1;
	  _nop_();		
	}while( BUSY );
	E = 0;
	DI = 1;
	RW = 0;
	DataLine = dat;
	E = 1;
	_nop_();                
	E = 0;
}


void write_dat_R( unsigned char dat )//写右数据
{
	CSB = 0; 
	CSA = 1;
	DI = 0;
	RW = 1;
	do
	{
	  DataLine = 0xff;
	  E = 1;
	  _nop_();		
	}while( BUSY );
	E = 0;                           //E为低电平有效
	DI = 1;
	RW = 0;
	DataLine = dat;
	E = 1;
	_nop_();
	E = 0;
}



void write_data(unsigned char xpos,unsigned char ypos,unsigned char lcddata)  //一次写入一个字节
{
  if(xpos<128)
   {
	if( ( xpos & 0x40 )== 0 )          // 左屏
	  {
		write_cmd_L( 0xb8 | ypos );   //ypos 为页值
		write_cmd_L( 0x40 | xpos);    //xpos 为列值
		write_dat_L( lcddata );
	  }
	else                              // 右屏
	  {
		write_cmd_R( 0xb8 | ypos );	           	
		write_cmd_R( 0x40 | xpos );				
		write_dat_R( lcddata );
	  }
   }		
}


void lcd_putchar5x16( unsigned char x,unsigned char y,unsigned char *ch )  //显示5×16字符
{
    unsigned char i;
	for( i = 0; i < 5; i ++ )
	{
        write_data( x+i, y, ch[i] );               //xpos 为起始列值,ypos 为页值
        write_data( x+i, y+1, ch[5+i] );           //
	} 	 
}


void lcd_putchar12x16( unsigned char x, unsigned char y, unsigned char *hz )   //显示汉字,x显示列,y显示页
{
	unsigned char i;
	for( i = 0; i < 12; i++ )
	{
        write_data( x + i, y, hz[ i] );		
        write_data( x + i, y + 1, hz[ 12 + i] );                    //两页一起送数据
    }	
}


void lcd_putchar_shuzu12x16( unsigned char x,unsigned char y,unsigned char ch )  //显示汉字,汉字以数组形势存放 66666666666666666666666666666
{
    unsigned char i;
	for( i = 0; i <12; i++ )
	{
        write_data( x+i, y, xindekaishi_hanzi[ch*24 + i] );               //xpos 为起始列值,ypos 为页值
        write_data( x+i, y+1, xindekaishi_hanzi[ch*24 +12+ i] );           //
	} 	 
}




void lcd_xingqi_dis12x16( unsigned char x, unsigned char y, unsigned char num )   //显示汉字,x显示列,y显示页
{
	unsigned char i;
	for( i = 0; i < 12; i++ )
	{
        write_data( x + i, y, xingqi[24*num+ i] );		
        write_data( x + i, y + 1, xingqi[ 24*num+ 12 + i] );                    //两页一起送数据
    }	
}



void lcd_num5x16( unsigned char x,unsigned char y,unsigned char ch )  //显示数字0-9
{
    unsigned char i;
	for( i = 0; i < 5; i ++ )
	{
        write_data( x+i, y, zifu[ch*10 + i] );               //xpos 为起始列值,ypos 为页值
        write_data( x+i, y+1, zifu[ch*10 +5+ i] );           //
	} 	 
}



void lcd_num_biankuang5x16( unsigned char x,unsigned char y,unsigned char ch ) //显示数字0-9,里面加上了边框的数据
{
    unsigned char i;
	for( i = 0; i < 5; i ++ )
	{
        write_data( x+i, y,  zifu_biankuang[ch*10 + i] );             //xpos 为起始列值,ypos 为页值
        write_data( x+i, y+1,zifu_biankuang[ch*10 +5+ i] );           //
	} 	 
}




void hz_disp( unsigned char x, unsigned char y, unsigned char *hz )   //显示汉字,x显示列,y显示页
{
	unsigned char i;
	for( i = 0; i < 16; i++ )
	{
        write_data( x + i, y, hz[ i] );		
        write_data( x + i, y + 1, hz[ 16 + i] );                    //两页一起送数据
    }	
}


void lcd_image12816_dis(unsigned char m,unsigned char code *img)
{										 
    unsigned char j,k;
    for( k = 0; k < 2; k++ )
    {   
        m =m+ k;
       m |= 0xb8;                           // 10111000B 设定页值 , i值影响page的低三位
    	write_cmd_L(m );
    	write_cmd_L( 0x40 );                //01000000 设定列值
    	for( j = 0; j < 64; j++ )
    	  write_dat_L(img[k*128+j]);        //img为指针
    	write_cmd_R( m );
    	write_cmd_R( 0x40 );
    	for(j=64;j<128;j++) 
    	  write_dat_R(img[k*128+j]);
    }
}


//显示12864图片
void Disp_Img(unsigned char code *img)      //字模生成时为先取第一页数据,再第二页....,且为纵向取模,字节倒序
{										 
    unsigned char j,k,page = 0; 
    for( k = 0; k < 8; k++ )
    {   
        page = k;
        page |= 0xb8;                       // 10111000B 设定页值 , i值影响page的低三位
    	write_cmd_L( page );
    	write_cmd_L( 0x40 );                //01000000 设定列值
    	for( j = 0; j < 64; j++ )
    	  write_dat_L(img[k*128+j]);        //img为指针
    	write_cmd_R( page );
    	write_cmd_R( 0x40 );
    	for(j=64;j<128;j++) 
    	  write_dat_R(img[k*128+j]);
    }
}


unsigned char Rddata( void )                //读取显示的数据
{
    unsigned char dd = 0;
    DataLine = 0xff;
    DI = 1;
    RW = 1;
    E = 1;                             
    _nop_();
    dd = DataLine;
    E = 0;
    return(dd);    
}



void biankuang_display()
{
  unsigned char x01 = 0;                    //
  unsigned char y01 = 0;
  
  for(y01 = 0 ; y01<6 ; y01++)              //写左边框
   {
    write_data( x01,y01,0xff);
    write_data( x01+1,y01,0xff);
   }  

  for(y01 = 0 ; y01<6 ; y01++)              //写右边框
   {
    write_data( 126,y01,0xff);
    write_data( 127,y01,0xff);
   } 

  write_data( 2,0,0x0f);                    //边脚雕饰
  write_data( 3,0,0x07);
  write_data( 124,0,0x07);
  write_data( 125,0,0x0f);

  for(x01 = 4 ; x01<124 ; x01++)            //写上边框
   {
    write_data( x01,0,0x03);
   } 
	


  lcd_image12816_dis(6,xindekaishi);        // 写显示的下部


  lcd_putchar12x16( 12,  4, xing );         //显示星
  lcd_putchar12x16( 25,  4, qii);           //显示汉字期
  lcd_putchar12x16( 70,  2, wenduji ) ;     //显示温度计图片
  lcd_putchar12x16( 114, 2,sheshidu);       //显示摄氏度
  write_data( 104, 3,0x08);                 //显示一点
  lcd_putchar12x16( 70,  4, dingshiqi);     //显示图片定时器
 // lcd_putchar12x16( 70,  0, naolingkai ) ;  显示闹铃开图片


lcd_putchar5x16( 19, 2,maohao );            //显示5×16字符,以下显示不带边框的冒号
lcd_putchar5x16( 37, 2,maohao );            //
                                            //lcd_putchar5x16( 102, 2,maohao ) ; 
lcd_putchar5x16( 102, 4,maohao) ;           //

lcd_putchar5x16( 102, 0,maohao_biankuang);  //显示带边框的冒号


lcd_putchar5x16( 90, 4,hengxian ) ;         //显示横线,不带边框
lcd_putchar5x16( 96, 4,hengxian ) ;         //显示横线
lcd_putchar5x16( 108, 4,hengxian );         //显示横线
lcd_putchar5x16( 114, 4,hengxian ) ;        //显示横线


lcd_putchar5x16( 20, 0,hengxian_biankuang );  //显示横线,带边框
lcd_putchar5x16( 38, 0,hengxian_biankuang ) ; //显示横线
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -