• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >嵌入式开发 > 韦东山视频第三期之心得体会

韦东山视频第三期之心得体会

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-05

佚名通过本文主要向大家介绍了韦东山视频 百度云,韦东山视频,韦东山视频破解,韦东山视频翻录,韦东山第一期视频等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 韦东山视频第三期之心得体会
描述:

视频

                  
   这几天刚开始看韦东山老师的第三期视频,感觉在韦东山老师的帮助下,一场新的旅行又开始了。第一期项目是做一个数码相框,我在看到字符编码这一节,就想起之前LCD驱动那一节了。只是第三期从项目实战的角度出发看问题更加透彻,非常值得学习,在这里,我想分享学习之后的一些心得体会。
   我们通常在LCD上显示汉字和字母等各种各样的部分时,都要调用字库,而调用字库之前都先要对汉字或字母进行编码,如然后取它们的ASCII码或者UTF-8码对字库中的对应数据进行检索得到点阵的数据,最后将数据显示在framebuffer中,这样屏幕上就会显示出我们需要的东西了,下面是我参考视频所写的的一个显示的测试程序。
   首先我们要准备两个文件,一个汉字库文件,我是百度上找的HZK16文件,用来进行汉字检索;还有一个是ASCII自模文件,它来自于Linux源码,路径为:/drivers/video/console/font_8x16.c。该文件不能复制过来直接使用,要进行修改,如下:
   (1).屏蔽无关的头文件
    //#include <linux/font.h>
    //#include <linux/module.h>
   (2).删除无效的数组定义代码,将文件中最后一段代码删除,如下:
    /*
    const struct font_desc f />     {
        .idx=VGA8x16_IDX,
        .name="VGA8x16",
        .width=8,
        .height=16,
        .data=fontdata_8x16,
        .pref=0,
    };
    */
  然后开始编写主程序文件:lcd.c
  
  1.首先贴上要用的头文件:
  #include <sys/mman.h>
  #include <sys/types.h>
  #include <sys/stat.h>
  #include <unistd.h>
  #include <linux/fb.h>
  #include <fcntl.h>
  #include <stdio.h>
  #include <string.h>
  #include <stdint.h>
  2.先从主函数开始看看大体的程序流程吧。
  int main(int argc,char **argv)中:
   (1)先打开需要的fb0设备文件,并且读取LCD驱动的相关参数信息。在做这一步之前先要确保设备文件存在,也就是LCD的驱动已经存在,所以最好对open函数和ioctl函数的返回值进行判断,便于出错检查。应用层调用open和ioctl函数之后,在驱动中会调用相应的函数来实现各种操作。ioctl函数将LCD设备结构体fb_info中的成员var结构体和fix结构体这两个固定和可变参数参数结构体的内容从驱动层调到应用层,因为之后要根据驱动中配置好的图像宽高、图像深度等重要信息设置一幅图的图像数据。得到var结构体和fix结构体之后得到的数据要注意有些如图像深度、图像宽度和图像的大小的单位都是字节。这一部分具体的代码如下:
     
     fd_fb=open("/dev/fb0",O_RDWR);//打开LCD设备
     if(fd_fb<0)
     {
         printf("can not open /dev/fb0!\n");
         return -1;
     }
     //获取LCD驱动的可变参数信息
     if(ioctl(fd_fb,FBIOGET_VSCREENINFO,&var))//0:true    else:false
     {
           printf("can not get var!\n");
    return -1;
     }
     //获取LCD驱动的固定参数信息
     if(ioctl(fd_fb,FBIOGET_FSCREENINFO,&fix))
     {
          printf("can not get fix!\n");
     }
     printf("像素值是:%d 个字节\n",var.bits_per_pixel/8);
     pixel_width=var.bits_per_pixel/8;//像素深度
     line_width=var.xres*pixel_width; //一行大小
     screen_size=var.yres*line_width; //一场大小
   (2)对要操作的文件进行内存映射。
    这一步包括对设备文件fb0进行映射,这样将图像数据直接填入映射后的内存就相当于直接写入文件了,也就可以直接显示了;也包括对要读取的HZK16文件进行映射,方便从HZK16文件中读取汉字对应的编码数据。注意,对应内核中的ASCII编码文件这里不需映射。应为我直接将他放在当前目录下,并且通过extern的形式来读取其中存放ASCII编码的结构体。具体的实现代码如下:
     fbmem_start=(unsigned char *)mmap(NULL,screen_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd_fb,0);
     if(fbmem_start==(unsigned char *)-1)
     {
         printf("can not mmap!\n");
         return -1;
     }
     fd_hzk16=open("HZK16",O_RDONLY);//打开汉字库文件
     if(fd_hzk16<0)
     {
          printf("can not open HZK16 file!\n");
          return -1;
     }
      //获取文件信息
     if(fstat(fd_hzk16,&hzk_stat))
     {
         printf("can not get fstat!\n");
  return -1;
     }
     //把HZK16文件映射到内存进程空间
    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 not mmap for hzk16!\n");
 return -1;
    }
    (3).做好前面的准备工作之后就可以调用相关的函数来显示东西了。在这里我对一些基本的功能分别实现,在显示之前先通过memset函数将数据00写入显存,也就是做清屏操作,然后开始显示,分别显示字母'A',和汉字,以及汉字和字母的混合。这三部分分别封装成三个函数来实现,下面是对他们的调用。
    memset(fbmem_start,0x00,screen_size);//清屏
 
    lcd_show_ascii(fbmem_start,var.xres/2,var.yres/2,'A',forecolor,backcolor);
  
    lcd_show_chinese(fbmem_start,var.xres/2+8,var.yres/2,str,forecolor,backcolor);
    lcd_show_chinese(fbmem_start,var.xres/2+24,var.yres/2,str+2,forecolor,backcolor);
    lcd_show_chinese(fbmem_start,var.xres/2+40,var.yres/2,str+4,forecolor,backcolor);
    lcd_show_chinese(fbmem_start,var.xres/2+56,var.yres/2,str+6,forecolor,backcolor);
    lcd_show_chinese(fbmem_start,var.xres/2+72,var.yres/2,str+8,forecolor,backcolor);
 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Ubuntu1204下播放韦东山二三期视频的解决办法
  • 韦东山视频第三期之心得体会

相关文章

  • 2017-06-05 用java做USB通信
  • 2017-06-05 STM32F103VCCAN在20K波特率时接收丢帧1%,在250K时完全正常
  • 2017-06-05 如何通过编程将AVIDecompressor和VideoRender加入到graph中?
  • 2017-06-05 PIC电平变化中断问题
  • 2017-06-05 自定义scatter文件,程序进入HardFault_Handler
  • 2017-06-05 WinCE打补丁后对话框变大
  • 2017-06-05 java中yield,sleep,wait,notify都是软中断吗?
  • 2017-06-05 如何把网口虚拟成串口?
  • 2017-06-05 刚刚毕业的大学生,对于未来的前景很迷茫,希望指点!
  • 2017-06-05 请教一个关于DEBUGMSG的问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 请教有关USB虚拟RS232的问题!望赐教
    • stlinkv2制作成功,开源所有资料,包括固件,制作过程
    • GSM模块的问题
    • epsontmu210b的黑标定位
    • sim900aGPRS链接服务器,次数越多越出问题
    • vs2003与DDK环境配置
    • ARMLinux将console串口当作普通数据串口的问题
    • 我手里有一块飞凌嵌入式的iMX6开发板,开机默认语言怎么更改为英文
    • 视窗驱动研发?
    • vxworks系统下如何终止一个任务???

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有