📄 sed1335.c
字号:
//============================================================================
// Header: SED1335驱动320x240图形液晶驱动程序
// Author: wjxiao
// Date: 2005-08-15
//============================================================================
#include <C8051F020.h>
//#include <CharInt.h>
#include <intrins.h>
#include <string.h>
#include <font.c>
#include <Asc16x24.c>
#include <ASc16x16.c>
#include <ASc8x16.c>
//============================================================================
// 地址定义
//----------------------------------------------------------------------------
uchar bdata lcd_cbus;
sbit WR = lcd_cbus^3;
sbit RD = lcd_cbus^4;
sbit CS = lcd_cbus^5;
sbit A0 = lcd_cbus^6;
sbit RES = lcd_cbus^7;
//============================================================================
#define SystemSet 0x40 // 初始化设置,后续8字节参数串ParaSysTable8[]
uchar code ParaSysTable8[] = // P1-P8参数
{
0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00
};
//----------------------------------------------------------------------------
#define Scroll 0x44 // 显示域设置,后续10字节参数串ParaScrTableA[]
#define BasePart1 0x00
#define BasePart2 0x28
#define BasePart3 0x28*2
#define BasePart4 0x00
uchar code ParaScrTableA[] =
{
0x00,BasePart1,0xF0,0x00,BasePart2,0xF0,0x00,BasePart3,0x00,BasePart4
};
//----------------------------------------------------------------------------
#define SleepIn 0x53 // 休闲模式设置 后续参数:无
#define DispOn 0x59 // 显示状态设置 后续参数1字节
#define DispOff 0x58
#define HdotScr 0x5a // 点位移设置 后续参数1字节
#define Ovlay 0x5b // 显示合成方式设置 后续参数1字节
#define CgramAdr 0x5c // Cgram首地址设置 后续参数2字节
#define CsrForm 0x5d // 光标形状设置 后续参数2字节
#define CsrDirR 0x4c // 光标移动方向设置 后续参数:无
#define CsrDirL 0x4d
#define CsrDirU 0x4e
#define CsrDirD 0x4f
#define CsrW 0x46 // 光标指针设置 后续参数2字节
#define CsrR 0x47 // 读取光标指针 后续参数2字节
#define mWrite 0x42 // 数据写入设置 后续参数N字节
#define mRead 0x43 // 数据读取设置 后续参数N字节
//==============================================================================
#define Busy 0x40 // 忙状态标志位0b0100 0000
#define paraP9 40 // 相对于320 X 240
//==============================================================================
void WriteData( uchar dataW );
void WriteCommand( uchar CommandByte );
void LcmClear( uchar port );
void Locatexy(uchar x,uchar y, uchar attribs);
void PutStr24( uchar Port, uchar x, uchar y, char *ptr, uchar len, bit attr );
void PutStr16( uchar Port, uchar x, uchar y, char *ptr, uchar len, bit attr );
void PutStr32( uchar Port, uchar x, uchar y, char *ptr, uchar len, bit attr );
//============================================================================
// 写指令代码子程序
//----------------------------------------------------------------------------
#define databus P7
void WriteCommand( uchar Command )
{
P74OUT = 0xf3;
CS = 0;
A0 = 1;
RD = 1;
WR = 0;
P6 = lcd_cbus;
databus = Command;
WR = 1;
CS = 1;
P6 = lcd_cbus;
}
//============================================================================
// 写参数及显示数据子程序
//----------------------------------------------------------------------------
void WriteData( uchar dataW )
{
P74OUT = 0xf3;
A0 = 0;
RD = 1;
WR = 0;
CS = 0;
P6 = lcd_cbus;
databus = dataW;
WR = 1;
CS = 1;
P6 = lcd_cbus;
}
//============================================================================
// 读参数及显示数据子程序
//----------------------------------------------------------------------------
uchar ReadDataLcm( void )
{
uchar dataD;
P74OUT = 0x33;
P7 = 0xff;
A0 = 1;
WR = 1;
RD = 0;
CS = 0;
P6 = lcd_cbus;
_nop_();
_nop_();
_nop_();
_nop_();
dataD = databus;
RD = 1;
CS = 1;
P6 = lcd_cbus;
return dataD;
}
//============================================================================
// 初试化
//----------------------------------------------------------------------------
void LcmInition( void )
{
uchar i;
RES = 1;
WriteCommand( SystemSet ); // 系统参数设置
for (i=0;i<8;i++)
{
WriteData( ParaSysTable8[i] );
}
WriteCommand( Scroll ); // 设定显示区域起始地址
for (i=0;i<10;i++)
{
WriteData( ParaScrTableA[i] );
}
WriteCommand( HdotScr ); // 写入点位移指令代码
WriteData( 0 ); // 写入P1参数
WriteCommand( Ovlay ); // 显示合成方式设置
WriteData( 0x0d ); // 显示一区图形,三区图形属性,二重"异或"合成
WriteCommand( DispOn ); // 写入指令代码
WriteData( 0x14 ); // 显示 1~4 区开显示,光标关显示
}
//============================================================================
// 光标位定位,图形方式下
// (1) x: 水平方向字节单位坐标
// (2) y: 垂直方向以行线定位的坐标
// (3) 左上角约定坐标为( 0, 0 )
//----------------------------------------------------------------------------
void Locatexy(uchar port, uchar x,uchar y)
{
uint temp;
temp = (uint)y*paraP9 + x;
WriteCommand( CsrW ); // 光标Locate,定位
WriteData( (uchar)(temp & 0xff) ); // 写入参数CSRL设置参数光标指针低8位
WriteData( (uchar)( (temp >>8 ) + 0x28 * port) ); // 写入参数CSRH设置参数光标指针高8位
}
//============================================================================
// 清屏 port 区
//----------------------------------------------------------------------------
void LcmClear( uchar port )
{
uint i = 40*240;
WriteCommand( CsrDirR ); // 光标自动右移
Locatexy( port,0,0 );
WriteCommand( mWrite ); // 数据写入指令,代码0x42
while(i--)
WriteData( 0 );
}
//============================================================================
// 显示中西文混合字符串
// (1) uchar port : 显示区
// (2) uchar x : 水平方向字节单位坐标
// (3) uchar y : 垂直方向以行线定位的坐标
// (4) uchar * Str : 字符串指针,以 \0 结尾
// (5) uchar LibName : 字库名(指针号)
// (6) bit attr : 0 - 正常
// 1 - 反白
//----------------------------------------------------------------------------
void PutStr( uchar Port,uchar x,uchar y,char * Str,uchar LibName, bit attr)
{
// 相对于ASCII,汉字为□字
#define Dot8 0
#define Dot16 1
#define Dot24 2
#define Dot32 3
#define ascii8 1, 16
#define ascii16 2, 16
#define ascii24 2, 24
#define ascii32 0, 0
#define gb8 0, 0
#define gb16 2, 16
#define gb24 3, 24
#define gb32 4, 32
uchar i,j,k;
char ASC_GB;
char code *p;
struct
{
uchar byte;
uchar high;
} lattice[][4] =
{
{ // ASCII字库
ascii8 ,
ascii16 ,
ascii24 ,
ascii32 ,
},
{
gb8 ,
gb16 ,
gb24 ,
gb32 ,
}
};
WriteCommand( CsrDirD ); // 光标自动下移
for( i=0;i<strlen(Str);i++)
{
uchar c1,c2;
c1 = Str[i];
c2 = Str[i+1];
//--------------------------------------------------------------------
if(c1 <=128) // ASCII
{
ASC_GB = 0;
switch(LibName)
{
case Dot8:
j = Str[i]-0x20;
p = Asc8x16[j];
break;
case Dot16:
for(j=0;j<sizeof(Asc16x16)/sizeof(Asc16x16[0]);j++) // 查找定位
if( c1 == Asc16x16[j].Index[0] ) break;
p = Asc16x16[j].Msk;
break;
case Dot24:
for(j=0;j<sizeof(Asc16x24)/sizeof(Asc16x24[0]);j++) // 查找定位
if( c1 == Asc16x24[j].Index[0] ) break;
p = Asc16x24[j].Msk;
break;
}
}
else // 汉字
{
ASC_GB = 1;
switch(LibName)
{
case Dot16:
for(j=0;j<sizeof(GB16)/sizeof(GB16[0]);j++) // 查找定位
if( c1 == GB16[j].Index[0] &&
c2 == GB16[j].Index[1] )
break;
p = GB16[j].Msk;
break;
case Dot24:
for(j=0;j<sizeof(GB24)/sizeof(GB24[0]);j++) // 查找定位
if( c1 == GB24[j].Index[0] &&
c2 == GB24[j].Index[1] )
break;
p = GB24[j].Msk;
break;
case Dot32:
for(j=0;j<sizeof(GB32)/sizeof(GB32[0]);j++) // 查找定位
if( c1 == GB32[j].Index[0] &&
c2 == GB32[j].Index[1] )
break;
p = GB32[j].Msk;
break;
}
}
for(j=0;j<lattice[ASC_GB][LibName].byte;j++) // 分列输出
{
Locatexy(Port,x,y);
WriteCommand( mWrite ); // 写数据(命令)
for(k=0;k<lattice[ASC_GB][LibName].high;k++)
{
uchar dat;
dat = *p++;
if(attr) dat = ~dat;
WriteData(dat);
}
x++; // 列数加1
}
if(ASC_GB) i++;
}
}
//============================================================================
// 显示 显示光标
//----------------------------------------------------------------------------
void DispCursor(uchar x, uchar y, uchar byte, uchar High, bit attr )
{
uchar i,j;
WriteCommand( CsrDirD );
for(i=0;i<byte;i++) // 分列输出
{
Locatexy(1,x+i,y);
WriteCommand( mWrite ); // 写数据(命令)
for(j=0;j<High;j++)
if(attr) WriteData( 0xff );
else WriteData( 0x00 );
}
}
//=====================================================================================
// 绘点子程序,携入参数X坐标的最高位决定写或擦点
// ====================================================
void Point(uchar port, uint Px, uchar Py, bit attr )
{
uint tempPtr;
uchar tempD,tempP;
tempPtr = (uint)Py * paraP9 + Px / 8;
WriteCommand( CsrDirD ); // CSRDIR 代码(光标自动下移)
WriteCommand( CsrW ); // 设置光标地址
WriteData( (uchar)(tempPtr & 0xff) );
WriteData( (uchar)(tempPtr /256) + 0x28 * port );
WriteCommand( mRead ); // 读显示ram指令
//Delay(50);
tempD = ReadDataLcm(); // 读取当前显示数据
tempP = 1<<(uchar)(7-Px & 0x0007);
// 根据预定属性决定写点或擦除
if( attr )tempD |= tempP; // 画点
else tempD &= ~tempP; // 消点
WriteCommand( CsrW ); // 重新设置光标地址
WriteData( (uchar)(tempPtr & 0xff) );
WriteData( (uchar)(tempPtr /256) + 0x28 * port );
WriteCommand( mWrite ); // 代码0x42,数据写入指令
WriteData( tempD ); // 写入合成数据
}
/********************************************/
/*画线。任意方向的斜线,直线数学方程 aX+bY=1 */
/********************************************/
// 参数类型有待修改
void Linexy(uchar port, uint x0,uchar y0,uint xt,uchar yt,bit att)
{
register uint t;
int xdata xerr=0,yerr=0,delta_x,delta_y,distance;
int xdata incx,incy;
uint row,col;
delta_x = xt-x0; //计算坐标增量
delta_y = yt-y0;
col = x0;
row = y0;
if(delta_x>0) incx=1; //设置单步方向
else
{
if( delta_x==0 ) incx=0; //垂直线
else {incx=-1;delta_x=-delta_x;}
}
if(delta_y>0) incy=1;
else
{
if( delta_y==0 ) incy=0; //水平线
else {incy=-1;delta_y=-delta_y;}
}
if( delta_x > delta_y ) distance=delta_x; //选取基本增量坐标轴
else distance=delta_y;
for( t=0;t <= distance+1; t++ )
{ //画线输出
Point(port,(uint)col,row,att); //画点
xerr += delta_x ;
yerr += delta_y ;
if( xerr > distance )
{
xerr-=distance;
col+=incx;
}
if( yerr > distance )
{
yerr-=distance;
row+=incy;
}
}
}
//======================================================================
// 矩形
void Rectangle(uchar port, uint x0, uchar y0, uint x1, uchar y1, bit attr)
{
Linexy(port, x0, y0, x1, y0, attr);
Linexy(port, x1, y0, x1, y1, attr);
Linexy(port, x1, y1, x0, y1, attr);
Linexy(port, x0, y1, x0, y0, attr);
}
void PortXCH(bit XCH) // 交换1、3显示区
{
uchar i;
uchar code ParaScrTableA[][10] =
{
0x00,0x00, 0xF0,0x00,0x28,0xF0,0x00,0x28*2,0x00,0 ,
0x00,0x28*2,0xF0,0x00,0x28,0xF0,0x00,0x00, 0x00,0 ,
};
WriteCommand( 0x44 ); //设定显示区域起始地址
for (i=0;i<10;i++)
WriteData( ParaScrTableA[XCH][i] );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -