免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2530 | 回复: 0
打印 上一主题 下一主题

[应用] 有关于电子书代码的问题,求大神帮助!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-10 13:38 |只看该作者 |倒序浏览
10可用积分
求大神帮我把这个代码弄成可以翻上一页或者可以显示中文
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <unistd.h>
  5. #include <fcntl.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <linux/fb.h>
  9. #include <sys/mman.h>
  10. #include <sys/time.h>
  11. #include <sys/wait.h>
  12. #include <sys/ipc.h>
  13. #include "font_8x16.h"

  14. #define Width                320                        //LCD屏的宽度
  15. #define Heigth                240                        //LCD屏的高度
  16. #define Start_x         8                        //屏-左上角的起始坐标  x   y
  17. #define Start_y                8
  18. #define End_x                (Width - 8)        //屏-左上角的起始坐标  x   y
  19. #define End_y                (Heigth        - 8)       
  20.        
  21. int fk;                                                         //按键的文件描述符
  22. char button_status[6];
  23. int fp=0;                                                        //LCD屏的文件描述符
  24. struct fb_var_screeninfo vinfo;         //LCD可变参数结构体
  25. struct fb_fix_screeninfo finfo;                //LCD固定参数结构体
  26. char *fbp = 0;
  27. long screensize=0;                                        //初始化屏幕大小为0
  28. int s_x = 0, s_y = 0,id = 0;                     //屏幕的x y 坐标




  29. //清屏
  30. void clear_screen()
  31. {
  32.     memset(fbp, 0xf8, screensize);
  33. }

  34. //绘制单个字符
  35. void Draw_8X16(int x, int y, const unsigned char ch[])
  36. {
  37.     int i = 0, j = 0;
  38.     unsigned char mask, buffer;
  39.     long location_tt;
  40.     location_tt = x * vinfo.bits_per_pixel / 8 + y *finfo.line_length;

  41.     for (i = 0; i < 16; i++)
  42.     {
  43.         mask = 0x80;
  44.                 buffer = ch[i];
  45.                 location_tt +=  finfo.line_length;
  46.         for (j = 0; j < 8; j ++)
  47.         {
  48.             if ((buffer & mask)) {
  49.                                 *(fbp +location_tt + j * vinfo.bits_per_pixel / 8) = 0;
  50.                                 *(fbp +location_tt + j * vinfo.bits_per_pixel / 8 + 1) = 0;
  51.                          }
  52.                          mask = mask >> 1;
  53.         }
  54.     }
  55.         s_x += 8;
  56. }

  57. //绘制单个汉字    16 * 16
  58. void Draw_16X16(int x, int y, const unsigned char ch[])
  59. {
  60.     int i = 0, j = 0;
  61.     unsigned char mask, buffer;
  62.     long location_tt;
  63.     location_tt = x * vinfo.bits_per_pixel / 8 + y * finfo.line_length;

  64.     for (i = 0; i < 16; i++)
  65.         {
  66.                 mask = 0x80;
  67.                 buffer = ch[i * 2];
  68.                 location_tt +=  finfo.line_length;
  69.                 for (j = 0; j < 8; j++) {
  70.                         if ((buffer & mask)) {
  71.                                 *(fbp +location_tt + j * vinfo.bits_per_pixel / 8) = 0;
  72.                                 *(fbp +location_tt + j * vinfo.bits_per_pixel / 8 + 1) = 0;
  73.                          }
  74.                          mask = mask >> 1;
  75.                  }

  76.                 mask = 0x80;
  77.                 buffer = ch[i * 2 + 1];
  78.                 for (j = 0; j < 8; j++)
  79.                 {
  80.                         if ((buffer & mask))
  81.                         {
  82.                                 *(fbp +location_tt + (8 + j) * vinfo.bits_per_pixel / 8) = 0;
  83.                                 *(fbp +location_tt + (8 + j) * vinfo.bits_per_pixel / 8 + 1) = 0;
  84.                         }
  85.                         mask = mask >> 1;
  86.                 }
  87.         }
  88.         s_x += 16;
  89. }

  90. //判断是否换行   x坐标
  91. int Is_next_line(int x)       
  92. {
  93.         if (x >= End_x)
  94.                 return 1;
  95.         return 0;
  96. }

  97. //跳到下一行
  98. int Next_line(int y)
  99. {
  100.         //sleep(1);
  101.         y = y + 16;
  102.         s_y = y;
  103.         s_x = Start_x;
  104.         return y;
  105. }

  106. //判断是否换屏   y坐标
  107. int Is_next_screen(int y)
  108. {
  109.         if (y >= End_y - 8)
  110.                 return 1;
  111.         return 0;
  112. }

  113. //清屏,跳到下一屏
  114. void   Next_screen()
  115. {
  116.         int ret;
  117. int i;
  118.         while (1)
  119.         {
  120.                 ret = read(fk, button_status, 6);
  121.                 if (ret < 0)
  122.                 {
  123.                         printf("read button status err\n");
  124.                 }
  125.                 //按键控制翻到下一页
  126.                 if (button_status[0] == '1')
  127.                 {
  128.                         //清屏
  129.                         clear_screen();
  130.                         //s_x = Start_x;
  131.                         s_y = Start_y;
  132.                         break;
  133.                 }
  134.                 if (button_status[1] == '1'){
  135.                         for(i=0;i<255;i++) ;
  136.                         if (button_status[1] == '1'){
  137.                                 clear_screen();
  138.                                 printf("%d\n",id);
  139.                                 id=id-532;
  140.                                         s_y = Start_y;
  141.                                 break;}
  142.                        
  143.                 }
  144.     }
  145. //        sleep(2);

  146. }

  147. //清屏,跳到上一屏
  148. void UP_screen(unsigned int zf_index)
  149. {
  150.         int ret;
  151.         //int i=0;
  152. //        unsigned char *buffer;
  153.         //unsigned char buf[16];
  154.         while (1)
  155.         {
  156.                 ret = read(fk, button_status, 6);
  157.                 if (ret < 0)
  158.                 {
  159.                         printf("read button status err\n");
  160.                 }
  161.                 //按键控制翻到上一页
  162.                 if (button_status[1] == '1')
  163.                 {
  164.                         //清屏
  165.                         clear_screen();
  166.                         //s_x = Start_x;
  167.                         //zf_index = buffer[i] * 16;
  168.                 //        memcpy(buf, (const void *)&Assic[zf_index], 16);
  169.                         s_y=zf_index;
  170.                         break;
  171.                 }
  172.     }
  173. //        sleep(2);
  174. }



  175. //绘制一行字符   
  176. void Put_text_ch(int x, int y, int size, const unsigned char ch[])
  177. {
  178.     int i = 0, j = 0;
  179.     unsigned char buffer[16];
  180.     for (i = 0; i < size; i++)
  181.     {
  182.         for (j = 0; j < 16; j++)
  183.         {
  184.             buffer[j] = ch[i * 16 + j];
  185.         }
  186.                 if (i != 0)
  187.                         x += 8;
  188.                 if(Is_next_line(x))
  189.                 {
  190.                         y = Next_line(y);
  191.                         x = s_x;
  192.                         if (Is_next_screen(y))
  193.                         {
  194.                                 Next_screen();
  195.                                 y = s_y;
  196.                         }
  197.                 }
  198.         Draw_8X16(x, y, buffer);
  199.     }
  200. }

  201. //绘制一行汉字   
  202. void Put_text_hz(int x, int y, int size, const unsigned char ch[])
  203. {
  204.     int i = 0, j = 0;
  205.     unsigned char buffer[32];
  206.     for (i = 0; i < size; i++)
  207.     {
  208.         for (j = 0; j < 32; j++)
  209.         {
  210.             buffer[j] = ch[i * 32 + j];
  211.         }
  212.                 if (i != 0)
  213.                         x += 16;
  214.                 if(Is_next_line(x))
  215.                 {
  216.                         y = Next_line(y);
  217.                         x = s_x;
  218.                         if (Is_next_screen(y))
  219.                         {
  220.                                 Next_screen();
  221.                                 y = s_y;
  222.                         }
  223.                 }
  224.         Draw_16X16(x, y, buffer);
  225.     }
  226. }

  227. //打开LCD设备
  228. void open_lcd()
  229. {
  230.         //以可读可写的方式打开LCD设备
  231.     fp = open ("/dev/fb0",O_RDWR);
  232.         //错误冗余
  233.     if (fp < 0){
  234.         printf("Error : Can not open framebuffer device\n");
  235.         exit(1);
  236.     }
  237.         //在超级终端打印下面两句话
  238.         puts("hello, world.\n");
  239.         printf("open framebuffer device\n");
  240.         //获取屏幕相关参数       
  241.     if (ioctl(fp,FBIOGET_FSCREENINFO,&finfo)){
  242.         printf("Error reading fixed information\n");
  243.         exit(2);
  244.     }
  245.     if (ioctl(fp,FBIOGET_VSCREENINFO,&vinfo)){
  246.         printf("Error reading variable information\n");
  247.         exit(3);
  248.     }

  249.         //计算屏幕缓冲区大小
  250.     screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;   //单帧画面空间

  251.         printf("可见屏幕一行有多少个像素点:xres= %d\n", vinfo.xres);
  252.         printf("可见屏幕一列有多少个像素点:yres = %d\n", vinfo.yres);
  253.         printf("每个相似的位数即BPP: bits_per_pixel = %d\n", vinfo.bits_per_pixel);

  254.     /*这就是把fp所指的文件中从开始到screensize大小的内容给映射出来,得到一个指向这块空间的指针*/
  255.     fbp =(char *) mmap (0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fp,0);
  256.     if ((int) fbp == -1)
  257.     {
  258.          printf ("Error: failed to map framebuffer device to memory.\n");
  259.          exit (4);
  260.     }
  261.         printf("The Framebuffer device was mapped to memory successfully!\n");
  262. }

  263. //关闭LCD设备
  264. void close_lcd()
  265. {
  266.         munmap (fbp, screensize); /*解除映射*/
  267.     close (fp);    /*关闭文件*/
  268. }

  269. //打开文本文件
  270. int open_txt()
  271. {
  272.         int fd_t;
  273.         fd_t = open("./1.txt",0);
  274.         if (fd_t < 0)
  275.         {
  276.                 printf("txt can't open!\n");
  277.                 return (-1);
  278.         }
  279.         return fd_t;
  280. }

  281. //关闭文本文件
  282. void close_txt(int fd_t)
  283. {
  284.         close(fd_t);
  285. }

  286. //计算文件总字节数       
  287. off_t cal_filesize(fd_t)
  288. {
  289.         struct stat txt_stat;
  290.         off_t file_size_t = 0;

  291.         fstat(fd_t, &txt_stat);
  292.         file_size_t = txt_stat.st_size;
  293.         printf("file_size = %d\n", file_size_t);
  294.         return file_size_t;       
  295. }

  296. int open_buttons()
  297. {
  298.         int fk_t;
  299.         fk_t = open("/dev/buttons", O_RDWR);
  300.         if (fk_t < 0)
  301.         {
  302.                 printf("can't open /dev/buttons\n");
  303.                 return -1;
  304.         }
  305.         return fk_t;
  306. }

  307. void close_buttons(int fk_t)
  308. {
  309.         close(fk_t);       
  310. }

  311. int main(void)
  312. {
  313.         int fd;
  314.         unsigned char *buffer;
  315.         off_t file_size = 0;       
  316.         int k = 0;
  317.         unsigned int zf_index;
  318.         unsigned char buf[16];
  319.        
  320.         fk = open_buttons();
  321.        
  322.         open_lcd();       
  323.         clear_screen();
  324.        
  325.         s_x = Start_x;
  326.         s_y = Start_y;

  327.         //传过去的应该是文件路径
  328.         fd = open_txt();
  329.         if (fd < 0)
  330.         {
  331.                 printf("txt can't open!\n");
  332.                 return (-1);
  333.         }

  334.         //计算文件总字节数       
  335.         file_size = cal_filesize(fd);

  336.         buffer = (unsigned char *)malloc(file_size);
  337.         memset(buffer, 0, file_size);

  338.         read(fd, buffer, file_size);
  339.         //printf("%s\n", buffer);
  340.        
  341.         for (id = 0; id < file_size - 1; id++)
  342.         {
  343.                
  344.                 //判断文本中的当前字是不是换行符
  345.                 if (buffer[id] == '\n')
  346.                 {
  347.                         //换行
  348.                         Next_line(s_y);
  349.                         //判断一下是不是又刚好是换屏
  350.                         if (Is_next_screen(s_y))
  351.                                 Next_screen();
  352.                                
  353.                         continue;
  354.                 }
  355.        
  356.                
  357.                 zf_index = buffer[id] * 16;
  358.                 memcpy(buf, (const void *)&Assic[zf_index], 16);
  359.                 /*for (k = 0; k < 16; k++)
  360.                         printf("0x%x\t",buf[k]);
  361.                 printf("\n");
  362.                 */
  363.                 Put_text_ch(s_x, s_y, 1, buf);
  364.                
  365.         }
  366.        
  367.         close_txt(fd);
  368.         close_lcd();
  369.         close_buttons(fk);
  370.         return 0;
  371. }
复制代码

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP