#include #include #define __KERNEL__ #include "/root/uClinux-dist-h8300/linux-2.4.x/include/asm-h8300/regs306x.h" #include "lcd.h" #include "reg.h" //#include "n16x_x.h" #define BASE_ADR 0xa00000 #define CMD0 (BASE_ADR+2) #define CMD1 (BASE_ADR+4) #define DATA0 (BASE_ADR+3) #define DATA1 (BASE_ADR+5) #define NUM_OF_COLUMN 62 static int CurrentPanel ; static int CurrentColumn ; static int CurrentPage ; static void StartPwm( void ) { SetReg8( CSCR, ReadReg8( CSCR ) | 0xff ); SetReg8( TCR0 ,0x43 ) ; SetReg8( TIOR0, 0x33 ) ; SetReg16( GRB0H, 3125/4 ) ; SetReg16( GRA0H, 3125/4 ) ; SetReg8( TSTR, 1 ) ; } void WriteLcdCmd( char cs, unsigned char data ) { switch( cs ) { case 1 : SetReg8( CMD0,data); break ; case 0 : SetReg8( CMD1,data); break ; } } void WriteLcdData( char cs, unsigned char data ) { switch( cs ) { case 1 : SetReg8(DATA0,data ) ; break ; case 0 : SetReg8(DATA1, data ); break ; } } void InitLcd( void ) { StartPwm(); usleep( 1000*100 ) ;/* ハードリセット終了待ち */ WriteLcdCmd( LEFT, 0xe2 ); /* リセット */ WriteLcdCmd( RIGHT, 0xe2 ); usleep( 1000*100 ) ;/* リセット終了待ち */ WriteLcdCmd( LEFT, 0xa9 ); /* DUTY=1/32 */ WriteLcdCmd( RIGHT, 0xa9 ); WriteLcdCmd( LEFT, 0xa0 ); /* ADC=右回り */ WriteLcdCmd( RIGHT, 0xa0 ); WriteLcdCmd( LEFT, 0xa4 ); /* 通常表示 */ WriteLcdCmd( RIGHT, 0xa4 ); WriteLcdCmd( LEFT, 0xb8 ); /* ページ0 */ WriteLcdCmd( RIGHT, 0xb8 ); WriteLcdCmd( LEFT, 0xaf ); /* ここでランダムパターン表示 */ WriteLcdCmd( RIGHT, 0xaf ); } void ChangeLcdPage( char cs, char page ) { page &= 0x3; WriteLcdCmd( cs, 0xb8 + page ); } void SetLcdColumn( char cs, char col ) { col &= 0x7f; if( col > 79 ){ col = 79; } WriteLcdCmd( cs, col ); } void Bar( int a ) { int i ; ChangeLcdPage(LEFT, 0 ) ; SetLcdColumn(LEFT, 0 ) ; for( i = 0 ; i < a ; i ++ ) { WriteLcdData( LEFT, 0xff ) ; } for( i = a ; i < NUM_OF_COLUMN ; i ++ ) { WriteLcdData( LEFT, 0x0 ) ; } } void SetLcdPoint( int Line, int Point ) { //printf( "Point %d\n", Point ) ; if( Point >= NUM_OF_COLUMN ) { CurrentPanel = RIGHT; Point -= NUM_OF_COLUMN ; } else { CurrentPanel = LEFT; } CurrentPage = Line ; ChangeLcdPage( CurrentPanel, CurrentPage ) ; CurrentColumn = Point ; SetLcdColumn(CurrentPanel, CurrentColumn ) ; } void PutPattern( const char* Pattern, int Length ) { int i; for( i = 0 ; i < Length ; i ++ ) { WriteLcdData( CurrentPanel, *Pattern ); Pattern ++ ; CurrentColumn ++ ; if( CurrentColumn == NUM_OF_COLUMN ) { CurrentColumn = 0 ; if( CurrentPanel == RIGHT ) { CurrentPanel = LEFT ; //CurrentPage += 2 ; ChangeLcdPage( CurrentPanel, CurrentPage ) ; SetLcdColumn(CurrentPanel, CurrentColumn ) ; //printf( "left\n" ); } else { CurrentPanel = RIGHT ; ChangeLcdPage( CurrentPanel, CurrentPage ) ; SetLcdColumn( CurrentPanel, CurrentColumn ) ; //printf( "right\n" ); } } } } void ClearLcd( void ) { char i, j; //Sleep(100);return; for( i = 0; i < 4; i++ ){ ChangeLcdPage( LEFT, i ); SetLcdColumn( LEFT, 0 ); for( j = 0; j < NUM_OF_COLUMN; j++ ){ WriteLcdData( LEFT, 0 ); } } for( i = 0; i < 4; i++ ){ ChangeLcdPage( RIGHT, i ); SetLcdColumn( RIGHT, 0 ); for( j = 0; j < NUM_OF_COLUMN; j++ ){ WriteLcdData( RIGHT, 0 ); } } ChangeLcdPage( LEFT, 0 ); SetLcdColumn( LEFT, 0 ); } /* void DispStr( unsigned char* Str ) { unsigned short Code ; char* Pattern ; for(;;) { if( *Str == 0 ) { break ; } if( Str[ 1 ] == 0 ) { break ; } Code = ( ( ( unsigned short )*Str ) << 8 ) + ( unsigned short )( Str[ 1 ] ) ; Pattern = ( char* )GetKanjiPattern( Code ) ; printf( "%04x\n", Pattern ) ; PutPattern( Pattern, 16 ) ; Str += 2 ; } } */