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

📄 lcd.c

📁 51单片机开始的24064点陈显示屏驱动程序
💻 C
字号:
#include <reg52.h>
#include <absacc.h>
#include <stdio.h>  
#include "lcd.h"  

#define  LINECHARS 0x1e   //30
#define  DATA      XBYTE[0X8000]    /*显示屏数据端口地址*/
#define  COMMAND   XBYTE[0X8100]    /*显示屏命令端口地址*/
#define  CHARBLANK 0
sbit     flag0 = ACC^0 ;            /*  command r/w flag */ 
sbit     flag1 = ACC^1 ;            /*  DATA R/W flag    */
sbit     flag2 = ACC^2 ;            /*  AUTO read        */
sbit     flag3 = ACC^3 ;            /*  AUTO write       */ 

/* 一次读写状态判断  */
void wait()
{
   while( flag0 != 1 )
    {
      ACC = COMMAND ;
    }  

   while( flag1 != 1 )
    {
      ACC = COMMAND ;
    }  
}

/* 连续读写状态判断*/ 
void waits( )
{
  while( flag3 != 1 )
   {
     ACC = COMMAND ;
   }	  	     	    
}

/* 一次写数据 */
void writedata( uchar da )
{
   wait();
   DATA = da;
}


/* 连续写数据 */
void writedatas( uchar da )
{
  waits();
  DATA = da;
}

/* 写命令 */
void writecom ( uchar com )	
{
  wait();
  COMMAND = com;
}

/* 写双参数命令 */
void writedc ( uchar data1, uchar data2, uchar com )
{
  writedata( data1 );
  writedata( data2 );
  writecom ( com   );	 
}
/*写单参数命令 */
void writesdc ( uchar data1,uchar com )
{
  writedata (data1) ;
  writecom   (com);
}
/****************************************************************
显示一个汉字在X,Y位置,其中X必须为8的倍数 
S指向一个长度为32的字模数组,start_base为整个缓冲区在RAM中的位置 
******************************************************************/
void display32( uchar start_base, uchar x,uchar y, char *s )
{
  uint  start;
  uchar i;
  uchar high,low;
  for( i = 0; i < 16 ; i++ )                   //把字模写入LCD
  {
    start = x + (y*i)*LINECHARS*8;
    low	 = (start/8)&0x00ff;
    high  = (start/8)>>8;
    writedc( low, high + start_base, 0x24 );
    writesdc( s[i] ,   0xc0 );                 //数据写入LCD地址加1
    writesdc( s[i+16] ,0xc0 );                 //数据写入LCD地址加1
  }
}

/************************************************
显示一个字符,在X,Y位置,其中X必须为8的倍数
S指向一个长度为16的字模数组。
************************************************/
void display16( uchar start_base, uchar x,uchar y, char *s )
{
  uint  start;
  uchar i;
  uchar high,low;
  for( i = 0; i < 16 ; i++ )         //把字模写入LCD
    {
      start = x + (y*i)*LINECHARS*8;
      low	 = (start/8)&0x00ff;
      high  = (start/8)>>8;
      writedc( low, high + start_base, 0x24 );
      writesdc( s[i] ,   0xc0 );
    }
}
/************************************************************
反显某一区域,X方向必须为8的倍数,Y方向无限制
X,Y,由起始到终止,X_lenght,y_length为反显的X,Y方向的长度
如果X_length和y_length任何一个为0,则不会反显。
注意,由于不含判断所以如果参数不合法会导致程序错误。
start_base_为写入的显存的首地址。
**************************************************************/
void hightlight_lec( uchar start_base , uchar start_x ,uchar start_y ,
  uchar x_length, uchar y_length )
{
  uint  start;
  uchar i;
  uchar high,low;
  while( y_length != 0 ) 
    {
      start = ( start_x/8 +start_y*(LINECHARS)  );
      low   = start & 0x00ff;
      high  = start >> 8;
      writedc( low, high+start_base ,0x24 );
      i = x_length/8 ;
      while( i != 0 )
        {
          writecom( 0xc5 );
          writesdc( ~DATA, 0XC0 );
          i--;
        }
    start_y ++ ;
    y_length -- ;
}
}
/************************************************************
清除某一区域,X方向必须为8的倍数,Y方向无限制
X,Y,由起始到终止,X_lenght,y_length为反显的X,Y方向的长度
如果X_length和y_length任何一个为0,则不会清除。
注意,由于不含判断所以如果参数不合法会导致程序错误。
start_base_为写入的显存的首地址。
**************************************************************/
void clear_lcd( uchar start_base , uchar start_x ,uchar start_y ,
  uchar x_length, uchar y_length )
{
  uint  start;
  uchar i;
  uchar high,low;
  while( y_length != 0 ) 
    {
      start = ( start_x/8 +start_y*(LINECHARS)  );
      low   = start & 0x00ff;
      high  = start >> 8;
      writedc( low, high+start_base, 0x24 );
      writecom( 0xb0 );
      i = x_length/8 ;
      while( i != 0 )
       {
         writecom( 0x00 );
         i--;
       }
     start_y ++ ;
     y_length -- ;
   }
}
/************************************************************
覆盖某一区域,X方向必须为8的倍数,Y方向无限制
X,Y,由起始到终止,X_lenght,y_length为反显的X,Y方向的长度
如果X_length和y_length任何一个为0,则不会清除。
注意,由于不含判断所以如果参数不合法会导致程序错误。
start_base_为写入的显存的首地址。
**************************************************************/
void cover_lcd( uchar start_base , uchar start_x ,uchar start_y ,
  uchar x_length, uchar y_length )
{
  uint  start;
  uchar i;
  uchar high,low;
  while( y_length != 0 ) 
   {
     start = ( start_x/8 +start_y*(LINECHARS)  );
     low   = start & 0x00ff;
     high  = start >> 8;
     writedc( low, high+start_base, 0x24 );
     writecom( 0xb0 );
     i = x_length/8 ;
     while( i != 0 )
      {
        writecom( 0xff );
        i--;
      }
     start_y ++ ;
     y_length -- ;
  }
}
/* 初始化LCD  */
void lcd_init()
{
   writecom( 0x98 );                          //仅开图形显示方式
   writecom( 0x88 );                          //显示方式设置为外部RAM方式
   writedc( 0x00, 0x00, 0x42  );              //图形区首地址
   writedc( LINECHARS, 0x00, 0x43 );          //设图形区每行字节数
}

⌨️ 快捷键说明

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