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

📄 hzbuffer.c~

📁 基于arm2410的一个简单的液晶屏驱动
💻 C~
字号:
#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <fcntl.h>#include <linux/fb.h>#include <sys/types.h>#include <sys/stat.h>#include <string.h>#include <sys/mman.h>#include "font_8x16.h"#define FB_DEV "/dev/fb0"int fb_open(char *fb_device);int fb_close(int fd);void *fb_mmap(int fd,unsigned int screensize);int fb_munmap(void *start,size_t length);int fb_16pixel(unsigned char *fbmem,int width,int height,int x,int y,unsigned short color);void char_display(char *buf,unsigned char *fbmem,unsigned int width,unsigned int height);int init_file(void);int get_bit (unsigned char a, int bit);int fd1;void *address;int init_file (void){	fd1 = open ("hzk16.bin", O_RDWR);	if (fd1 < 0)	{		perror ("open() error");		return -1;	}	address = mmap (NULL, 256 * 1024, PROT_READ, MAP_SHARED, fd1, 0);	if (address == MAP_FAILED)	{		perror ("munmap() error=");	}}int close_file (void){	if (munmap (address, 256 * 1024) < 0)	{		perror ("munmap() error");	}	close (fd1);}void get_buf (unsigned char *hanzi, char *buf){	unsigned long offset = ((hanzi[0] - 0xA1) * 94 + (hanzi[1] - 0xA1)) * 32L;	memcpy (buf, address + offset, 32);}int main(int argc,char *argv[]){	int fbdev;	char *fb_device;	char buf[32];	unsigned char *fbmem;	unsigned int screensize;	unsigned int fb_width;	unsigned int fb_height;	unsigned int fb_depth;	unsigned int x;	unsigned int y;	init_file();	get_buf ("间", buf);	if((fb_device = getenv("FRAMEBUFFER")) == NULL)	{		fb_device = FB_DEV;	}else printf("%s",fb_device);	fbdev = fb_open(fb_device);	fb_width = 1024;	fb_height = 768;	fb_depth = 16;	screensize = fb_width * fb_height *(fb_depth / 8);	fbmem = fb_mmap(fbdev,screensize);	/*	   fb_16pixel(fbmem,fb_width,fb_height,512,384,0xF100);	   fb_16pixel(fbmem,fb_width,fb_height,511,384,0xF100);	   fb_16pixel(fbmem,fb_width,fb_height,511,383,0xF100);	   fb_16pixel(fbmem,fb_width,fb_height,512,383,0xF100);	   */	char_display(buf,fbmem,fb_width,fb_height);	fb_munmap(fbmem,screensize);	fb_close(fbdev);	return (0);}int get_bit (unsigned char a, int bit){	return (a & (1 << bit));}void char_display(char *buf,unsigned char *fbmem,unsigned int width,unsigned int height){	int i,j;	unsigned char list;	char a1;	char a2;	for (i = 0; i < 32; i += 2)	{		a1 = buf[i];		a2 = buf[i + 1];		for (j = 7; j >= 0; j--)		{			if (get_bit (a1, j))				fb_16pixel(fbmem,width,height,512 + 7 - j ,384 + i/2, 0xF100);		}		for(j = 7; j >= 0; j--)		{			if (get_bit (a2, j))				fb_16pixel(fbmem,width,height,512 + 15 -j ,384 + i/2, 0xF100);		}		close_file();		/*		   for(n =0;n<32;n+=2)		   if(n%2 == 0)		   {		   for(i = 0;i < 16;i++,n++)		   {		   list = buf[n];		   for(j = 0;j < 8;j++)		   {		   if(list & 1 << (8 - j)){		   fb_16pixel(fbmem,width,height,512 + 2 * j,384 + 2 * i, 0xF100);		//	fb_16pixel(fbmem,width,height,512 + 2 * j + 1,384 + 2 * i, 0xF100);		//	fb_16pixel(fbmem,width,height,512 + 2 * j,384 + 2 * i + 1, 0xF100);		//	fb_16pixel(fbmem,width,height,512 + 2 * j + 1,384 + 2 * i + 1, 0xF100);		}		}		}		}else{		for(i = 0;i < 16;i++,n++)		{		list = buf[n];		for(j = 0;j < 8;j++)		{		if(list & 1 << (8 - j)){		fb_16pixel(fbmem,width,height,512 + 8 + 2 * i,384 + 8 + 2 * j, 0xF100);		}		}		}		}*/	}}int fb_open(char *fb_device){	int fd;	if((fd = open(fb_device,O_RDWR)) < 0)	{		perror(__func__);		return (-1);	}	return (fd);}void *fb_mmap(int fd,unsigned int screensize){	void*  fbmem;	if((fbmem = mmap(0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0)) == MAP_FAILED)	{		perror(__func__);		return (void *)(-1);	}	return (fbmem);}int fb_munmap(void *start,size_t length){	return (munmap(start,length));}int fb_close(int fd){	return (close(fd));}int fb_16pixel(unsigned char *fbmem, int width,int height,int x,int y,unsigned short color){	if((x > width)||(y > height))		return (-1);	unsigned short *dst = ((unsigned short *)fbmem + y * width + x);	*dst = color;	return (0);}

⌨️ 快捷键说明

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