lcd-Display_font.c

来源:互联网 发布:东德歧视中国人知乎 编辑:程序博客网 时间:2024/06/05 00:21
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>


extern const unsigned char fontdata_8x16[];
int fd_fb;
int fd_hzk16;
struct stat hzk_stat;
unsigned char *fbmem_star;
unsigned char *hzk_memmap;


int screen_size;
unsigned char *fbmem_start;
unsigned int line_width;
unsigned int pixel_width;
struct fb_var_screeninfo var;
struct fb_fix_screeninfo fix;
//**********本程序的编码是gb2312编码,颜色是rgb888//


/*****************************************
lcd_show_point
功能:显示16*8字符
fbmem_start:缓冲区起始地址
x:显示起始横坐标
y:显示起始纵坐标
color: 颜色点
*********************************************///
void lcd_show_point(unsigned char *fbmem_start,int x,int y,
unsigned int color)
{
unsigned char *bpp8;
unsigned short *bpp16;
unsigned int *bpp32;
unsigned int red,green,blue;


bpp8=fbmem_start+y*line_width+x*pixel_width;
bpp16=(unsigned short *)bpp8;
bpp32=(unsigned int *)bpp8;
switch(var.bits_per_pixel)
{
case 8:
{
*bpp8=color;
break;
}
case 16:
{
red=(color>>16)&0xff;
green=(color>>8)&0xff;
blue=(color>>0)&0xff;
*bpp16=((red>>3)<<11 | (green>>2)<<5 |(blue>>3)<<0);
break;

}
case 32:
{
*bpp32 =color;
break;
}
default :
{
printf("err %d dbpp val\n",var.bits_per_pixel);
break;
}
}
}
void lcd_show_ascii(unsigned char*fbmem_star,int x,int y,unsigned char c,
unsigned int forecolor, unsigned int backcolor)
{
unsigned char *dots=(unsigned char *)&fontdata_8x16[c*16];
int i,b;
unsigned char byte;


for(i=0;i<16;i++)
{
byte=dots[i];
for(b=7;b>=0;b--)
{
if(byte &(1<<b))
{
lcd_show_point(fbmem_star,x+7-b,y+i,forecolor);
}
else
{
lcd_show_point(fbmem_star,x+7-b,y+i,backcolor);
}
}
}

}
int  main(int argc, char **argv)
{
unsigned char str[]="hai";
unsigned char *str2="jia";
unsigned char *str3="LL";


fd_fb=open("/dev/fb0",O_RDWR);


if(fd_fb<0)
{
printf("can't open /dev/fb0\n");
return -1;
}


/**/
if(ioctl(fd_fb, FBIOGET_VSCREENINFO, &var))
{
printf("can't get var\n");
return -1;
}


/****************/
if(ioctl(fd_fb, FBIOGET_FSCREENINFO, &var))
{
printf("can't get fix\n");
return -1;
}
printf("bpp:%d\n",var.bits_per_pixel);


/*****/
line_width=var.xres*var.bits_per_pixel/8;


/***/
pixel_width=var.bits_per_pixel/8;


/***/
screen_size=var.xres*var.yres*var.bits_per_pixel/8;


/***/
fbmem_star=(unsigned char *)mmap(NULL, screen_size,
PROT_READ | PROT_WRITE ,MAP_SHARED,fd_fb,0);


if(fbmem_star==(unsigned char*)-1)
{
printf("can't mmap\n");
return -1;
}


/******/
fd_hzk16=open("HZK16", O_RDONLY);;
if(fd_hzk16<0)
{
printf("can't open HZK16\n");
return -1;
}


/****/
if(fstat(fd_hzk16,&hzk_stat))
{
printf("can't get fstat\n");
return -1;
}


/*******/
hzk_memmap=(unsigned char *)mmap(NULL ,hzk_stat.st_size,
PROT_READ,MAP_SHARED,fd_hzk16,0);


if(hzk_memmap==(unsigned char *)-1)
{
printf("can't mmap for hzk16\n");
return -1;
}
/*****/
memset(fbmem_start,0x00,screen_size);




lcd_show_ascii(fbmem_star,var.xres/2,var.yres/2,'A',0xffff,0x0000);
if(argc>1)
{


}
return 0;
}

0 0
原创粉丝点击