📄 hzbuffer.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 + -