嵌入式开发板屏幕显示汉字

一、实验目的

1.编写能够在嵌入式开发板LCD上显示汉字的程序;
2.在Ubuntu系统中编译上述程序生成可执行文件;
3.到开发板中验证。

二、实验步骤

1. Ubuntu系统上编写验证程序

Ubuntu系统上编写的验证程序如下,为了验证是否能够正确从HZK16字库中读取出某个字。

HZK16汉字16*16点阵字库的使用及实例程序

2. Ubuntu系统上编写能够在板子上执行的程序

要在LCD上显示“福州大学”,首先打开FrameBuffer驱动:fd_fb = open(“/dev/fb0”, O_RDWR),之后使用函数mmap映射显示存储器,最后调用函数PrintLCD显示字体,代码如下:

#include <stdio.h> 

#include <stdlib.h>

#include <fcntl.h>

#include <sys/mman.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <string.h>

#include <unistd.h>



#define FONT_COLOR 0xf100 // 红色

#define SCREEN_WIDTH 1280

#define SCREEN_HEIGHT 1600

#define PIXEL_BYTES 2

#define ZOOM_FACTOR 20 // 放大倍数

#define CHAR_SPACING 10 // 字符间距



unsigned short *fb = 0;



void getHZCode(unsigned char incode[], unsigned char hzCode[]) {

    long offset; // 相对于字库起始位置的偏移字节数  

    int quCode = incode[0] - 0xa0; // 区码: 该汉字的区号  

    int weiCode = incode[1] - 0xa0; // 位码: 该汉字的位号  

    offset = (94 * (quCode - 1) + (weiCode - 1)) * 32; // 32为一个汉字需要32字节(16*16=256个点,256/8=32)  



    FILE *HZK = fopen("HZK16S", "rb");  

    if (HZK == NULL) { // rb: 打开二进制文件  

        printf("Can't Open HZK16S\n");  

        exit(1);  

    }  



    fseek(HZK, offset, SEEK_SET);  

    fread(hzCode, 1, 32, HZK); // 读取表示此汉字的32字节数到hzCode中  

    fclose(HZK);  

}



void printLCD(int top, int left, unsigned char hzCode[]) {

    int i, j, k, m, n;

    for (j = 0; j < 16; j++) {

        for (i = 0; i < 2; i++) {

            for (k = 0; k < 8; k++) {

                if (hzCode[j * 2 + i] & (0x80 >> k)) {

                    for (m = 0; m < ZOOM_FACTOR; m++) {

                        for (n = 0; n < ZOOM_FACTOR; n++) {

                            *(fb + (j * ZOOM_FACTOR + m + top) * SCREEN_WIDTH + left + (i * 8 + k) * ZOOM_FACTOR + n) = FONT_COLOR;

                        }

                    }

                }

            }

        }

    }

}



int main() {

    int i;

    int fd_fb = 0;

    unsigned char incode[2]; // 存储区码和位码

    unsigned char hzCode[32]; // 存储汉字点阵数据

    char testStr[] = {

        0xB8, 0xA3, // 福

        0xD6, 0xDD, // 州

        0xB4, 0xF3, // 大

        0xD1, 0xA7  // 学

    };

    int strLength = sizeof(testStr);



    fd_fb = open("/dev/fb0", O_RDWR); // 打开FrameBuffer驱动

    if (fd_fb == -1) {

        perror("open fb0");

        return 1;

    }



    fb = (unsigned short *)mmap(0, SCREEN_WIDTH * SCREEN_HEIGHT * PIXEL_BYTES, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0); // 映射显示存储器,2: 2Bytes

    if (fb == MAP_FAILED) {

        perror("mmap");

        close(fd_fb);

        return 1;

    }



    memset(fb, 0, SCREEN_WIDTH * SCREEN_HEIGHT * PIXEL_BYTES); // 清屏



    for (i = 0; i < strLength; i += 2) {

        incode[0] = testStr[i]; // 区码

        incode[1] = testStr[i + 1]; // 位码

        getHZCode(incode, hzCode);

        printLCD(100, i / 2 * (16 * ZOOM_FACTOR + CHAR_SPACING), hzCode); // 显示放大的点阵

    }



    munmap(fb, SCREEN_WIDTH * SCREEN_HEIGHT * PIXEL_BYTES);

    close(fd_fb);

    return 0;

}


3. 传入开发板

3.

4. 输出到开发板的效果图

4.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/734699.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【开发12年码农教你】Android端简单易用的SPI框架-——-SPA

Service(priority 1) public class APrinterService implements IPrinterService { Override public void print() { System.out.println(“this is a printer service.”); } } 复制代码 B模块 —— BPrinterService Service(path“b_printer”, priority 2) public class…

监控 Promethus的监控告警Alertmanager、Grafana

Promethus的监控告警Alertmanager Alertmanager 介绍 Prometheus的一个组件&#xff0c;用于定义和发送告警通知&#xff0c;内置多种第三方告警通知方式&#xff0c;同时还提供了对Webhook通知的支持基于警报规则对规则产生的警报进行分组、抑制和路由&#xff0c;并把告警发…

华硕笔记本重装系统详细操作,图文教程体验Win11如何重装系统

随着科技的不断发展&#xff0c;电脑操作系统的步骤也在不断更新迭代。对于华硕笔记本用户来说&#xff0c;升级到Windows 11操作系统可以带来更好的使用体验。本文将通过图文教程的形式&#xff0c;详细介绍华硕笔记本重装Windows 11系统的操作步骤&#xff0c;帮助用户顺利完…

用AI打败AI,利用ai指令对头条文章进行查重测试,结果出乎意料

前言&#xff1a;现在的ai真的太火爆了&#xff0c;让人不得不感叹ai的神奇之处&#xff0c;让我们一起来探讨下ai的强大之处吧&#xff01;本文仅限学习研究。 背景&#xff1a;最近看到很多人用ai写文章&#xff0c;然后被头条判定为疑似ai生成&#xff0c;所以想研究学习下…

ES6 解构赋值详解

ES6是JavaScript语言的一次重大更新&#xff0c;引入了许多新特性和语法改进&#xff0c;其中解构赋值是一个非常实用和灵活的语法特性。它可以让我们从数组或对象中提取值&#xff0c;并赋给对应的变量&#xff0c;让代码变得更加简洁和易读。本文将深入探讨ES6解构赋值的语法…

ROS | 常见故障排查

1.开启后发出一个WIFI WIFI名字&#xff1a;WHEELTEC接数字 安全密钥&#xff1a;dongguan 2.显示屏接口 USB接口接键鼠 3.远程登录命令 ssh -Y wheeltec192.168.0.100 是小车发出的WIFI的一个IP地址 4. 登录后确保IP地址 ip a 看一下 当前ip地址 倒数第四行-当前ip地址 1…

简易部署的设备日志采集工具

永久免费: Gitee下载 最新版本 使用说明: Moretl 企业级采集文件工具 优势: A. 开箱即用. 解压直接运行.不需额外安装. B. 批管理设备. 设备配置均在后台管理. C. 无人值守 客户端自启动,自更新. D. 稳定安全. 架构简单,内存占用小,通过授权访问.

数据结构---二叉树前中后序遍历

1. 某完全二叉树按层次输出&#xff08;同一层从左到右&#xff09;的序列为 ABCDEFGH 。该完全二叉树的前序序列为() A: ABDHECFG B: ABCDEFGH C: HDBEAFCG D: HDEBFGCA 2. 二叉树的先序遍历和中序遍历如下&#xff1a;先序遍历: EFHIGJK; 中序遍历: HFIEJKG. 则二叉…

[数据集][目标检测]药片药丸检测数据集VOC+YOLO格式152张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;152 标注数量(xml文件个数)&#xff1a;152 标注数量(txt文件个数)&#xff1a;152 标注类别…

企业级Web项目中应该如何做单元测试、集成测试和功能测试?

先自我介绍下&#xff1a; 本人有过10年测试经验&#xff0c;也参与过公安部网络安全产品测试交付、华为4G 网络设备测试交付、腾讯QQ空间APP产品测试交付。 关于“企业级Web项目中应该如何做单元测试、集成测试和功能测试”这个问题&#xff0c;我想给大家唠唠&#xff0c;我…

Django数据驾驶舱

Django数据驾驶舱 1.项目介绍2.项目结构3.库表结构3.1 appcsdn的models3.2 appssq的models3.3 appweather的models3.4 appweibo的models 4.功能展示5.解决问题5.1 路由配置5.2 后端数据与前端echarts展示5.3 长图表丝滑滚动条 6.遗留问题7.资源分享 1.项目介绍 这里介绍本人最…

excel数据透视

Excel中&#xff0c;数据透视图&#xff08;PivotChart&#xff09;和数据透视表&#xff08;PivotTable&#xff09;是两个紧密相关的工具&#xff0c;用于分析数据。数据透视表是数据透视图的数据源&#xff0c;也就是说&#xff0c;数据透视图是基于数据透视表中的数据创建的…

判断题无答案22届期末复习

判断: 1-3.结构体变量不能进行整体输入输出。 1-4.不同类型的结构变量之间也可以直接赋值。 1-5假设结构指针p已定义并正确赋值,其指向的结构变量有一个成员是int型的num,则语句 (*p).num = 100; 等价于p->num=1…

Linux下多进程访问同一个共享库处理流程

两个测试程序实现调用同一个SO库: ​​​​​​​ #include <stdio.h> #include "a/a.h" #include <unistd.h> int main() { int a = 4,b = 5; sum(a, b); int ret = get(); printf("ret=%d\n", ret); sleep(100)…

如何用好swoole/webman/workerman/hyperf呢

Webman框架的依赖 "require": { "php": ">7.2", "workerman/webman-framework": "^1.5.0",// "monolog/monolog": "^2.0" }, 依赖的核心框架也是很久的了 webman-framework的核心依赖 &q…

Ubuntu下FastDDS的源码编译和简单测试

FastDDS是eprosima公司开发的DDS&#xff08;Data Distribution Service&#xff09;库&#xff0c;使用的语言是C&#xff0c;自称是"The Most Complete Open Source DDS Middleware"&#xff0c;其官网是https://eprosima.com/&#xff0c;FastDDS源码在https://gi…

【面试干货】HashSet 和 TreeSet 的区别

【面试干货】HashSet 和 TreeSet 的区别 1、实现方式HashSetTreeSet 2、性能添加、删除和查找操作的时间复杂度HashSetTreeSet 3、元素唯一性4、迭代顺序HashSetTreeSet 5、使用场景HashSetTreeSet 6、示例代码 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不…

Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案

初始化数据 */ private void initData(Bundle savedInstanceState) { if (savedInstanceState ! null) mDatas savedInstanceState.getStringArrayList(“mDatas”); if (mDatas null) { mLoadingDialog new LoadingDialog(); mLoadingDialog.show(getFragmentMana…

AI网络爬虫:搜狗图片的时间戳反爬虫应对策略

如何批量爬取下载搜狗图片搜索结果页面的图片&#xff1f;以孙允珠这个关键词的搜索结果为例&#xff1a; https://pic.sogou.com/pics?query%E5%AD%99%E5%85%81%E7%8F%A0&mode2 翻页规律如下&#xff1a; https://pic.sogou.com/napi/pc/searchList?mode2&start38…

Python: HexBinDecOct

因为&#xff1a; f0b1001110# 十进制 int()a0*2**01*2**11*2**21*2**30*2**40*2**51*2**6print(a)# 八进制 oct()print(78/8,78%8)# 110 001 001 8 116print(1*2**00*2**10*2**2,1*2**00*2**10*2**2,0*2**01*2**11*2**2)#十六进制 hex()#0 100 1110 16 4Eprint(sixteenFoo(0*…