📄 lcd19264.c
字号:
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<ColBankSize; i++ )
{
if( WaitUntilReady( k ) != 0 ) return -1;
outportb( DatPort[k], 0 );
}
}
}
// set start line as 0
for( k=0; k<3; k++ ) //change 3
{
if( WaitUntilReady( k ) != 0 ) return -1;
outportb( CmdPort[k], 0xc0 );
}
return 0;
}
// input: DotColor = 0: write 0;
// = 1: write 1;
// = 0x81: XOR write
// return = 0: ok
// = -1: LCD fail
int WritePixel( int x, int y, int DotColor )
{
unsigned int Idx, PgNum, LineOffset, ColNum;
unsigned char abyte, MaskBit;
unsigned int CmdPort[3], DatPort[3];
CmdPort[0] = CmdPort0;
DatPort[0] = DatPort0;
CmdPort[1] = CmdPort1;
DatPort[1] = DatPort1;
DatPort[2] = DatPort2;
CmdPort[2] = CmdPort2;
Idx = x / ColBankSize;
ColNum = x % ColBankSize;
PgNum = y / 8;
LineOffset = y % 8;
MaskBit = 1<<LineOffset;
// goto (x, y)
if( WaitUntilReady( Idx ) != 0 ) return -1;
outportb( CmdPort[Idx], 0xb8+PgNum );
if( WaitUntilReady( Idx ) != 0 ) return -1;
outportb( CmdPort[Idx], 0x40+ColNum );
// get data at (x, y)
if( WaitUntilReady( Idx ) != 0 ) return -1;
abyte = inportb( DatPort[Idx] );
if( WaitUntilReady( Idx ) != 0 ) return -1;
abyte = inportb( DatPort[Idx] );
// bit operation
if( DotColor == 1 ) abyte |= MaskBit;
else if( DotColor == 0 ) abyte &= ~MaskBit;
else abyte ^= MaskBit;
// write data back to (x,y)
if( WaitUntilReady( Idx ) != 0 ) return -1;
outportb( CmdPort[Idx], 0x40+ColNum );
if( WaitUntilReady( Idx ) != 0 ) return -1;
outportb( DatPort[Idx], abyte );
return 0;
}
// input x = 0 -- 191
// PgIdx = 0,1,...,7
// return = 0: ok
// = -1: LCD fail
// = -2: invalid parameter
int WriteByte( int x, int PgIdx, unsigned char aByte )
{
unsigned int Idx, ColNum;
unsigned int CmdPort[2], DatPort[2];
if( (x<0) || (x>191) ) return -2; //change 191
if( (PgIdx<0) || (PgIdx>7) ) return -2;
CmdPort[0] = CmdPort0;
DatPort[0] = DatPort0;
CmdPort[1] = CmdPort1;
DatPort[1] = DatPort1;
CmdPort[2] = CmdPort2;
DatPort[2] = DatPort2;
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 -- 191
// PgIdx = 0,1,...,7
// return = 0: ok
// = -1: LCD fail
int ReadByte( int x, int PgIdx )
{
unsigned int Idx, ColNum;
unsigned int CmdPort[3], DatPort[3];
unsigned char abyte;
CmdPort[0] = CmdPort0;
DatPort[0] = DatPort0;
CmdPort[1] = CmdPort1;
DatPort[1] = DatPort1;
CmdPort[2] = CmdPort2;
DatPort[2] = DatPort2;
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;
}
// function: scroll up 1 character row (8 pixel lines)
// return = new show start line
unsigned int ScrollUp( unsigned int OldStartLine )
{
unsigned int i, k, CmdPort[3], DatPort[3];
CmdPort[0] = CmdPort0;
DatPort[0] = DatPort0;
CmdPort[1] = CmdPort1;
DatPort[1] = DatPort1;
CmdPort[2] = CmdPort2;
DatPort[2] = DatPort2;
// clear start row
for( k=0; k<3; k++ ) //change 3
{
if( WaitUntilReady( k ) != 0 ) return -1;
outportb( CmdPort[k], 0xb8+(OldStartLine/8) );
if( WaitUntilReady( k ) != 0 ) return -1;
outportb( CmdPort[k], 0x40 );
for( i=0; i<ColBankSize; i++ )
{
if( WaitUntilReady( k ) != 0 ) return -1;
outportb( DatPort[k], 0 );
}
}
i = (OldStartLine+8)%64;
// update start line
for( k=0; k<3; k++ ) //change 3
{
if( WaitUntilReady( k ) != 0 ) return -1;
outportb( CmdPort[k], 0xc0+i );
}
return i;
}
// function: scroll down 1 character line (8 pixel lines)
// function: scroll down 1 character line (8 pixel lines)
// return = new show start line
unsigned int ScrollDown( unsigned int OldStartLine )
{
unsigned int i, k, NewStartLine, CmdPort[3], DatPort[3];
CmdPort[0] = CmdPort0;
DatPort[0] = DatPort0;
CmdPort[1] = CmdPort1;
DatPort[1] = DatPort1;
CmdPort[2] = CmdPort2;
DatPort[2] = DatPort2;
if( OldStartLine >= 8 ) NewStartLine = OldStartLine - 8;
else NewStartLine = OldStartLine + 64 - 8;
// update start line
for( k=0; k<3; k++ ) //chang 3
{
if( WaitUntilReady( k ) != 0 ) return -1;
outportb( CmdPort[k], 0xc0+NewStartLine );
}
// clear start row
for( k=0; k<3; k++ ) //change 3
{
if( WaitUntilReady( k ) != 0 ) return -1;
outportb( CmdPort[k], 0xb8+(NewStartLine/8) );
if( WaitUntilReady( k ) != 0 ) return -1;
outportb( CmdPort[k], 0x40 );
for( i=0; i<ColBankSize; i++ )
{
if( WaitUntilReady( k ) != 0 ) return -1;
outportb( DatPort[k], 0 );
}
}
return NewStartLine;
}
// input x = 0 -- 192
// PgIdx = 0,1,..7
int WriteChar( int x, int PgIdx, char aChar, int TxtColor )
{
unsigned int i, Idx, ColNum;
unsigned int CmdPort[3], DatPort[3];
unsigned char abyte;
if( (x<0) || (x>=192) ) return -2;
if( (PgIdx<0) || (PgIdx>=8) ) return -2;
CmdPort[0] = CmdPort0;
DatPort[0] = DatPort0;
CmdPort[1] = CmdPort1;
DatPort[1] = DatPort1;
CmdPort[2] = CmdPort2;
DatPort[2] = DatPort2;
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 );
for( i=0; i<8; i++ )
{
abyte = VerticalFont[aChar][i];
//abyte = abyte ^ XORByte;
if( WaitUntilReady( Idx ) != 0 ) return -1;
outportb( DatPort[Idx], abyte );
/*
ColNum++;
if( ColNum >= 64 )
{
ColNum = 0;
Idx = (Idx+1)%3;
if( WaitUntilReady( Idx ) != 0 ) return -1;
outportb( CmdPort[Idx], 0xb8+PgIdx );
if( WaitUntilReady( Idx ) != 0 ) return -1;
outportb( CmdPort[Idx], 0x40+ColNum );
}
*/
}
return 0;
}
// input x = 0 -- 192
// PgIdx = 0,1,..,7
int WriteString( int x, int PgIdx, char* aStr, int TxtColor )
{
int i, len, status;
len = strlen( aStr );
for( i=0; i<len; i++ )
{
status = WriteChar( x, PgIdx, aStr[i], TxtColor );
if( status != 0 ) return status;
x += 8;
}
return 0;
}
/* End of HD61202 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -