?? lcd_fun.c
字號:
#include "Global.h"
#include "LCD_LTM024.h"
#include "LCD_ASCII.h"
uint16 SearchHZ(uint16 hzaddr)//找出漢字地址
{
uint16 i;
for(i=0; i<0xff; i++)
{
if((HzToGB[i*2] == (hzaddr>>8)) && (HzToGB[i*2+1] == (uint8)hzaddr))
break;
}
return i*32;
}
int PrintCHZ(uint8 xs, uint16 ys, uint16 chzaddr, uint8 fb)//寫一個字符或漢字
{
int i;
int j,k;
uint8 x;
uint16 y;
uint16 Temp[129];
unsigned char data;
x = xs;
y = ys;
if(chzaddr>0xA0)
{
if(x+16 > glcd_XMAX)
return -1;
chzaddr = SearchHZ(chzaddr);
for(i=0; i<2; i++)
{
y = ys;
LCD_SetRec(x+i*8, y, 7, 15);//設置窗口大小
LCD_WrReg(0x0F);//Read
for(j=0; j<129; j++)
{
Temp[j] = LCD_RdData16();//Read 16-bit Data
}
for(j=0; j<128; j++)
{
Temp[j] &= 0xff00;
Temp[j] |= Temp[j+1]&0x00ff;
}
LCD_SetRec(x+i*8, y, 7, 15);//設置窗口大小
LCD_WrReg(0x0E);//Write
for(j=0; j<16; j++)
{
if(fb)
{
data = GB[chzaddr+i+j*2];
}
else
{
data=~GB[chzaddr+i+j*2];
}
for(k=0; k<8; k++,data <<= 1)
{
if(data&0x80)
{
LCD_WrData16(~Temp[k+j*8]);//Write 16-bit data
}
else
{
LCD_WrData16(Temp[k+j*8]);//Write 16-bit data
}
}
y++;
if(y>glcd_YMAX)
{
return -1;
}
}
}
}
else
{
if(x+8 > glcd_XMAX)
return -1;
chzaddr = (chzaddr-' ')*16;
// LCD_RdData16();
// LCD_RdData8();
LCD_SetRec(x, y, 7, 15);//設置窗口大小
LCD_WrReg(0x0F);//Read
for(i=0; i<128; i++)
{
Temp[i] = LCD_RdData16();//Read 16-bit Data
}
for(j=0; j<128; j++)
{
Temp[j] &= 0xff00;
Temp[j] |= Temp[j+1]&0x00ff;
}
LCD_SetRec(x, y, 7, 15);//設置窗口大小
LCD_WrReg(0x0E);//Write
for(j=0; j<16; j++)
{
if(fb)
{
data = nAsciiDot[chzaddr+j];
}
else
{
data = ~nAsciiDot[chzaddr+j];
}
for(k=0; k<8; k++,data <<= 1)
{
if(data&0x80)
{
LCD_WrData16(~Temp[k+j*8]);//Write 16-bit data
}
else
{
LCD_WrData16(Temp[k+j*8]);//Write 16-bit data
}
}
y++;
if(y>glcd_YMAX)
{
return -1;
}
}
}
return 0;
}
int PrintCHZ2(uint8 xs, uint16 ys, uint16 chzaddr, uint8 fb)//寫一個字符或漢字
{
uint16 i,l,m;
uint16 j,k;
uint8 x;
uint16 y;
uint16 Temp[8*CHARACTER+1];
unsigned char data;
x = xs*CHARACTER/2;
y = ys;
if(chzaddr>0xA0)
{
if(x+CHARACTER > glcd_XMAX)
return -1;
chzaddr = SearchHZ(chzaddr);
for(i=0; i<2; i++)
{
y = ys;
LCD_SetRec(x+i*CHARACTER/2, y, CHARACTER/2-1, CHARACTER-1);//設置窗口大小
LCD_WrReg(0x0F);//Read
for(j=0; j<8*CHARACTER+1; j++)
{
Temp[j] = LCD_RdData16();//Read 16-bit Data
}
for(j=0; j<8*CHARACTER; j++)
{
Temp[j] &= 0xff00;
Temp[j] |= Temp[j+1]&0x00ff;
}
LCD_SetRec(x+i*CHARACTER/2, y, CHARACTER/2-1, CHARACTER-1);//設置窗口大小
LCD_WrReg(0x0E);//Write
for(j=0; j<16; j++)
{
for(m=0; m<CHARACTER/16; m++)//y^^
{
if(fb)
{
data = GB[chzaddr+i+j*2];
}
else
{
data=~GB[chzaddr+i+j*2];
}
for(k=0; k<8; k++,data <<= 1)
{
for(l=0;l<CHARACTER/16;l++)//x^^
{
if(data&0x80)
{
LCD_WrData16(~Temp[k+j*8]);//Write 16-bit data
}
else
{
LCD_WrData16(Temp[k+j*8]);//Write 16-bit data
}
}
}
y++;
if(y>glcd_YMAX)
{
return -1;
}
}
}
}
}
else
{
if(x+CHARACTER/2 > glcd_XMAX)
return -1;
chzaddr = (chzaddr-' ')*16;
LCD_SetRec(x, y, CHARACTER/2-1, CHARACTER-1);//設置窗口大小
LCD_WrReg(0x0F);//Read
for(j=0; j<8*CHARACTER+1; j++)
{
Temp[j] = LCD_RdData16();//Read 16-bit Data
}
for(j=0; j<8*CHARACTER; j++)
{
Temp[j] &= 0xff00;
Temp[j] |= Temp[j+1]&0x00ff;
}
LCD_SetRec(x, y, CHARACTER/2-1, CHARACTER-1);//設置窗口大小
LCD_WrReg(0x0E);//Write
for(j=0; j<16; j++)
{
for(m=0; m<CHARACTER/16; m++)//y^^
{
if(fb)
{
data = nAsciiDot[chzaddr+j];
}
else
{
data=~nAsciiDot[chzaddr+j];
}
for(k=0; k<8; k++,data <<= 1)
{
for(l=0;l<CHARACTER/16;l++)//x^^
{
if(data&0x80)
{
LCD_WrData16(~Temp[k+j*8]);//Write 16-bit data
}
else
{
LCD_WrData16(Temp[k+j*8]);//Write 16-bit data
}
}
}
y++;
if(y>glcd_YMAX)
{
return -1;
}
}
}
}
return 0;
}
/*
void DrawIcon(uint8 xs, uint8 ys, uint8 fb, unsigned char const *icon)//畫圖標
{
uint8 i;
uint8 j;
uint16 addr;
for(j=0; j<16; j++)
{
addr = glcd_G_BASE + ys*30 + xs;
glcd_set_address(addr);
glcd_cput(0xB0); //自動寫模式
for(i=0; i<2; i++)
{
if(fb)
{
glcd_dput(*icon++);
}
else
{
glcd_dput(~(*icon++));
}
}
glcd_cput(0xB2);
ys++;
if(ys>glcd_YMAX)
{
return;
}
}
}
*/
uint16 StrLen(uint8 * str)//找字符串長度
{
uint16 i;
for(i=0; (*str)!='\0'; i++)
{
str++;
if(i>1000)
return 0;
}
return i;
}
int LCD_Printf(uint8 xs, uint16 ys, int fb, uint8 Total, uint8 *str)//顯示字符,漢字串
{
uint16 i;
uint8 x;
uint16 y;
uint8 hzl;
uint8 hzh;
uint16 hz;
x = xs;
y = ys;
for(i=0; i<Total; i++)
{
if(*str >= 0xA0)
{
hzh = *(str++);
if(*str >= 0xA0)//是漢字
{
if((x+2) > (xs+Total))
{
PrintCHZ(x, y, ' ', fb);//顯示空白
break;
}
if((x+2) > glcd_XMAX/8)//此處高修改過原本是(>=),可能使最右邊顯示半個字或者影響右對齊
{
y += 16;
if(y > glcd_YMAX) //寫出界
break;
x = glcd_XMIN;
}
hzl = *(str++);
hz = hzh;
hz <<= 8;
hz |= hzl;
PrintCHZ(x, y, hz, fb);
x += 2;
i ++;
}
else
{
i ++;
}
}
else//是字符
{
if(x > (glcd_XMAX/8)-1)//滿一行
{
y += 16;
x = glcd_XMIN;
if(y > glcd_YMAX) //寫出界
break;
}
PrintCHZ(x, y, *(str++), fb);//顯示字符
x += 1;
}
}
return i;
}
int Printfc(uint8 xs, uint16 ys, int fb, uint8 LBytes, uint8 Mode, uint8 *str)//格式輸出
{
uint16 Total;//總字符數
uint16 Bytes;
uint16 LLine;//最后一行字符數
uint16 i;
uint16 k;
uint16 x;
uint16 y;
if(xs > glcd_XMAX/8)//超出范圍
return -1;
Total = StrLen(str);
Bytes = 0;
x = xs;
y = ys;
if((xs+LBytes) > glcd_XMAX/8)
{
LBytes = glcd_XMAX/8 - xs;
}
for(; (Total-Bytes) >= LBytes;)
{
Bytes += LCD_Printf(x, y, fb, LBytes, &str[Bytes]);
y += 16;
if(y > (glcd_YMAX-16))
{
x += LBytes+1; //Next Page
y = ys;
if(x > glcd_XMAX/8) //出界
return -1;
}
}
LLine = Total - Bytes;//最后一行個數
switch(Mode)
{
case CCENTER:
{
i = (LBytes-LLine)/2;//中間
for(k=0; k<i && LLine!=0; k++)
{
PrintCHZ(x+k, y, ' ', fb);//顯示空白
}
for(k=0; k<(LBytes-LLine-i) && LLine!=0; k++)
{
PrintCHZ(x+LLine+i+k, y, ' ', fb);//顯示空白
}
}
break;
case CLEFT:
{
i = 0;//左對齊
for(k=0; k<(LBytes-LLine) && LLine!=0; k++)
{
PrintCHZ(x+LLine+k, y, ' ', fb);//顯示空白
}
}
break;
case CRIGHT:
{
i = (LBytes-LLine);//右對齊
for(k=0; k<i && LLine!=0; k++)
{
PrintCHZ(x+k, y, ' ', fb);//顯示空白
}
}
break;
default :
{
i = 0;//左對齊
for(k=0; k<(LBytes-LLine); k++)
{
PrintCHZ(x+LLine+k, y, ' ', fb);//顯示空白
}
}
break;
}
LCD_Printf(x + i, y, fb, LLine, &str[Bytes]);
// PrintDen(16,5,Bytes);///////////////
return 0;
}
int PrintDen(int xs, int ys, uint32 den)//顯示十進制數,返回數據位數
{
uint16 i;
uint16 Begin = 0;
uint32 j = 100000000;
char Den[10] = {0,0,0,0,0,0,0,0,0,0};
if(den == 0)
Begin = 9;
for(i=0; i<9; i++)
{
Den[i] = den / j;
den -= Den[i]*j;
j /= 10;
if(Den[i] != 0 && Begin == 0)
{
Begin = i+1;
}
Den[i] += '0';
}
LCD_Printf(xs, ys, FB_OFF, 10-Begin, (uint8 *)&Den[Begin-1]);//顯示字符,漢字串
return 10-Begin;
}
uint8 B4ToChar(uint8 B4)//四位二進制數轉字十六進制字符
{
uint8 Char;
if(B4>9)
{
Char = 'A'+(B4-10);
}
else
{
Char = '0'+B4;
}
return Char;
}
int PrintHex(uint8 xs, uint16 ys, uint32 hex)//顯示十六進制數,返回數據位數
{
uint16 i;
uint16 Begin = 0;
uint32 j = 0xF0000000;
char Hex[9] = {0,0,0,0,0,0,0,0,0};
if(hex == 0)
Begin = 8;
for(i=0; i<8; i++)
{
Hex[i] = (hex & j)>>(4*(7-i));
j >>= 4;
if(Hex[i] != 0 && Begin == 0)
{
Begin = i+1;
}
Hex[i] = B4ToChar(Hex[i]);
}
LCD_Printf(xs, ys, FB_OFF, 9-Begin, (uint8 *)&Hex[Begin-1]);//顯示字符,漢字串
return 9-Begin;
}
int PrintFlo(int xs, int ys, uint32 den, uint32 mut, uint16 wei)// 寫入浮點數據
{
const uint32 QUAN[]={
1,10,100,1000,10000,100000,1000000,10000000};//權
uint16 Total = 0;
uint32 dot = 0;
uint8 i,j=0;
dot = (den%mut)*(QUAN[wei]/mut);
den /= mut;
Total += PrintDen(xs, ys, den);
PrintCHZ(xs + Total, ys, '.', FB_OFF);//寫一個字符或漢字
for(j=wei; QUAN[j-1]>dot && j>1; j--)
{
}
for(i=0; i<(wei-j); i++)
PrintCHZ(xs + Total +1+i, ys, '0', FB_OFF);//寫一個字符或漢字
PrintDen(xs + Total +1+i, ys, dot);
return Total+wei+1;
}
//畫、清點函數
//column為水平點數,row為垂直點數
//show=1畫點,show=0清點
void glcd_pixel(uint8 x, uint16 y, char show)//畫、清點函數
{
uint16 dot;
LCD_SetRec(x, y, 0, 0);//設置窗口大小
LCD_WrReg(0x0F);//Read
dot = LCD_RdData16();//Read 16-bit Data
LCD_SetRec(x, y, 0, 0);//設置窗口大小
LCD_WrReg(0x0E);//Write
if(show)
LCD_WrData16(~dot);
else
LCD_WrData16(dot);
}
void glcd_line(int x1, int y1, int x2, int y2, unsigned char show)//畫一條x1,y1到x2,y2的直線
{
int dy ;
int dx ;
int stepx, stepy, fraction;
dy = y2 - y1;
dx = x2 - x1;
if (dy < 0)
{
dy = -dy;
stepy = -1;
}
else
{
stepy = 1;
}
if (dx < 0)
{
dx = -dx;
stepx = -1;
}
else
{
stepx = 1;
}
dy <<= 1;
dx <<= 1;
glcd_pixel(x1,y1,show);
if (dx > dy)
{
fraction = dy - (dx >> 1);
while (x1 != x2)
{
if (fraction >= 0)
{
y1 += stepy;
fraction -= dx;
}
x1 += stepx;
fraction += dy;
glcd_pixel(x1,y1,show);
}
}
else
{
fraction = dx - (dy >> 1);
while (y1 != y2)
{
if (fraction >= 0)
{
x1 += stepx;
fraction -= dy;
}
y1 += stepy;
fraction += dx;
glcd_pixel(x1,y1,show);
}
}
}
void LCD_PrintFlash(uint8 xs, uint16 ys, uint8 x_dot, uint16 y_dot, const uint8 *pStr)//畫圖
{
uint8 i;
uint16 j;
LCD_SetRec(xs, ys, x_dot, y_dot); //設置窗口大小
LCD_WrReg(0x0E); //Write
for(j=0; j<y_dot; j++)
for(i=0; i<x_dot; i++)
{
LCD_WrData8(*(pStr++));
LCD_WrData8(*(pStr++));
}
}
void axison(uchar xorien,uchar yorien )
{
uchar x=0;
uint y=0;
glcd_line(0,yorien,239-7,yorien,1);
glcd_line(xorien,0,xorien,319-7,1);
for(x=0,y=0;x<7&&y<7;x++,y++)
{
glcd_line(239-x,yorien-y,239-x,yorien+y,1); //plot arrow
}
for(x=0,y=0;x<7&&y<7;x++,y++)
{
glcd_line(xorien-x,319-y,xorien+x,319-y,1); //plot arrow
}
for(x=xorien+10;x<240-10;x+=10) //畫刻度
{
glcd_pixel(x,yorien-1,1);
glcd_pixel(x,yorien+1,1);
}
for(x=10;x<xorien;x+=10)
{
glcd_pixel(xorien-x,yorien-1,1);
glcd_pixel(xorien-x,yorien+1,1);
}
for(y=yorien+10;y<320-10;y+=10)
{
glcd_pixel(xorien-1,y,1);
glcd_pixel(xorien+1,y,1);
}
for(y=10;y<yorien;y+=10)
{
glcd_pixel(xorien-1,yorien-y,1);
glcd_pixel(xorien+1,yorien-y,1);
}
for(x=1;x<(239-xorien)/10;x+=2)
{
PrintCHZ(xorien-6+x*10,yorien-16,'0'+x/10,FB_OFF);
PrintCHZ(xorien-6+x*10+8,yorien-16,'0'+x%10,FB_OFF);
}
// for(x=2;x<10;x+=2)
//{
// PrintCHZ(xorien-10-x*10,yorien-16,'-',FB_OFF);
//PrintCHZ(xorien-6+x*10+8,yorien-16,'0'+x/10,FB_OFF);
// PrintCHZ(xorien-10-x*10+8,yorien-16,'0'+x,FB_OFF);
// }
for(y=1;y<(319-yorien)/10;y+=2)
{
PrintCHZ(xorien-16,yorien-6+y*10,'0'+y/10,FB_OFF);
PrintCHZ(xorien-8,yorien-6+y*10,'0'+y%10,FB_OFF);
}
for(y=2;y<10;y+=2)
{
PrintCHZ(xorien-16,yorien-10-y*10,'-',FB_OFF);
PrintCHZ(xorien-16+8,yorien-10-y*10,'0'+y,FB_OFF);
}
//LCD_WrReg(0x0E);
//LCD_SetRec(xorien,yorien, 239-xorien,319-yorien);
//LCD_WrCmd8(0x01,0x0F);//寫入清屏
//DelayMs(10000);
//LCD_WrReg(0x0E);
//for(y=0;y<13200;y++)
// LCD_WrData16(RED);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -