📄 lcm320240.h
字号:
DelayMs(150); // 调延时子程序
}
}
//============================== 西文显示演示程序 ==============================
// 仅仅用于文本方式下的西文字符串显示,本函数只写入第1显示区
void TextDisp( uchar Ox,uchar Oy, uchar code *ptr ) {
uchar TexLength=0,ii;
uint iTemp;
while(ptr[TexLength]>0x1f) {TexLength++;}; // 获取字串长度
//判断是否为内部的字符码
WriteCommand(CsrForm); // 光标形状设置,代码0x5d
WriteData(0x07); // 设置光标水平点为CSX=8
WriteData(0x07); // 光标为块状形式,垂直点为CSY=8
WriteCommand(Ovlay); // 显示合成方式设置.代码0x5b
WriteData(0x04); // 设置参数:显示1区为文本属性,二重or合成
WriteCommand( DispOn ); // 写入指令DISP ON/OFF代码,后续参数:
// WriteData( 0x56 ); // 01 01 01 10显示1~4区开显示,光标闪烁显示
WriteData( 0x54 ); // 显示 1~4 区开显示,光标关显示,且不闪烁
iTemp = (uint)Oy * paraP9 + Ox; // 光标位置到实际ram地址换算
WriteCommand( CsrDirR ); // 自动右移光标指向
WriteCommand( CsrW ); // 制定光标位置
WriteData( (uchar)(iTemp &0xff) ); // 设置光标地址CSR
WriteData( (uchar)(iTemp /256 ) ); // 加入显示三区起始地址SAD2H
WriteCommand( mWrite ); // 当前位置写入数据指令
for(ii=0;ii < TexLength;ii++) {
WriteData( ptr[ii] ); // 写入显示字符代码
}
DelayMs(350);
}
//################函数5.延时子程序#########################################
//延时子程序1
//短暂延时参数tt
void Delay( uint tt ) {
while( tt-- );
}
//################函数6.长延时程序#########################################
// 延时程序2
// 参数:count
// 延时: 1MS *COUNT
void DelayMs(uint count)
{
uint i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++)
;
}
//################函数8. 清显示 32K RAM区(清屏)子程序######################
// 清显示 32K RAM区(清屏)子程序
void LcmClear( void ) {
uint i1=32768;//32K大小RAM清零
WriteCommand( CsrDirR ); // 光标移动方向定义:自动右移
WriteCommand( CsrW ); // 光标Locate,定位
WriteData( 0 ); // 写入参数CSRL设置参数光标指针低8位
WriteData( 0 ); // 写入参数CSRH设置参数光标指针高8位
WriteCommand( mWrite ); // 数据写入指令,代码0x42
while(i1--) {
WriteData( 0x0 ); // 写入数据0
}
}
//################函数9.光标位定位###########################################
// 光标位定位,用于在1,2区图形方式下时调用
// 输入参数:x...水平方向字节单位坐标,即可以以半个汉字宽度设定水平坐标(0--39)
// y...垂直方向以行线定位的坐标,可以定位到点单位.(0--29)
// attribs=1则指向2区 BasePart2为2区显示缓存的高位 2区显示缓存的低位为0
// 规定左上角约定坐标为( 0, 0 )
void Locatexy(uchar x,uchar y, uchar attribs)
{
uint temp;
temp = (uint)y*paraP9+x;
if(attribs==1)temp+=BasePart2;
if(attribs==2)temp+=BasePart3;
WriteCommand( CsrW ); // 光标Locate,定位
WriteData( (uint)(temp & 0xff) ); // 写入参数CSRL设置参数光标指针低8位
WriteData( (uint)(temp /256)); // 写入参数CSRH设置参数光标指针高8位
}
//################函数7.单个汉字写入子程序(图形方式)########################
// 汉字写入子程序(图形方式)。每次调用输出一个汉字
// 支持图形方式使用,完成汉字点阵码的输出。
// 携入参数: Ox,Oy....写入显示的左上角坐标,Ox是以字节单位,Oy以行扫描线单位
// DotWidth为汉字点数选择 这里提供16点和24点两种选择
// cnumber 为字码表中的位置即第几个字
// att 为写入区位选择,为0选择第一区,为1选择第二区
//需要显示24点的汉字要在程序里建24点字库表
void PutCdotInGraph( uint Ox, uchar Oy,uchar Cnumber,uchar DotWidth,uchar att )
{
uint tempPtr,Optr;
uchar tempCount1,tempCount2,nByte;
Optr = (uint)Oy * paraP9 + Ox;//将Y轴地址转换为RAM的地址值
nByte = DotWidth/8; //计算有多少个字节
WriteCommand( CsrDirD ); // 自动右移。
tempPtr = (uint)Cnumber * DotWidth*nByte;//计算指针要偏移多少个字节
if(att)Optr += BasePart2;
for (tempCount1=0;tempCount1<nByte;tempCount1++) {
WriteCommand( CsrW ); // 光标定位指令
WriteData( (uchar)(Optr &0xff) ); // 设置光标地址CSR
WriteData( (uchar)(Optr /256 ));
WriteCommand( mWrite ); // ram写指令
switch(DotWidth){
case 8 : for(tempCount2=0;tempCount2<DotWidth;tempCount2++){
WriteData(nAsciiDot[tempPtr]);
tempPtr++;
}break;
case 16: for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
WriteData( Cdotlib[Cnumber].Msk[tempCount2*2+tempCount1] ); // 写入数据
}//先写入左半字 ,后写的右半字
break;
case 24: for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
WriteData( Cdot24lib[tempPtr] ); // 写入数据
tempPtr += nByte;
}//将一个字分成3个左中右三个部分,分三次写完
break;
}
tempPtr = Cnumber * DotWidth*nByte + tempCount1 + 1;
Optr++;
}
}
//#######################函数11。绘点子程序##########################################################################
// 绘点子程序,携入参数X坐标的最高位决定写或擦点
// 入口参数:(px,py)为点坐标 px可以超过256
// 参数 attr attr=1为绘制图形 attr=0为擦除图形
void Point(uint Px, uchar Py, uchar attr,uchar qu ) {
uint tempPtr;
uchar tempD,tempP;
tempPtr = (uint)Py * paraP9 + Px/8; // 去除最高位(显示属性)
if(qu)tempPtr += BasePart2; // 如果需要就指向第二区,加上第二区首地址
WriteCommand( CsrDirR ); // CSRDIR 代码(光标自动下移)
WriteCommand( CsrW ); // 设置光标地址
WriteData( (uchar)(tempPtr & 0xff));
WriteData( (uchar)(tempPtr /256));
WriteCommand( mRead ); // 读显示ram指令
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) );
WriteCommand( mWrite ); // 代码0x42,数据写入指令
WriteData( tempD ); // 写入合成数据
}
//##########################函数12。画线###################################################
//*画线。任意方向的斜线,直线数学方程 aX+bY=1
//入口参数:初始点(X0,Y0) X0 Y0为初始点的点坐标 x0为整形可大于256
// 终点 (xt,yt) Xt Yt为终点的点坐标 xt为整形可大于256
// 参数 att att=1为绘制图形 att=0为擦除图形
// 参数 qu qu=1为2区 qu=0为1区
void Linexy(uint x0,uchar y0,uint xt,uchar yt,uchar att,uchar qu)
{
register uint t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int 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((uint)col,row,att,qu); //画点
xerr += delta_x ;
yerr += delta_y ;
if( xerr > distance )
{
xerr-=distance;
col+=incx;
}
if( yerr > distance )
{
yerr-=distance;
row+=incy;
}
}
}
//#####################函数13。矩形绘制函数############################################################################
//矩形绘制函数
//入口参数:
// X0 Y0为左上角的点 (x0,y0) 为点的坐标 x0为整形可大于256
// WIDE HIGHT分别为宽度和高 WIDE为整形可大于256
// att为绘制或者擦除矩形 att=1为绘制图形
void Rectangle( uint X0, uchar Y0, uint wide,uchar hight,uchar att,uchar qu)
{
uint ra0,ra1,ra2,ra3;
uchar rb0,rb1,rb2,rb3;
ra0=X0;
rb0=Y0;
ra1=X0+wide;
rb1=Y0;
ra2=X0;
rb2=Y0+hight;
ra3=X0+wide;
rb3=Y0+hight;
Linexy( ra0,rb0,ra1,rb1,att,qu);
Linexy( ra0,rb0,ra2,rb2,att,qu);
Linexy( ra2,rb2,ra3,rb3,att,qu);
Linexy( ra1,rb1,ra3,rb3,att,qu);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -