📄 t6963_yejin.c
字号:
T6963_Yejin.C
#i nclude "T6963_YeJin12864.h"
extern unsigned char code chardot[];
// UNINT CurrentTextPoint /*应定义成全程变量方式,
/* 绝对定位形式可以考虑*/
/*当前的图形显示口地址*/
// UNINT CurrentGraphPoint /*同上*/
UNCHAR data CharType;
UNINT CurrentPoint;/*当前显存的指针*/
/*读取液晶的状态*/
//要求片选LCDCE=0,CD=1
UNCHAR T6963_readStauteOfYieJin()/*reentrant*/
{
return XBYTE[T6963_CtrOfYieJin];
}
/*判断指令读写状态和数据读写状态*/
void T6963_judge(UNCHAR mode)/*reentrant*/
{
UNCHAR temp = 0;
while (temp != mode)
{
temp = T6963_readStauteOfYieJin();
temp = temp & mode;
}
}
/*写入一个数据或命令参数*/
//要求片选LCDCE=0,CD=0
void T6963_writeAData(UNCHAR data1)/*reentrant*/
{
XBYTE[T6963_DataPortOfYieJin] = data1;
}
/*写入一个命令*/
//判断S1S0状态,指令代码写入指令通道
void T6963_writeACom(UNCHAR command) /*reentrant*/
{
T6963_judge(ComAndData); /*循环读取STATUS直至等于ComAndData(03h)*/
XBYTE[T6963_CtrOfYieJin] = command;
T6963_judge(ComAndData); /*循环读取STATUS直至等于ComAndData(03h)*/
XBYTE[T6963_CtrOfYieJin]=0x00;
}
/*设置显示模式cgrom&ram,或、异或等*/
//无参数,调用WriteACom,
//因此要判断S1S0状态,指令代码写入指令通道
void T6963_setDisplayMode(UNCHAR displaymod)
{
T6963_writeACom(displaymod);
}
/*设置显示开关*/
//无参数,调用WriteACom,
//因此要判断S1S0状态,指令代码写入指令通?
void T6963_setDisplayOn(UNCHAR on)/*reentrant*/
{
T6963_writeACom(on);
}
/*清除文本区*/
void T6963_clearText()
{
UNCHAR address;
UNINT i;
/* <2005.5.24旧的代码>
取出当前的文本区首址
address=XBYTE[CurrentTextPoint+1];
judge(ComAndData);
writeAData(address);
address=XBYTE[CurrentTextPoint];
judge(ComAndData);
writeAData(address);
writeACom(SetAddressInVRam);
*/
/*暂时关闭显示*/
// T6963_setDisplayOn(CloseAll);//CloseAll=0x90,关闭一切显示
/*取出当前的文本区首址*/
address = (UNCHAR) CurrentTextPoint;
T6963_judge(ComAndData);
//写入参数1,指针低字节
T6963_writeAData(address);
address = CurrentTextPoint / 256;
T6963_judge(ComAndData);
//写入参数2,指针高字节
T6963_writeAData(address);
/*地址指针设置*/
T6963_writeACom(SetAddressInVRam);//SetAddressInVRam=0x24
/*设置自动写*/
T6963_writeACom(AutoWrite);
for (i = 0; i < 0x13e0; i++)
{
T6963_judge(jAutoWrite);//0x08 判断STA3(数据自动写状态)
T6963_writeAData(0x23);
}
/*关闭自动写*/
T6963_writeACom(EndAuto);//0xb2,自动读写结束
/*开启显示*/
T6963_setDisplayOn(TextMode | GraphMode | CurFlash | CurOn);
}
/*清除图形区*/
void T6963_clearGraph()
{
UNCHAR address;
UNINT i;
/*暂时关闭显示*/
T6963_setDisplayOn(GraphMode);//CloseAll);
/*取出当前的图形区首地址*/
address = (UNCHAR) CurrentGraphPoint;
T6963_judge(ComAndData);
T6963_writeAData(address);
address = (CurrentGraphPoint / 256);
T6963_judge(ComAndData);
T6963_writeAData(address);
T6963_writeACom(SetAddressInVRam); //0x24 地址指针设置
/*设置自动写*/
T6963_writeACom(AutoWrite);
for (i = 0; i < 0x0fe0;i++)//0x0400; i++) //0x0f00
{
T6963_judge(jAutoWrite);//0x08 判断STA3(数据自动写状态)
T6963_writeAData(0x00);
}
/*关闭自动写*/
T6963_writeACom(EndAuto);//0xb2,自动读写结束
/*开启显示*/
T6963_setDisplayOn(TextMode | GraphMode | CurFlash | CurOn | CloseAll);//即0x9F,启用所有显示
}
/*设置文本首地址*/
void T6963_setTextHead(UNINT address)
{
UNCHAR temp;
/*低8位*/
temp = (UNCHAR) (address & 0x00ff);
T6963_judge(ComAndData);
T6963_writeAData(temp);
/*高8位*/
temp = (UNCHAR) ((address & 0xff00) >> 8);
T6963_judge(ComAndData);
T6963_writeAData(temp);
/*设置命令*/
T6963_writeACom(SetTextHeadAddress);//0x40 文本区首址
/*设置当前的指针*/
CurrentPoint = address;
}
/*设置文本的宽度*/
void T6963_setTextWidth(UNCHAR width)
{
T6963_judge(ComAndData);
T6963_writeAData(width); //写入参数D1,字节数
T6963_judge(ComAndData);
T6963_writeAData(0); //写入参数D2,0x00
T6963_writeACom(SetTextWidth); //0x41 文本区的宽度
}
/*设置图形的首址*/
void T6963_setGraphHead(UNINT address)
{
UNCHAR temp;
/*低8位*/
T6963_judge(ComAndData);
temp = (UNCHAR) (address & 0x00ff);/*取整型数低8位*/
T6963_writeAData(temp);
/*高8位*/
T6963_judge(ComAndData);
temp = (UNCHAR) ((address & 0xff00) >> 8);
T6963_writeAData(temp);
T6963_writeACom(SetGraphHead); //0x42 图形区首址
CurrentPoint = address;
}
/*设置图形的宽度*/
void T6963_setGraphWidth(UNCHAR width)
{
T6963_judge(ComAndData);
T6963_writeAData(width); //写入参数D1,字节数
T6963_judge(ComAndData);
T6963_writeAData(0); //写入参数D2,0x00
T6963_writeACom(SetGraphWidth); //0x43 图形区的宽度
}
/*设置光标,mode 是宽度*/
void T6963_setCuro(UNCHAR mode)
{
UNCHAR mod;
mod = (CurMode | (mode & 0x0f));//CurMode=0xa0光标形状8点(列)*N行,N值0-7H
T6963_writeACom(mod);
}
/*选择三屏缓冲区之一*/
void T6963_selectDisplay(UNINT textAdd, UNINT graphAdd)/*参数可简化*/
{
/*保存要显示的区*/
/*<2005.5.24旧的代码>
*((UNINT xdata*)CurrentTextPoint)=textAdd;
*((UNINT xdata*)CurrentGraphPoint)=graphAdd;
*/
CurrentTextPoint = textAdd;
CurrentGraphPoint = graphAdd;
/*设置文本的手地址*/
T6963_setTextHead(textAdd); //设置文本首地址
T6963_setGraphHead(graphAdd); //设置图形的首址
/*设置文本的宽度*/
T6963_setTextWidth(30); //setTextWidth(30);
T6963_setGraphWidth(30);
}
/*设置显存的当前显示地址*/
void T6963_setCurrentPoint(UNINT address)/*reentrant*/
{
UNCHAR temp;
//低字节
temp = (UNCHAR) (address & 0x00ff);
T6963_judge(ComAndData);
T6963_writeAData(temp);
//高字节
temp = (UNCHAR) ((address & 0xff00) >> 8);
T6963_judge(ComAndData);
T6963_writeAData(temp);
T6963_writeACom(SetAddressInVRam); // 0x24 地址指针设置
CurrentPoint = address;
}
/*在文本区定位坐标为x,y的位置*/
//??????????????????????????????????????????????????
void T6963_gotoxy(UNCHAR x, UNCHAR y)/*reentrant*/
{
UNINT off; /*偏移量*/
/*<2005.5.24旧的代码>
off=*((UNINT xdata *)CurrentTextPoint);
*/
off = CurrentTextPoint;
/*如果用XWORD[CurrentTextPoint]注意2倍关系;*/
off += y * 30;//16; //y*30,是因为128*64,其中的128=16*8,还是左右四位
off += x;
T6963_setCurrentPoint(off);//设置显存的当前显示地址
}
/*显示一个8x8字符*/
void T6963_putChar8(UNCHAR ch, bit flag)/*reentrant*/
{
UNCHAR temp;
/*为避开显示嵌套,定时器0中断*/
temp = ch - 0x20;
T6963_judge(ComAndData);
if (flag)
ch = ~ch;
T6963_writeAData(temp);
T6963_writeACom(WriteAdd1); /*数据写,地址加1*/
CurrentPoint++; /*跟踪当前vram位置*/
//setCurrentPoint(CurrentPoint); /*应该可以去掉这行*/
}
/*图形区定位x,y的缓存位置*/
void T6963_moveto(UNCHAR x, UNCHAR y)
{
UNINT off;
/*<2005.5.24旧的代码
off=*((UNINT xdata *)CurrentGraphPoint);
>*/
off = CurrentGraphPoint;
off += y * 30;//16; //y*30
off += x;
T6963_setCurrentPoint(off);
}
/*显示一个汉字,ch为编号 flag为1时,反显*/
void T6963_putChar16(UNCHAR ch, bit flag)
{
UNINT offInHZK;
UNCHAR i = 0;
/*计算汉字在汉字库的位置*/
offInHZK = (ch - 1) * 32;
offInHZK = offInHZK + 0x02000;//0d000
//注意起始地址与 字库.ASM的起始地址CSEG AT 0d000h 要求一致
while (i < 16)
{
ch = CBYTE[offInHZK++];
T6963_judge(ComAndData);
if (flag)
ch = ~ch;
T6963_writeAData(ch);
T6963_writeACom(WriteAdd1);
/*同行下一点*/
ch = CBYTE[offInHZK++];
T6963_judge(ComAndData);
if (flag)
ch = ~ch;
T6963_writeAData(ch);
T6963_writeACom(WriteAdd1);
/*下一行*/
CurrentPoint +=30;// 16; //30
T6963_setCurrentPoint(CurrentPoint);
i++;
}
CurrentPoint -= 16 *30;// 16; //30
CurrentPoint += 2;
T6963_setCurrentPoint(CurrentPoint);
}
/*显示一个8x12的字符,ch为编号*/
void T6963_putChar12(UNCHAR ch, bit flag)
{
UNINT offInHZK;
UNCHAR i = 0;
/*计算12×8字符在字库的位置*/
offInHZK = (ch - 0x20) * 16;
offInHZK = offInHZK + 0x4000;
while (i < 16)
{
ch = CBYTE[offInHZK++];
T6963_judge(ComAndData);
if (flag)
ch = ~ch;
T6963_writeAData(ch);
T6963_writeACom(WriteAdd1);
/*下一行*/
CurrentPoint += 30;// 16; //30
T6963_setCurrentPoint(CurrentPoint);
i++;
}
CurrentPoint -= 16 * 30;// 16; //30
CurrentPoint++;
T6963_setCurrentPoint(CurrentPoint);
}
/*设置光标的位置*/
void T6963_setCurPoint(UNCHAR x, UNCHAR y)
{
T6963_judge(ComAndData);
T6963_writeAData(x);
T6963_judge(ComAndData);
T6963_writeAData(y);
T6963_writeACom(SetCurPoint);
}
/* PUTCHAR.C: This routine is the general character output of C-51. */
void putchar(unsigned char ch)
{
UNCHAR temp;
UNINT offInHZK, start_xy;
switch (CharType & 0x07)
{
case 1:
/* 显示8x16的字符*/
/*计算在汉字库的位置*/
offInHZK = (ch - 0x20) * 16;
offInHZK = offInHZK + 0x4000;
temp = 0;
while (temp < 16)
{
ch = CBYTE[offInHZK];
offInHZK++;
T6963_judge(jData);
if ((CharType & 0x80) == 0x80)
ch = ~ch;
T6963_writeAData(ch);
T6963_writeACom(WriteAdd1);
/*下一行*/
CurrentPoint += 30;// 16; //30;
T6963_setCurrentPoint(CurrentPoint);
temp++;
}
CurrentPoint -= 16 * 30;// 16; //30
CurrentPoint++;
T6963_setCurrentPoint(CurrentPoint);
break;
case 2:
/*显示16x16的汉字*/
/*计算汉字在汉字库的位子*/
offInHZK = (ch - 1) * 32;
offInHZK = offInHZK + 0x2000;
temp = 0;
while (temp < 16)
{
ch = CBYTE[offInHZK];
offInHZK++;
T6963_judge(jData);
if ((CharType & 0x80) == 0x80)
ch = ~ch;
T6963_writeAData(ch);
T6963_writeACom(WriteAdd1);
/*下一走标点*/
ch = CBYTE[offInHZK];
offInHZK++;
T6963_judge(jData);
if ((CharType & 0x80) == 0x80)
ch = ~ch;
T6963_writeAData(ch);
T6963_writeACom(WriteAdd1);
/*下一行*/
CurrentPoint += 30;// 16; //30;
T6963_setCurrentPoint(CurrentPoint);
temp++;
}
CurrentPoint -= 16 *30;// 16; //30
CurrentPoint += 2;
T6963_setCurrentPoint(CurrentPoint);
break;
case 0:
/*显示8x8的字符*/
temp = ch - 0x20;
T6963_judge(jData);
if ((CharType & 0x80) == 0x80)
ch = ~ch;
T6963_writeAData(temp);
T6963_writeACom(WriteAdd1);
CurrentPoint++;
T6963_setCurrentPoint(CurrentPoint);
break;
case 3:
//显示12*24点阵ASCII码
start_xy = CurrentPoint;
offInHZK = (ch - 0x20) * 48;
for (temp = 0; temp < 24; temp++)
{
T6963_judge(jData);
T6963_writeAData(chardot[offInHZK++]);
T6963_writeACom(WriteAdd1);
T6963_judge(jData);
T6963_writeAData(chardot[offInHZK++]);
T6963_writeACom(WriteAdd1);
CurrentPoint += 30;// 16;---------
T6963_setCurrentPoint(CurrentPoint);
}
CurrentPoint = start_xy + 2;
T6963_setCurrentPoint(CurrentPoint);
break;
case 4:
//2005-05-30早上16*12汉字
/*计算汉字在汉字库的位子*/
offInHZK = (ch - 1) * 32;
offInHZK = offInHZK + 0x3000;
temp = 0;
while (temp < 12)
{
ch = CBYTE[offInHZK];
offInHZK++;
T6963_judge(jData);
if ((CharType & 0x80) == 0x80)
ch = ~ch;
T6963_writeAData(ch);
T6963_writeACom(WriteAdd1);
/*下一走标点*/
ch = CBYTE[offInHZK];
offInHZK++;
T6963_judge(jData);
if ((CharType & 0x80) == 0x80)
ch = ~ch;
T6963_writeAData(ch);
T6963_writeACom(WriteAdd1);
/*下一行*/
CurrentPoint += 30;// 16; //30;
T6963_setCurrentPoint(CurrentPoint);
temp++;
}
CurrentPoint -= 12*30;// 16; //30
CurrentPoint += 2;
T6963_setCurrentPoint(CurrentPoint);
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -