?? lcd.c
字號:
//****************************************************************************************
//** 文件名:Lcd.c
//** Copyright (c) 2004 杭州期待電子嵌入式開發(fā)部
//** 創(chuàng)建人:Tony ZHAO
//** 日期:2004.03.15
//** 描述:Lcd driver and graphics functions
//**
//** 版本:1.0
//**************************************************************************************
#include "lcd.h"
#include "../../target/2410addr.h"
#include "../../target/def.h"
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#define MVAL (13)
#define MVAL_USED (0)
#define M5D(n) ((n) & 0x1fffff) // To get lower 21bits
//Timing parameter for V16C6448AB(PRIME VIEW)
#define VBPD ((33-1)&0xff)
#define VFPD ((10-1)&0xff)
#define VSPW ((2-1) &0x3f)
#define HBPD ((48-1)&0x7f)
#define HFPD ((16-1)&0xff)
#define HSPW ((96-1)&0xff)
#define CLKVAL_TFT (6)
#define LCDFRAMEBUFFER 0x33800000 //_NONCACHE_STARTADDRESS
U32 (*aLcdBuffer)[SCR_XSIZE_TFT/2];
#define LCD_PutPixel(x,y,c)\
if(x<SCR_XSIZE_TFT && y<SCR_YSIZE_TFT) \
aLcdBuffer[(y)][(x)/2]=( aLcdBuffer[(y)][(x)/2] \
& ~(0xffff0000>>((x)%2)*16) ) | ( ((c)&0x0000ffff)<<((2-1-((x)%2))*16) );
extern INT8U g_auc_HZK_Dot[];
extern INT8U g_auc_ASCII_Dot[];
void Lcd_Init (void)
{
rGPCUP=0xffffffff; // Disable Pull-up register
rGPCCON=0xaaaaaaaa; //Initialize VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND
rGPDUP=0xffffffff; // Disable Pull-up register
rGPDCON=0xaaaaaaaa; //Initialize VD[23:8]
rGPGCON &= ~(3 << 8); /* Set LCD_PWREN as output */
rGPGCON |= (1 << 8);
rGPGDAT |= (1 << 4); /* Backlight ON */
aLcdBuffer=(U32 (*)[SCR_XSIZE_TFT/2])LCDFRAMEBUFFER;
rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;
// TFT LCD panel,16bpp TFT,ENVID=off
rLCDCON2=(VBPD<<24)|(LINEVAL_TFT<<14)|(VFPD<<6)|(VSPW);
rLCDCON3=(HBPD<<19)|(HOZVAL_TFT<<8)|(HFPD);
rLCDCON4=(MVAL<<8)|(HSPW);
rLCDCON5=(1<<11)|(1<<9)|(1<<8); //FRM5:6:5,HSYNC and VSYNC are inverted
rLCDSADDR1=(((U32)aLcdBuffer>>22)<<21)|M5D((U32)aLcdBuffer>>1);
rLCDSADDR2=M5D( ((U32)aLcdBuffer+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1 );
rLCDSADDR3=(((SCR_XSIZE_TFT-LCD_XSIZE_TFT)/1)<<11)|(LCD_XSIZE_TFT/1);
rLCDINTMSK|=(3); // MASK LCD Sub Interrupt
rLPCSEL&=(~7); // Disable LPC3600
rTPAL=0; // Disable Temp Palette
rLCDCON1 |= 1;
Lcd_Clr(BLACK);
}
void Lcd_Clr(INT16U c)
{
INT16U i,j;
for(j=0;j<SCR_YSIZE_TFT;j++)
for(i=0;i<SCR_XSIZE_TFT;i++)
LCD_PutPixel(i,j,c);
}
void Lcd_Draw_Line (INT16 usX0, INT16 usY0, INT16 usX1, INT16 usY1, INT16U usColor, INT16U usWidth)
{
INT16 usDx;
INT16 usDy;
INT16 y_sign;
INT16 x_sign;
INT16 decision;
INT16 wCurx, wCury, wNextx, wNexty, wpy, wpx;
if (usY0 == usY1)
{
Lcd_Draw_HLine (usX0, usX1, usY0, usColor, usWidth);
return;
}
if (usX0 == usX1)
{
Lcd_Draw_VLine (usY0, usY1, usX0, usColor, usWidth);
return;
}
usDx = abs(usX0 - usX1);
usDy = abs(usY0 - usY1);
if (((usDx >= usDy && (usX0 > usX1)) ||
((usDy > usDx) && (usY0 > usY1))))
{
GUISWAP(usX1, usX0);
GUISWAP(usY1, usY0);
}
y_sign = (usY1 - usY0) / usDy;
x_sign = (usX1 - usX0) / usDx;
if (usDx >= usDy)
{
for (wCurx = usX0, wCury = usY0, wNextx = usX1,
wNexty = usY1, decision = (usDx >> 1);
wCurx <= wNextx; wCurx++, wNextx--, decision += usDy)
{
if (decision >= usDx)
{
decision -= usDx;
wCury += y_sign;
wNexty -= y_sign;
}
for (wpy = wCury - usWidth / 2;
wpy <= wCury + usWidth / 2; wpy++)
{
LCD_PutPixel(wCurx, wpy, usColor);
}
for (wpy = wNexty - usWidth / 2;
wpy <= wNexty + usWidth / 2; wpy++)
{
LCD_PutPixel(wNextx, wpy, usColor);
}
}
}
else
{
for (wCurx = usX0, wCury = usY0, wNextx = usX1,
wNexty = usY1, decision = (usDy >> 1);
wCury <= wNexty; wCury++, wNexty--, decision += usDx)
{
if (decision >= usDy)
{
decision -= usDy;
wCurx += x_sign;
wNextx -= x_sign;
}
for (wpx = wCurx - usWidth / 2;
wpx <= wCurx + usWidth / 2; wpx++)
{
LCD_PutPixel(wpx, wCury, usColor);
}
for (wpx = wNextx - usWidth / 2;
wpx <= wNextx + usWidth / 2; wpx++)
{
LCD_PutPixel(wpx, wNexty, usColor);
}
}
}
}
void Lcd_Draw_HLine (INT16 usX0, INT16 usX1, INT16 usY0, INT16U usColor, INT16U usWidth)
{
INT16 usLen;
if (usX1 < usX0)
{
GUISWAP (usX1, usX0);
}
while(usWidth-- > 0)
{
usLen = usX1 - usX0 + 1;
while(usLen-- > 0)
{
LCD_PutPixel(usX0 + usLen, usY0, usColor);
}
usY0++;
}
}
void Lcd_Draw_VLine (INT16 usY0, INT16 usY1, INT16 usX0, INT16U usColor, INT16U usWidth)
{
INT16 usLen;
if (usY1 < usY0)
{
GUISWAP (usY1, usY0);
}
while(usWidth-- > 0)
{
usLen = usY1 - usY0 + 1;
while(usLen-- > 0)
{
LCD_PutPixel(usX0, usY0 + usLen, usColor);
}
usX0++;
}
}
void Lcd_DrawRect (INT16 usLeft, INT16 usTop, INT16 usRight, INT16 usBottom, INT16U ucColor)
{
Lcd_Draw_HLine (usLeft, usRight, usTop, ucColor, 1);
Lcd_Draw_HLine (usLeft, usRight, usBottom, ucColor, 1);
Lcd_Draw_VLine (usTop, usBottom, usLeft, ucColor, 1);
Lcd_Draw_VLine (usTop, usBottom, usRight, ucColor, 1);
}
void Lcd_FillRect(INT16U usX0, INT16U usY0, INT16U usX1, INT16U usY1, INT16U ucColor)
{
INT16U i;
INT16U j;
if (usX0 > usX1)
{
GUISWAP(usX0, usX1);
GUISWAP(usY0, usY1);
}
for (i = usX0; i <= usX1; i++)
{
if (usY0 <= usY1)
{
for (j = usY0; j <= usY1; j++)
{
LCD_PutPixel(i, j, ucColor);
}
}
else
{
for (j = usY0; j >= usY1; j--)
{
LCD_PutPixel(i, j, ucColor);
}
}
}
}
INT16U Lcd_GetPixel (INT16U x, INT16U y)
{
return ((aLcdBuffer[(y)][(x)/2] >> ((1 - (x % 2)) * 16)) & 0xff);
}
void LcdDispHz16 (INT16U x0, INT16U y0, INT16U ForeColor, INT8U *s)
{
INT16 i,j,k,x,y,xx;
INT8U qm,wm;
INT32U ulOffset;
INT8 hzbuf[32],temp[2];
if(((INT8U)(*s)) < 161)
{
temp[0] = *(s+i);
temp[1] = '\0';
return;
}
else
{
qm = *(s) - 161;
wm = *(s + 1) - 161;
ulOffset = (INT32U)(qm * 94 + wm) * 32;
for (j = 0; j < 32; j ++)
{
hzbuf[j] = g_auc_HZK_Dot[ulOffset + j];
}
for(y = 0; y < 16; y++)
{
for(x = 0; x < 16; x++)
{
k = x % 8;
if (hzbuf[y * 2 + x / 8] & (0x80 >> k))
{
xx = x0 + x;
LCD_PutPixel( xx, y + y0, (INT16U)ForeColor);
}
}
}
}
}
void LcdDisp8X16 (INT16U x0, INT16U y0, INT16U ForeColor, INT8U *s)
{
INT16 i,j,k,x,y,xx;
INT8U qm;
INT32U ulOffset;
INT8 ywbuf[16],temp[2];
if((INT8U)*(s) >= 161)
{
temp[0] = *(s + i);
temp[1] = '\0';
return;
}
else
{
qm = *s;
ulOffset = (INT32U)(qm) * 16; //Here to be changed tomorrow
for (j = 0; j < 16; j ++)
{
ywbuf[j] = g_auc_ASCII_Dot[ulOffset + j];
}
for(y = 0; y < 16; y++)
{
for(x = 0; x < 8; x++)
{
k = x % 8;
if (ywbuf[y] & (0x80 >> k))
{
xx = x0 + x;
LCD_PutPixel( xx, y + y0, (INT16U)ForeColor);
}
}
}
}
}
void Lcd_Printf(INT16U x, INT16U y, INT16U c, INT8U *fmt,...)
{
va_list ap;
char string[256];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
Lcd_Disp(x, y, c,string);
va_end(ap);
}
void Lcd_Disp(INT16U usX, INT16U usY, INT16U usForeColor, INT8U *pucStr)
{
INT16U i = 0;
//INT8U ucLen;
while (*pucStr != 0)
{
if (*pucStr >= 161)
{
if ((usX + i * 8) >= LCD_XSIZE_TFT - 16 ||(usY >= LCD_YSIZE_TFT))
{
break;
}
LcdDispHz16(usX + i * 8, usY, usForeColor, pucStr);
i += 2;
pucStr += 2;
}
else
{
if ((usX + i * 8) >= LCD_XSIZE_TFT - 8 ||(usY >= LCD_YSIZE_TFT))
{
break;
}
LcdDisp8X16(usX + i * 8, usY, usForeColor, pucStr);
i ++;
pucStr ++;
}
}
}
void ShowCanBanner()
{
Lcd_Printf(0, 0, WHITE, "(1)Start Can1 Send");
Lcd_Printf(0, 30, WHITE, "(2)Stop Can1 Send");
Lcd_Printf(0, 60, WHITE, "(3)Start Can2 Send");
Lcd_Printf(0, 90, WHITE, "(4)Stop Can2 Send");
}
void ShowCan1Start()
{
Lcd_FillRect(0,120,200,150,BLUE);
Lcd_Printf(0, 120, WHITE, "Can1 is Sending");
}
void ShowCan1Stop()
{
Lcd_FillRect(0,120,200,150,BLUE);
Lcd_Printf(0, 120, WHITE, "Can1 stop Send");
}
void ShowCan2Start()
{
Lcd_FillRect(0,150,200,180,BLUE);
Lcd_Printf(0, 150, WHITE, "Can2 is Sending");
}
void ShowCan2Stop()
{
Lcd_FillRect(0,150,200,180,BLUE);
Lcd_Printf(0, 150, WHITE, "Can2 stop Send");
}
void ShowChar(INT8U ch)
{
int ix=0;
static int count=0;
static INT8U display[16];
if(ch=='\n')
{
Lcd_FillRect(0,290,200,330,BLUE);
count=0;
}
else if(count>10)
return;
else
{
display[count++]=ch;
Lcd_FillRect(0,290,200,330,BLUE);
for(ix=0;ix<count;ix++)
Lcd_Printf(0+ix*16, 300, WHITE, "%c",display[ix]);
}
}
void ShowTitle()
{
Lcd_Draw_Line(0,270,200,270,WHITE,2);
Lcd_Printf(0,240,WHITE, "Please Input char");
Lcd_Draw_Line(0,330,200,330,WHITE,2);
}
void OnChange(INT32U x,INT32U y)
{
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -