📄 my6963.c
字号:
unsigned char i;
for(i=10;i>0;i--)
{
if((LCMCW & 0x40) == 0x40)
{
break;
}
}
return(i); // 若返回零说明错误
}
/************************/
/* 写双参数的指令*/
/************************/
unsigned char fnPR1(unsigned char uCmd,unsigned char uPar1,unsigned char uPar2)
{
if(fnSTA01() == 0)
{
return 1;
}
LCMDW=uPar1;
if(fnSTA01() == 0)
{
return 2;
}
LCMDW=uPar2;
if(fnSTA01() == 0)
{
return 3;
}
LCMCW=uCmd;
return(0); // 返回0 成功
}
/************************/
/* 写单参数的指令*/
/************************/
unsigned char fnPR11(unsigned char uCmd,unsigned char uPar1)
{
if(fnSTA01() == 0)
{
return 1;
}
LCMDW=uPar1;
if(fnSTA01() == 0)
{
return 2;
}
LCMCW=uCmd;
return(0); // 返回0 成功
}
/************************/
/* 写无参数的指令*/
/************************/
unsigned char fnPR12(unsigned char uCmd)
{
if(fnSTA01() == 0)
{
return 1;
}
LCMCW=uCmd;
return(0); // 返回0 成功
}
/************************/
/* 写数据*/
/************************/
unsigned char fnPR13(unsigned char uData)
{
if(fnSTA3() == 0)
{
return 1;
}
LCMDW=uData;
return(0); // 返回0 成功
}
/************************/
/* 读数据*/
/************************/
unsigned char fnPR2(void)
{
// unsigned char temp;
if(fnSTA01() == 0)
{
return 1; // 获取状态如果状态错
}
return(LCMDW); // 返回数据
}
/************************/
/* 设置当前地址*/ //RAM里
/************************/
void fnSetPos(unsigned char urow, unsigned char ucol)
{
unsigned int iPos;
iPos = (unsigned int)urow * 30 + ucol;
fnPR1(LC_ADD_POS,iPos&0xff,iPos/256);
gCurRow = urow;
gCurCol = ucol;
}
/**********************/
/* 设置当前显示行列*/
/**********************/
void cursor(unsigned char uRow, unsigned char uCol)
{
fnSetPos(uRow * 16, uCol);
}
/*********************/
/* 清屏*/
/*********************/
void cls(void)
{
unsigned int i;
fnPR1(LC_ADD_POS,0x00,0x00); // 置地址指针为从零开始
fnPR12(LC_AUT_WR); // 自动写
for(i=0;i<240*128/8;i++) // 清一屏
{
fnSTA3();
fnPR13(0x0); // 写数据实际使用时请将0x55 改成0x0
}
fnPR12(LC_AUT_OVR); // 自动写结束
fnPR1(LC_ADD_POS,0x00,0x00); // 重置地址指针
gCurRow = 0; // 置地址指针存储变量
gCurCol = 0;
}
/************************/
/* LCM 初始化*/
/************************/
char fnLCMInit(void)
{
if(fnPR1(LC_TXT_STP,0x00,0x00) != 0) // 文本显示区首地址
{
return (0xff);
}
fnPR1(LC_TXT_WID,0x1E,0x00); // 文本显示区宽度
fnPR1(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
fnPR1(LC_GRH_WID,0x1E,0x00); // 图形显示区宽度
fnPR12(LC_CUR_SHP | 0x01); // 光标形状
fnPR12(LC_MOD_OR); // 显示方式设置
fnPR12(LC_DIS_SW | 0x08); // 显示开关设置
return(0);
}
/********************************************************/
/* ASCII(8*16) 及 汉字(16*16) 显示函数 */
/********************************************************/
unsigned char dprintf(unsigned char x,unsigned char y, char *ptr)
{
// uchar gCurRow,gCurCol; // 当前行列存储行高16 点列宽8点
// 每行共有30个字节(30个字节*8=240个像素)
// 每个字占用的行高【16个列像素,8个行像素ASCII(16个行像素汉字)】
unsigned char c1,c2;//cData;
unsigned char i,j,uLen,uRow,uCol;
unsigned int k;
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<16;j++) //写16行
{
fnPR12(LC_AUT_WR); // 写数据(命令)
if (c1 >= 0x20)
{
fnPR13( ASC_MSK[(c1-0x20)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)] );
}
else
{
fnPR13(0x00);// 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行循环
{
fnSetPos(uRow+k,uCol);
fnPR12(LC_AUT_WR); // 写数据
if(j < sizeof(GB_16)/sizeof(GB_16[0])) //四个汉字 第几个汉字
{
fnPR13(GB_16[j].Msk[k*2]);
fnPR13(GB_16[j].Msk[k*2+1]);
}
else // 未找到该字
{
if(k < sizeof(GB_16[0].Msk)/4)
{
fnPR13(0x00);
fnPR13(0x00);
}
else
{
fnPR13(0xff);
fnPR13(0xff);
}
}
fnPR12(LC_AUT_OVR);
}
uCol += 2;
i++;
};
if(uCol >= 30) // 光标后移
{
uRow += 16;
if (uRow < 0x80)
{
uCol -= 30;
}
else
{
uRow = 0;
uCol = 0;
}
}
fnSetPos(uRow,uCol);
i++;
}
return uLen; //返回字串长度,汉字按2字节计算
}
/*======================*/
/* 延时*/
/*======================*/
void shortdelay(unsigned int tt)
{
unsigned char i;
while (tt)
{
i=100;
while (i)
{
i--;
}
tt--;
}
}
/*************************/
/* 画点*/
/*************************/
void point(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 Linexy(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++ ) // 画线输出
{
point(uRow,uCol,s); // 画点
xerr += delta_x;
yerr += delta_y;
if( xerr > distance )
{
xerr -= distance;
uRow += incx;
}
if( yerr > distance )
{
yerr -= distance;
uCol += incy;
}
}
}
void main(void) // 测试用
{
unsigned char i,j,l,k;
shortdelay(1200);
fnLCMInit();
cls();
cursor(0,0);
dprintf(12,0,"I completed T6963C");
dprintf(10,1,"display with AT89C52");
dprintf(10,2,"---hubei, china ---");
dprintf(10,3,"07-11-22 15:49 周四");
k=0;
for(l=0;l<img1[1];l++)//交错显示两个图像 //列显示的像素img1[1]=40
{
fnSetPos(k,0);k++;
fnPR12(LC_AUT_WR); // 写数据
for(j=0;j<img1[0]/8;j++) //行显示的像素位5(img1[0]/8)*8
fnPR13(img1[l*(img1[0]/8)+j+2]);
fnPR12(LC_AUT_OVR);
}
shortdelay(3000);
k=24;
for(l=0;l<img1[1];l++)
{
fnSetPos(k,5);k++;
fnPR12(LC_AUT_WR); // 写数据
for(j=0;j<img1[0]/8;j++)
fnPR13(img1[l*(img1[0]/8)+j+2]);
fnPR12(LC_AUT_OVR);
}
shortdelay(3000);
Linexy(0,0,79,0,8); // 横线
shortdelay(3000);
Linexy(0,63,79,63,8); // 横线
shortdelay(3000);
Linexy(0,0,0,63,8); // 竖线
shortdelay(3000);
Linexy(79,0,79,63,8); // 竖线
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -