📄 lcd_12864.h
字号:
uRow = fnGetRow();
uCol = fnGetCol();
for(j=0;j<ASC_CHR_HEIGHT;j++) //写16行
{
fnPR12(LC_AUT_WR); // 写数据(命令)
if (c1 >= 0x20)
{
fnPR13( ASC_MSK[(c1-0x20)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)] );
}
else
{
fnPR13(cData);
}
fnPR12(LC_AUT_OVR); //写数据结束
fnSetPos(uRow+j+1,uCol);
}
if(c1 != BS) // 非退格
{
uCol++; // 列数加1
}
}
/**************************************************
函数名称 Dispnumber(uint number,uchar j,uchar x,uchar y)
修改日期 :07.07.10日 11.20分
**************************************************/
void Dispnumber(uint number,uchar j,uchar x,uchar y)
//显示一个INT型的数字,J为所要显示的位数,X,Y为显示的末坐标
{
unsigned char temp;
for(;(j>0)&(j<6);j--)
{
temp=number%10+0x30;
Disponechar(x--,y,temp);
number=number/10;
}
}
/**************************************************
函数名称 dispnumber_long(uint number,uchar j,uchar x,uchar y)
修改日期 :07.07.10日 11.30分
**************************************************/
void Dispnumber_long(ulong number,uchar j,uchar x,uchar y)
//显示一个LONG型的数字,J为所要显示的位数,X,Y为显示的末坐标
{
unsigned char i=0,digit;
ulong temp;
temp=number;
for(;j>0;j--)
{
i++;
digit=temp%10+0x30;
Disponechar(x--,y,digit);
temp=temp/10;
if(temp==0) break;
if(i==3){Disponechar(x--,y,',');i=0;}
}
}
/**************************************************
函数名称 dispnumber_float(uint number,uchar i,uchar j,uchar x,uchar y)
修改日期:07.07.22日 21.33分
函数功能: 显示小数,但原理与直接显示float型的数不同,此函数是直接将小数点写入,此处形参number为扩大一定倍数后的值.
备注: 此方式比显示float型的数速度快,可在大多数情况下代替函数 dispnumber_float();
***************************************************/
void Dispnumber_float(uint number,uchar i,uchar j,uchar x,uchar y)
//显示一个INT型的数字,i为所要显示的总位数,j为小数部分的位数,X,Y为显示的末坐标
{
unsigned char k=0,temp;
for(;(i>0)&(i<6);k++,i--)
{
temp=number%10+0x30;
if(k==j) Disponechar(x--,y,'.');
Disponechar(x--,y,temp);
number=number/10;
// if(number==0) break;
}
}
/********************************************************/
/* ASCII(8*16) 及 汉字(16*16) 显示函数 */
/********************************************************/
unsigned char LcdPrintf(unsigned char x,unsigned char y, char *ptr)
{
unsigned char c1,c2,cData;
unsigned char i,j,uLen,uRow,uCol;
unsigned int k;
unsigned char temp,q;
uLen=0;
i=0;
uRow = y;
uCol = x;
fnSetPos(uRow*16,uCol); //起点定位
while (ptr[uLen]!=0) //探测字串长度
{
uLen++;
}
while(i<uLen)
{
c1 = ptr[i];
c2 = ptr[i+1];
//ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
uRow = fnGetRow();
uCol = fnGetCol();
if(c1 <=128) // ASCII
{
for(j=0;j<ASC_CHR_HEIGHT;j++) //写16行
{
fnPR12(LC_AUT_WR); // 写数据(命令)
if (c1 >= 0x20)
{
fnPR13( ASC_MSK[(c1-0x20)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)] );
}
else
{
fnPR13(cData);
}
fnPR12(LC_AUT_OVR); //写数据结束
fnSetPos(uRow+j+1,uCol);
}
if(c1 != BS) // 非退格
{
uCol++; // 列数加1
}
}
else // 中文
{
for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++) // 查找定位,第几个汉字
{
if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
{
break;
}
}
//for(k=0;k<sizeof(GB_16[0].Msk)/2;k++) //16行循环
for(k=0;k<CHAR_HEIGHT;k++) //CHAR_HEIGHT 行循环
{
fnSetPos(uRow+k,uCol);
fnPR12(LC_AUT_WR); // 写数据
if(j < sizeof(GB_16)/sizeof(GB_16[0])) //第几个汉字
{
//汉字大小为16*16
// fnPR13(GB_16[j].Msk[k*2]);
// fnPR13(GB_16[j].Msk[k*2+1]);
temp=CHAR_LONG/8;
for(q=0;q<temp;q++)
fnPR13(GB_16[j].Msk[k*temp+q]);
}
else // 未找到该字
{
if(k < sizeof(GB_16[0].Msk)/4)
{
fnPR13(0x00);
fnPR13(0x00);
}
else
{
fnPR13(0xff);
fnPR13(0xff);
}
}
fnPR12(LC_AUT_OVR);
}
//汉字大小为16*16
//uCol += 2;
//汉字大小为24*24
// uCol += 3;
//汉字大小为32*32
uCol += temp;
i++;
}
if(uCol >= LCD_XMAX/ASC_CHR_WIDTH)
{
uRow +=ASC_CHR_HEIGHT;
if(uRow < 0x40) //显示到最后一个坐标处则从头显示a
{
uCol -= LCD_XMAX/ASC_CHR_WIDTH;
}
else
{
uRow = 0;
uCol = 0;
}
}
fnSetPos(uRow,uCol);
i++;
}
return uLen; //返回字串长度,汉字按2字节计算
}
/*************************/
/* 画点*/
/*************************/
/*
void LCDPoint(unsigned char x,unsigned char y,unsigned char s)
{
unsigned char x1;
x1 = x >> 3; // 取Y方向分页地址
fnSetPos(y,x1); // 起点定位
x1 = turnf[ x & 0x07 ];
x1 = 0xF0 | x1 | s; // 字节内位置计算
fnPR12(x1); // 画上屏幕S显示属性8 画点0 擦除点
}
*/
/************************************************/
/* 画线任意方向的斜线,直线数学方程aX+bY=1 */
/************************************************/
/*
void LCDLinexy(unsigned char x0,unsigned char y0,unsigned char xt,unsigned char yt,unsigned char s)
{
register unsigned char t;
int xerr = 0,yerr = 0;
int delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
delta_x = xt-x0; // 计算坐标增量
delta_y = yt-y0;
uRow = x0;
uCol = 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++ ) // 画线输出
{
LCDPoint(uRow,uCol,s); // 画点
xerr += delta_x;
yerr += delta_y;
if( xerr > distance )
{
xerr -= distance;
uRow += incx;
}
if( yerr > distance )
{
yerr -= distance;
uCol += incy;
}
}
}
*/
/********************************************/
/* 画圆数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2 */
/********************************************/
/*
void LCDCircle(unsigned char Ox,unsigned char Oy,unsigned char Rx,unsigned char s)
{
unsigned int xx,rr;
unsigned int xt,yt;
unsigned int rs,row,col;
yt = Rx;
rr = (unsigned int)Rx*Rx+1; // 补偿1 修正方形
rs = (yt+(yt>>1))>>1; // (*0.75)分开1/8圆弧来画
for (xt=0;xt<=rs;xt++)
{
xx = xt*xt;
while ((yt*yt)>(rr-xx))
{
yt--;
}
row = Ox+xt; // 第一象限
col = Oy-yt;
LCDPoint(row,col,s);
row = Ox-xt; // 第二象限
LCDPoint(row,col,s);
col = Oy+yt; // 第三象限
LCDPoint(row,col,s);
row = Ox+xt; // 第四象限
LCDPoint(row,col,s);
// 45度镜象画另一半
row = Ox+yt; // 第一象限
col = Oy-xt;
LCDPoint(row,col,s);
row = Ox-yt; // 第二象限
LCDPoint(row,col,s);
col = Oy+xt; // 第三象限
LCDPoint(row,col,s);
row = Ox+yt; // 第四象限
LCDPoint(row,col,s);
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -