?? showfun.c
字號:
return 0; // 返回0成功
}
uchar fnPR2(void) // 讀數據
{
if(fnST01() == 0)
return 1;
return LCMDW;
}
void fnSetPos(uchar urow, uchar ucol) //設置當前地址
{
uint iPos;
iPos = urow * 20 + ucol;
fnPR1(LC_ADD_POS,iPos & 0xFF,iPos / 256);
gCurRow = urow;
gCurCol = ucol;
}
void cursor(uchar uRow, uchar uCol) //設置當前顯示行、列
{
fnSetPos(uRow * 16, uCol);
}
void at(unsigned char x,unsigned char y)/*設定文本x,y值*/
{
uint iPos; //地址
iPos = x + y* 20;
fnPR1(LC_ADD_POS,iPos&0xff,iPos/256);
tCurRow = x;
tCurCol = y;
}
// 清屏
void cls(void)
{
uint i;
fnPR1(LC_ADD_POS,0x00,0x00); // 置地址指針
fnPR12(LC_AUT_WR); // 自動寫
for(i=0;i<0x2000;i++)
{
fnST3();
fnPR13(0x00); // 寫數據
}
fnPR12(LC_AUT_OVR); // 自動寫結束
fnPR1(LC_ADD_POS,0x00,0x00); // 重置地址指針
gCurRow = 0; // 置地址指針存儲變量
gCurCol = 0;
}
// LCM 初始化
char fnLCMInit(void)
{
reset=0;
reset=1;
fnPR1(LC_TXT_STP,0x00,0x00); // 文本顯示區首地址
fnPR1(LC_TXT_WID,0x14,0x00); // 文本顯示區寬度
fnPR1(LC_GRH_STP,0x00,0x00); // 圖形顯示區首地址
fnPR1(LC_GRH_WID,0x14,0x00); // 圖形顯示區寬度
fnPR11(LC_CGR_POS,CGRAMSTART >> 11);
fnPR12(LC_CUR_SHP | 0x01); // 光標形狀
fnPR12(LC_MOD_OR); // 顯示方式設置
fnPR12(LC_DIS_SW |0x08);
grhome = GRSTART;
txthome = TXTSTART;
return 0;
}
void charout(uchar *str)
{
uchar ch,len,i,uRow,uCol ;
len=strlen(str);
i=0;
uRow = tCurRow;
uCol = tCurRow;
at(uCol,uRow);
while(i<len)
{
ch=str[i]-0x20;
fnPR11(LC_INC_WR,ch);
i++;
}
}
// ASCII及漢字顯示函數
uchar dprintf(uchar x,uchar y,char *fmt)
{
char c1,c2,cData;
uchar i=0,j,uLen;
uchar k;
uLen=strlen(fmt);
while(i<uLen)
{
c1 = fmt[i];
c2 = fmt[i+1];
fnSetPos(y,x/8);
if(c1 >= 0)
{
// ASCII
if(c1 < 0x20)
{
switch(c1)
{
case CR:
case LF: // 回車或換行
i++;
x=0;
if(y < 112)y+=HZ_CHR_HEIGHT;
continue;
case BS: // 退格
i++;
if(y>ASC_CHR_WIDTH)y-=ASC_CHR_WIDTH;
cData = 0x00;
break;
}
}
for(j=0;j<ASC_CHR_HEIGHT;j++)
{
if(c1 >= 0x1f)
{
cData= ASC_MSK[(c1-0x1f)*ASC_CHR_HEIGHT+j];
fnSetPos(y+j,x/8);
if((x%8)==0)
{
fnPR12(LC_AUT_WR); // 寫數據
fnPR13(cData);
fnPR12(LC_AUT_OVR);
}
else
OutToLCD(cData,x,y+j);
}
fnSetPos(y+j,x/8);
}
if(c1 != BS) // 非退格
x+=ASC_CHR_WIDTH;
}
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<HZ_CHR_HEIGHT;k++)
{
fnSetPos(y+k,x/8);
if(j < sizeof(GB_16)/sizeof(GB_16[0]))
{
c1=GB_16[j].Msk[k*2];
c2=GB_16[j].Msk[k*2+1];
}
else
c1=c2=0;
if((x%8)==0)
{
fnPR12(LC_AUT_WR);
fnPR13(c1);
fnPR12(LC_AUT_OVR);
}
else
OutToLCD(c1,x,y+k);
if(((x+2+HZ_CHR_WIDTH/2)%8)==0)
{
fnPR12(LC_AUT_WR);
fnPR13(c2);
fnPR12(LC_AUT_OVR);
}
else
OutToLCD(c2,x+2+HZ_CHR_WIDTH/2,y+k);
}
x+=HZ_CHR_WIDTH;
i++;
}
i++;
}
return uLen;
}
void OutToLCD(uchar Dat,uchar x,uchar y)
{
uchar uData1,uData2,ux,a,b;
a=8-(x%8);b=x%8;
fnSetPos(y,x/8);
fnPR12(LC_AUT_RD); // 讀數據
uData1=fnPR2();
uData2=fnPR2();
fnPR12(LC_AUT_OVR);
fnSetPos(y,x/8);
uData1&=~MSK1[a];
ux=Dat&MSK2[a];
ux>>=b;
uData1=uData1|ux;
ux=~MSK2[b];
uData2&=ux;
ux=MSK1[b];
ux=Dat&ux;
ux<<=a;
uData2=uData2|ux;
fnPR12(LC_AUT_WR); // 寫數據
fnPR13(uData1);
fnPR13(uData2);
fnPR12(LC_AUT_OVR);
}
void SetShowMode(uchar newShowModeSW) //設置為顯示模式
{
ShowModeSW=newShowModeSW;
fnPR12(LC_DIS_SW | newShowModeSW);
}
/**********************************
//= 函數原型: Pixel(unsigned char PointX,unsigned char PointY, bit Mode)
//= 功 能: 在指定坐標位置顯示一個點
//= 參 數: 坐標,顯示點或清除點
//= 返 回 值:
//= 函數性質:私有函數
//= 如果顯示屏超過了256*256,請修改這個函數 PointX,PointY的類型
//= Mode 1:顯示 0:清除該點
**********************************/
void Pixel(unsigned char PointX,unsigned char PointY, bit Mode)
{
unsigned char StartAddr;
unsigned char dat;
StartAddr=7-(PointX%8);
dat=LC_BIT_OP|StartAddr; //生產位操作命令畫點的數據
if(Mode) dat=dat|0x08;
fnSetPos(PointY,PointX/8);
fnPR12(LC_BIT_OP|dat); // 寫數據
}
/**********************************
//= 函數原型: void line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode)
//= 功 能: 劃線函數
//= 參 數: 坐標1,坐標2,顯示點或清除點
//= 返 回 值:
//= 函數性質:私有函數
//= 其它:顯示點陣不超過255*255
/**********************************/
void line( unsigned char x1,unsigned char y1, unsigned char x2,unsigned char y2, bit Mode)
{
unsigned char x,y;
float k,b;
if( abs(y1-y2) <= abs(x1-x2) ) // |k|<=1
{
k=((float)y2-y1) / ((float)x2-x1) ;
b=y1-k*x1;
if( x1 <= x2 )
{
for(x=x1;x<=x2;x++)
{
y=(uchar)(k*x+b);
Pixel(x, y, Mode);
}
}
else
{
for(x=x2;x<=x1;x++)
{
y=(uchar)(k*x+b);
Pixel(x, y, Mode);
}
}
}
else // abs(y1-y2) > abs(x1-x2) |K|>1
{
k=((float)x2-x1) / ((float)y2-y1) ;
b=x1-k*y1;
if( y1 <= y2 )
{
for(y=y1;y<=y2;y++)
{
x=(uchar)(k*y+b);
Pixel( x , y,Mode );
}
}
else
{
for(y=y2;y<=y1;y++)
{
x=(uchar)(k*y+b);
Pixel( x , y,Mode );
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -