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

📄 lcd.c

📁 在移植有linux的开发板上实现LCD驱动后
💻 C
字号:
#include <fcntl.h>
#include <asm/page.h>
#include <sys/mman.h>
#include "test-lcd.h"
const UCHAR g_ucAscii8x16[]=						/* ascii table */	
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xce,0xde,0xf6,0xe6,0xc6,
0xc6,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x38,0x78,0x18,
0x18,0x18,0x18,0x18,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,
0xc6,0x06,0x0c,0x18,0x30,0x60,0xc6,0xfe,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x7c,0xc6,0x06,0x06,0x3c,0x06,0x06,0xc6,0x7c,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x0c,0x1c,0x3c,0x6c,0xcc,0xfe,0x0c,0x0c,
0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xc0,0xc0,0xc0,0xfc,
0x06,0x06,0xc6,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x60,
0xc0,0xc0,0xfc,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xfe,0xc6,0x06,0x0c,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x7c,0xc6,0xc6,0xc6,0x7c,0xc6,0xc6,0xc6,0x7c,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xc6,0xc6,0x7e,0x06,
0x06,0x0c,0x78,0x00,0x00,0x00,0x00
};
int fb_open(PFBDEV pFbdev)
{
	pFbdev->fb = open(pFbdev->dev, O_RDWR);
	if(pFbdev->fb < 0)
	{
		printf("Error opening %s: %m. Check kernel config\n", pFbdev->dev);
		return FALSE;
	}
	if (-1 == ioctl(pFbdev->fb,FBIOGET_VSCREENINFO,&(pFbdev->fb_var)))
	{
		printf("ioctl FBIOGET_VSCREENINFO\n");
		return FALSE;
	}
	if (-1 == ioctl(pFbdev->fb,FBIOGET_FSCREENINFO,&(pFbdev->fb_fix)))
	{
		printf("ioctl FBIOGET_FSCREENINFO\n");
		return FALSE;
	}
	
	//map physics address to virtual address
	pFbdev->fb_mem_offset = (UINT32T)(pFbdev->fb_fix.smem_start) & (~PAGE_MASK);
	pFbdev->fb_mem = (UINT32T *)mmap(0, pFbdev->fb_fix.smem_len + pFbdev->fb_mem_offset,
		PROT_READ | PROT_WRITE, MAP_SHARED, pFbdev->fb, 0);
	//fbp=pFbdev->fb_mem+pFbdev->fb_mem_offset;//????
	if(-1L ==(long)pFbdev->fb_mem) 
	{
		printf("mmap error! mem:%d offset:%d\n", pFbdev->fb_mem, pFbdev->fb_mem_offset);
		return FALSE;
	}
	
	return TRUE;
}

//close frame buffer
int fb_close(PFBDEV pFbdev)
{
	close(pFbdev->fb);
	pFbdev->fb=-1;
}

//get display depth
int get_display_depth(PFBDEV pFbdev)
{
	if(pFbdev->fb<=0)
	{
		printf("fb device not open, open it first\n");
		return FALSE;
	}
	return pFbdev->fb_var.bits_per_pixel;
}

void Lcd_DspAscII8X16(USHORT x0, USHORT y0, UCHAR ForeColor, UCHAR * s,FBDEV fbdev)
{
	INT16T i,j,k,x,y,xx;
	UCHAR qm;
	INT32T ulOffset;
	INT8T ywbuf[16],temp[2];
    
	for(i = 0; i < strlen((const char*)s); i++)
	{
		if((UINT8T)*(s+i) >= 161)
		{
			temp[0] = *(s + i);
			temp[1] = '\0';
			return;
		}
		else
		{
			qm = *(s+i);
			ulOffset = (INT32T)(qm+1) * 16;
			if(ulOffset==752)
				ulOffset=0;
			else
				ulOffset-=768;
			for (j = 0; j < 16; j ++)
            {
				ywbuf[j] = g_ucAscii8x16[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 + i*8;
			       		//PutPixel( xx, y + y0, (UINT8T)ForeColor);
						fb_memset((void *)fbdev.fb_mem + fbdev.fb_mem_offset+(y0+y)*320+xx,ForeColor, 1);
			       	}
			   	}
            }
        }
	}
}
void PutPixel(USHORT x0, USHORT y0, UCHAR ForeColor,FBDEV fbdev)
{
	memset((void *)fbdev.fb_mem + fbdev.fb_mem_offset+y0*SCR_XSIZE_CSTN+x0, ForeColor, 1);
}
void displaySpace(USHORT x0, USHORT y0,FBDEV fbdev,UCHAR Color)
{
	int i,j;
	for(i=0;i<16;i++)
	{
		for(j=0;j<8;j++)
		{
			PutPixel(x0+j,y0+i,Color,fbdev);
		}
	}
}
//full screen clear
void fb_memset (void *addr, int c, size_t len)
{
    memset(addr, c, len);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -