?? t6963_yejin.c
字號:
T6963_Yejin.C
#i nclude "T6963_YeJin12864.h"
extern unsigned char code chardot[];
// UNINT CurrentTextPoint /*應(yīng)定義成全程變量方式,
/* 絕對定位形式可以考慮*/
/*當前的圖形顯示口地址*/
// UNINT CurrentGraphPoint /*同上*/
UNCHAR data CharType;
UNINT CurrentPoint;/*當前顯存的指針*/
/*讀取液晶的狀態(tài)*/
//要求片選LCDCE=0,CD=1
UNCHAR T6963_readStauteOfYieJin()/*reentrant*/
{
return XBYTE[T6963_CtrOfYieJin];
}
/*判斷指令讀寫狀態(tài)和數(shù)據(jù)讀寫狀態(tài)*/
void T6963_judge(UNCHAR mode)/*reentrant*/
{
UNCHAR temp = 0;
while (temp != mode)
{
temp = T6963_readStauteOfYieJin();
temp = temp & mode;
}
}
/*寫入一個數(shù)據(jù)或命令參數(shù)*/
//要求片選LCDCE=0,CD=0
void T6963_writeAData(UNCHAR data1)/*reentrant*/
{
XBYTE[T6963_DataPortOfYieJin] = data1;
}
/*寫入一個命令*/
//判斷S1S0狀態(tài),指令代碼寫入指令通道
void T6963_writeACom(UNCHAR command) /*reentrant*/
{
T6963_judge(ComAndData); /*循環(huán)讀取STATUS直至等于ComAndData(03h)*/
XBYTE[T6963_CtrOfYieJin] = command;
T6963_judge(ComAndData); /*循環(huán)讀取STATUS直至等于ComAndData(03h)*/
XBYTE[T6963_CtrOfYieJin]=0x00;
}
/*設(shè)置顯示模式cgrom&ram,或、異或等*/
//無參數(shù),調(diào)用WriteACom,
//因此要判斷S1S0狀態(tài),指令代碼寫入指令通道
void T6963_setDisplayMode(UNCHAR displaymod)
{
T6963_writeACom(displaymod);
}
/*設(shè)置顯示開關(guān)*/
//無參數(shù),調(diào)用WriteACom,
//因此要判斷S1S0狀態(tài),指令代碼寫入指令通?
void T6963_setDisplayOn(UNCHAR on)/*reentrant*/
{
T6963_writeACom(on);
}
/*清除文本區(qū)*/
void T6963_clearText()
{
UNCHAR address;
UNINT i;
/* <2005.5.24舊的代碼>
取出當前的文本區(qū)首址
address=XBYTE[CurrentTextPoint+1];
judge(ComAndData);
writeAData(address);
address=XBYTE[CurrentTextPoint];
judge(ComAndData);
writeAData(address);
writeACom(SetAddressInVRam);
*/
/*暫時關(guān)閉顯示*/
// T6963_setDisplayOn(CloseAll);//CloseAll=0x90,關(guān)閉一切顯示
/*取出當前的文本區(qū)首址*/
address = (UNCHAR) CurrentTextPoint;
T6963_judge(ComAndData);
//寫入?yún)?shù)1,指針低字節(jié)
T6963_writeAData(address);
address = CurrentTextPoint / 256;
T6963_judge(ComAndData);
//寫入?yún)?shù)2,指針高字節(jié)
T6963_writeAData(address);
/*地址指針設(shè)置*/
T6963_writeACom(SetAddressInVRam);//SetAddressInVRam=0x24
/*設(shè)置自動寫*/
T6963_writeACom(AutoWrite);
for (i = 0; i < 0x13e0; i++)
{
T6963_judge(jAutoWrite);//0x08 判斷STA3(數(shù)據(jù)自動寫狀態(tài))
T6963_writeAData(0x23);
}
/*關(guān)閉自動寫*/
T6963_writeACom(EndAuto);//0xb2,自動讀寫結(jié)束
/*開啟顯示*/
T6963_setDisplayOn(TextMode | GraphMode | CurFlash | CurOn);
}
/*清除圖形區(qū)*/
void T6963_clearGraph()
{
UNCHAR address;
UNINT i;
/*暫時關(guān)閉顯示*/
T6963_setDisplayOn(GraphMode);//CloseAll);
/*取出當前的圖形區(qū)首地址*/
address = (UNCHAR) CurrentGraphPoint;
T6963_judge(ComAndData);
T6963_writeAData(address);
address = (CurrentGraphPoint / 256);
T6963_judge(ComAndData);
T6963_writeAData(address);
T6963_writeACom(SetAddressInVRam); //0x24 地址指針設(shè)置
/*設(shè)置自動寫*/
T6963_writeACom(AutoWrite);
for (i = 0; i < 0x0fe0;i++)//0x0400; i++) //0x0f00
{
T6963_judge(jAutoWrite);//0x08 判斷STA3(數(shù)據(jù)自動寫狀態(tài))
T6963_writeAData(0x00);
}
/*關(guān)閉自動寫*/
T6963_writeACom(EndAuto);//0xb2,自動讀寫結(jié)束
/*開啟顯示*/
T6963_setDisplayOn(TextMode | GraphMode | CurFlash | CurOn | CloseAll);//即0x9F,啟用所有顯示
}
/*設(shè)置文本首地址*/
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);
/*設(shè)置命令*/
T6963_writeACom(SetTextHeadAddress);//0x40 文本區(qū)首址
/*設(shè)置當前的指針*/
CurrentPoint = address;
}
/*設(shè)置文本的寬度*/
void T6963_setTextWidth(UNCHAR width)
{
T6963_judge(ComAndData);
T6963_writeAData(width); //寫入?yún)?shù)D1,字節(jié)數(shù)
T6963_judge(ComAndData);
T6963_writeAData(0); //寫入?yún)?shù)D2,0x00
T6963_writeACom(SetTextWidth); //0x41 文本區(qū)的寬度
}
/*設(shè)置圖形的首址*/
void T6963_setGraphHead(UNINT address)
{
UNCHAR temp;
/*低8位*/
T6963_judge(ComAndData);
temp = (UNCHAR) (address & 0x00ff);/*取整型數(shù)低8位*/
T6963_writeAData(temp);
/*高8位*/
T6963_judge(ComAndData);
temp = (UNCHAR) ((address & 0xff00) >> 8);
T6963_writeAData(temp);
T6963_writeACom(SetGraphHead); //0x42 圖形區(qū)首址
CurrentPoint = address;
}
/*設(shè)置圖形的寬度*/
void T6963_setGraphWidth(UNCHAR width)
{
T6963_judge(ComAndData);
T6963_writeAData(width); //寫入?yún)?shù)D1,字節(jié)數(shù)
T6963_judge(ComAndData);
T6963_writeAData(0); //寫入?yún)?shù)D2,0x00
T6963_writeACom(SetGraphWidth); //0x43 圖形區(qū)的寬度
}
/*設(shè)置光標,mode 是寬度*/
void T6963_setCuro(UNCHAR mode)
{
UNCHAR mod;
mod = (CurMode | (mode & 0x0f));//CurMode=0xa0光標形狀8點(列)*N行,N值0-7H
T6963_writeACom(mod);
}
/*選擇三屏緩沖區(qū)之一*/
void T6963_selectDisplay(UNINT textAdd, UNINT graphAdd)/*參數(shù)可簡化*/
{
/*保存要顯示的區(qū)*/
/*<2005.5.24舊的代碼>
*((UNINT xdata*)CurrentTextPoint)=textAdd;
*((UNINT xdata*)CurrentGraphPoint)=graphAdd;
*/
CurrentTextPoint = textAdd;
CurrentGraphPoint = graphAdd;
/*設(shè)置文本的手地址*/
T6963_setTextHead(textAdd); //設(shè)置文本首地址
T6963_setGraphHead(graphAdd); //設(shè)置圖形的首址
/*設(shè)置文本的寬度*/
T6963_setTextWidth(30); //setTextWidth(30);
T6963_setGraphWidth(30);
}
/*設(shè)置顯存的當前顯示地址*/
void T6963_setCurrentPoint(UNINT address)/*reentrant*/
{
UNCHAR temp;
//低字節(jié)
temp = (UNCHAR) (address & 0x00ff);
T6963_judge(ComAndData);
T6963_writeAData(temp);
//高字節(jié)
temp = (UNCHAR) ((address & 0xff00) >> 8);
T6963_judge(ComAndData);
T6963_writeAData(temp);
T6963_writeACom(SetAddressInVRam); // 0x24 地址指針設(shè)置
CurrentPoint = address;
}
/*在文本區(qū)定位坐標為x,y的位置*/
//??????????????????????????????????????????????????
void T6963_gotoxy(UNCHAR x, UNCHAR y)/*reentrant*/
{
UNINT off; /*偏移量*/
/*<2005.5.24舊的代碼>
off=*((UNINT xdata *)CurrentTextPoint);
*/
off = CurrentTextPoint;
/*如果用XWORD[CurrentTextPoint]注意2倍關(guān)系;*/
off += y * 30;//16; //y*30,是因為128*64,其中的128=16*8,還是左右四位
off += x;
T6963_setCurrentPoint(off);//設(shè)置顯存的當前顯示地址
}
/*顯示一個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); /*數(shù)據(jù)寫,地址加1*/
CurrentPoint++; /*跟蹤當前vram位置*/
//setCurrentPoint(CurrentPoint); /*應(yīng)該可以去掉這行*/
}
/*圖形區(qū)定位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);
}
/*設(shè)置光標的位置*/
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;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -