⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 UC/OS-II代码
💻 C
字号:
//****************************************************************************************
//** 文件名:Lcd.c

//** Copyright (c) 2004  杭州期待电子嵌入式开发部
//** 创建人: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 + -