www.pudn.com > netbox-ii_ks0108_192x64.rar > HD61202.CPP


/*////////////////////////////////////////////////////////////////////////// 
Orgnization:	Emtronix Incorporated 
Filename:	HD61202.CPP 
Compiler:	BC3.1 
Authors:	CS & ZHL 
Date:		April, 2002 
Revised:	... 
Description:	function implementations of LCD module based on HD61202 
///////////////////////////////////////////////////////////////////////////*/ 
#include  
#include "hd61202.h" 
 
 
#define CmdPort0     	0x7c 
#define DatPort0     	0x7d 
#define CmdPort1	0x7a 
#define DatPort1	0x7b 
 
#define ColBankSize	64 
 
#define MAXX	     	128 		//change 192 
#define MAXY	     	64 
 
unsigned int  CmdPort[2] = { CmdPort0, CmdPort1 }; 
unsigned int  DatPort[2] = { DatPort0, DatPort1 }; 
 
/*////////////////////////////////////////////////////// 
	   DOT LCD support routines 
//////////////////////////////////////////////////////*/ 
 
// return = 0x8000: LCD Controller[] unexisted 
//        = 0x0080: LCD Controller[] existed, Busy 
//        = 0x0020: LCD Controller[] existed, in OFF 
//        = 0x0010: LCD Controller[] existed, in RESET 
//        = 0x0000: LCD Controller[] ready 
//        = 0xffff: wrong input paramter 
unsigned int ControllerStatus( int Idx ) 
{ 
   unsigned char State, ss; 
 
   if( (Idx<0) || (Idx>1) ) return 0xffff; 
 
   State = inportb( CmdPort[Idx] ); 
 
   if( State == 0x00 ) return 0; 
 
   ss = State & 0x80; 
   if( ss != 0 )  return 0x0080;	// in Busy! 
 
   ss = State & 0x20; 
   if( ss != 0 )  return 0x0020;	// in turn off! 
 
   ss = State & 0x10; 
   if( ss != 0 )  return 0x0010;	// in reset! 
 
   return 0x8000;			// unexisted! 
} 
 
// return = 0x8000: LCD unexisted 
//        = 0x0080: LCD existed, Busy 
//        = 0x0020: LCD turn off 
//        = 0x0010: LCD in reset 
//        = 0x0000: LCD ready 
unsigned int CheckStatus( ) 
{ 
   unsigned int  i, status; 
 
   for( i=0; i<2; i++ )    //change 3 
      { 
      status = ControllerStatus( i ); 
      if( status != 0 ) return status; 
      } 
 
   return 0; 
} 
 
// return =  0: ok 
//        = -1: LCD error 
int WaitUntilReady( int Idx ) 
{ 
   unsigned int i, status; 
 
   for( i=0; i<10000; i++ ) 
      { 
      status = ControllerStatus( Idx ); 
      switch( status ) 
	 { 
	 case 0x8000: 		// LCD unexisted 
	      return -1; 
	 case 0x0020: 		// LCD turn off 
	      //outp( CmdPort[Idx], 0x3f ); 
	 case 0x0000: 		// LCD ready 
	      return 0; 
	 default: 
	      break; 
	 } 
      } 
 
   return -1; 
} 
 
// return =  0: init ok 
//        = -1: init fail 
int InitLCD( ) 
{ 
   int i, k; 
   unsigned int status; 
 
   // wait LCD ready 
   for( i=0; i<11; i++ ) 
      { 
      //DelayCall( 1, Milliseconds ); 
      status = CheckStatus( ); 
      if( status == 0x8000 ) return -1; 
      if( status == 0x0080 ) continue; 
      break; 
      } 
   if( i >= 11 ) return -1; 
 
   for( k=0; k<2; k++ )   //change 3 
      { 
      // turn on LCD 
      if( WaitUntilReady( k ) != 0 ) return -1; 
      outportb( CmdPort[k], 0x3f ); 
 
      // set display start row 
      if( WaitUntilReady( k ) != 0 ) return -1; 
      outportb( CmdPort[k], 0xc0 ); 
 
      // set active page => page 0 
      if( WaitUntilReady( k ) != 0 ) return -1; 
      outportb( CmdPort[k], 0xb8 ); 
 
      // set active column => column 0 
      if( WaitUntilReady( k ) != 0 ) return -1; 
      outportb( CmdPort[k], 0x40 ); 
      } 
 
   return ClearScreen( ); 
} 
 
// return =  0: init ok 
//        = -1: LCD fail 
//        = -2: Not Init yet! 
int ClearScreen( ) 
{ 
   unsigned int  i, PgIdx, k; 
 
   for( k=0; k<2; k++ ) //change 3 
      { 
      for( PgIdx=0; PgIdx<8; PgIdx++ ) 
	 { 
	 if( WaitUntilReady( k ) != 0 ) return -1; 
	 outportb( CmdPort[k], 0xb8+PgIdx ); 
	 if( WaitUntilReady( k ) != 0 ) return -1; 
	 outportb( CmdPort[k], 0x40 ); 
	 for( i=0; i=128) ) return -1; 
   if( (y<0) || (y>=64) ) return -1; 
 
   Idx = x / ColBankSize; 
   ColNum = x % ColBankSize; 
   PgNum = y / 8; 
   LineOffset = y % 8; 
   MaskBit = 1<127) )        return -2;        //change 191 
   if( (PgIdx<0) || (PgIdx>7) )  return -2; 
 
   Idx = x / ColBankSize; 
   ColNum = x % ColBankSize; 
 
   // goto (x, y) 
   if( WaitUntilReady( Idx ) != 0 ) return -1; 
   outportb( CmdPort[Idx], 0xb8+PgIdx ); 
   if( WaitUntilReady( Idx ) != 0 ) return -1; 
   outportb( CmdPort[Idx], 0x40+ColNum ); 
 
   // write data to (x, PgIdx) 
   if( WaitUntilReady( Idx ) != 0 ) return -1; 
   outportb( DatPort[Idx], aByte ); 
 
   return 0; 
} 
 
// input x     = 0 -- 127 
//       PgIdx = 0,1,...,7 
// return =  0: ok 
//        = -1: LCD fail 
int ReadByte( int x, int PgIdx ) 
{ 
   unsigned int  Idx, ColNum; 
   unsigned char abyte; 
 
   if( (x<0) || (x>127) )        return -1;        //change 191 
   if( (PgIdx<0) || (PgIdx>7) )  return -1; 
 
   Idx = x / ColBankSize; 
   ColNum = x % ColBankSize; 
 
   // goto (x, y) 
   if( WaitUntilReady( Idx ) != 0 ) return -1; 
   outportb( CmdPort[Idx], 0xb8+PgIdx ); 
   if( WaitUntilReady( Idx ) != 0 ) return -1; 
   outportb( CmdPort[Idx], 0x40+ColNum ); 
 
   // write data to (x, PgIdx) 
   if( WaitUntilReady( Idx ) != 0 ) return -1; 
   abyte = inportb( DatPort[Idx] ); 
   if( WaitUntilReady( Idx ) != 0 ) return -1;	//MUST BE twice to get 
   abyte = inportb( DatPort[Idx] );		//correct data 
 
   return abyte; 
}