在LCD上显示英文和汉字

article/2025/9/22 14:47:50

LCD工作时会在内存中的显存(framebuffer)中取出若干个字节来表示一个像素点,如此循环的把显存中的点阵显示出来

在这里插入图片描述
下面直接贴出代码,在代码中有详细的注释:

int main(int argc,char **argv)
{unsigned char str[] = "中"; //1.打开文fb0文件//2.先获取LCD的相关信息,如分辨率等,可变信息和固定信息fd_fb = open("/dev/fb0", O_RDWR);	//打开lcd设备fb0if (fd_fb < 0){printf("can't open /dev/fb0\n");return -1;}if (ioctl(fd_fb, FBIOGET_VSCREENINFO, &var)) //获取lcd设备fb0可变信息{printf("can't get var\n");return -1;}if (ioctl(fd_fb, FBIOGET_FSCREENINFO, &fix)) // 	获取lcd设备fb0固定信息{printf("can't get fix\n");return -1;}line_width = var.xres * var.bits_per_pixel / 8;		//算出一行的宽度单位是字节pixel_width = var.bits_per_pixel / 8;				//算出每个像素的字节数//算出显存的大小var.xres屏幕宽度  var.yres屏幕高度  var.bits_per_pixel每个像素用几字节表示screen_size = var.xres * var.yres * var.bits_per_pixel / 8;//给lcd设备分配一个screen_size大小的显存空间fbmem = (unsigned char *)mmap(NULL,screen_size,PROT_READ | PROT_WRITE,MAP_SHARED,fd_fb,0);if(fbmem == (unsigned char*)-1){printf("can't mmap\n");return -1;}/* HZK16的初始化 */fd_hzk16 = open("HZK16", O_RDWR);	//打开汉字库if (fd_hzk16 < 0){printf("can't open HZK16\n");return -1;}if(fstat(fd_hzk16, &hzk_stat))		//获得汉字库的大小信息{printf("can't get fstat\n");return -1;}//将汉字库映射到内存中去,可以像访问内存数组一样访问他hzkmem = (unsigned char *)mmap(NULL , hzk_stat.st_size, PROT_READ, MAP_SHARED, fd_hzk16, 0);if (hzkmem == (unsigned char *)-1)	{printf("can't mmap for hzk16\n");return -1; }/* 清屏: 全部设为黑色 */memset(fbmem, 0, screen_size);lcd_put_ascii(var.xres/2, var.yres/2, 'A');		//显示一个英文字母printf("chinese code : %02x %02x \n",str[0],str[1]);lcd_put_chinese(var.xres/2 + 8, var.yres/2, str);	//显示一个中文return 0;
}

显示字符函数

void lcd_put_ascii(int x, int y, unsigned char c)
{//fontdata_8x16时字符集数组的地址,而每个字符是8*16的大小也就是16字节,//字符c的ASCII值就代表了它在数组中的位置,如字符'A',的ASCII值是0x41=65 //它在数组中的位置就是65个,		unsigned char *dots = ( unsigned char *)&fontdata_8x16[c*16];int i,b;unsigned char byte;for(i = 0; i < 16; i++)	//16行数据{byte = dots[i];			//每次取出一个字节for(b = 7; b >= 0; b--)	{if(byte &(1<<b))	//比较每一位的值,1代表要显示 0 代表不显示{//显示像素lcd_put_pixel(x+7-b,y+i,0xffffff);//白色}else{//不显示像素lcd_put_pixel(x+7-b,y+i,0);//黑色}}}	 
}

在这里插入图片描述

显示汉字函数

void lcd_put_chinese(int x, int y,unsigned char *str)//国标码两个字节
{unsigned int  arse = str[0] - 0xA1;			//算出区码unsigned int where = str[1] - 0xA1;		//算出区码中的偏移位置unsigned char *dots = hzkmem + (arse*94 + where) * 32;//算出要显示的汉字在字库文件中的位置int i,j,b;unsigned char byte;for(i = 0; i<16; i++)	//16行{for(j = 0; j < 2; j++)	//一行两个字节 用j把它分开{byte = dots[i*2+j];	//算出要打印的数据位置for(b = 7; b>=0; b--){if(byte & (1<<b)){lcd_put_pixel(x+j*8+7-b, y+i, 0xffffff);}else {lcd_put_pixel(x+j*8+7-b, y+i, 0);}}			}		}	
}

在这里插入图片描述在GBK码中的字符“中”字,它的GBK码是D6 D0,其中D6是区码,D0是位码,每一个区有94个字符,每一个字符是16*16位,也就是32字节,因此unsigned char dots = hzkmem + (arse94 + where) * 32;//表示算出要显示的汉字在字库文件中的位置

显示像素函数

void lcd_put_pixel(int x, int y, unsigned int color)
{//对于不同的像素宽度,处理方式不同//参数中颜色值color是一个int型的变量,它表示的颜色的格式是RGB格式//0x00RRGGBB,只用到了三个字节表示颜色unsigned char  *pen_8  =fbmem + y*line_width + x*pixel_width;unsigned short *pen_16 = (unsigned short*)pen_8;unsigned int   *pen_32 = (unsigned int * )pen_8;unsigned int red,green,blue;switch(var.bits_per_pixel){case 8:		//{*pen_8 = color;break;}case 16:	//对于像素宽度位16的,需要把int型的数据转化为565的16位数据{			//之后再重新组装成16位的数据,显示出来red = (color>>16) & 0xff;green = (color>>8) & 0xff;blue = (color>>0) & 0xff;color = ((red>>3)<<11) | ((green>>2)<<5) |(blue>>3);*pen_16 = color;break;}case 32:{		//对于32位的数据,可以直接显示*pen_32 = color;break;}default :{printf("can't surport %dbpp\n", var.bits_per_pixel);break;}}	
}

http://chatgpt.dhexx.cn/article/mIcIZBqW.shtml

相关文章

Element Plus的分页组件el-pagination显示英文

问题&#xff1a;使用Element Plus的分页组件el-pagination&#xff0c;切换每页显示数量时显示的是英文。原因&#xff1a;Element Plus 组件默认使用的是英语&#xff0c;显示中文的话需要做下配置&#xff0c;就是要引入element-plus里面的中文包。 解决&#xff1a; 第一种…

antd表格分页控件显示英文page

antd:【2021-1-26】解决表格分页控件英文显示的问题--使用之表格与分页控件的使用&#xff1a; 官网描述&#xff1a; Table组件pagination属性描述&#xff1a;object为Pagination组件api的属性与值&#xff0c;按官网指示查看Pagination配置表格的pagination Pagination组件…

解决element-UI中分页组件显示英文

问题&#xff1a; 在写vue项目的时候&#xff0c;发现分页控件显示英文 解决方案&#xff1a; src/main.js // 注释掉英文&#xff0c;替换成中文即可 import locale from element-ui/lib/locale/lang/en // 英文 import locale from element-ui/lib/locale/lang/zh-CN …

单片机控制LCD1602显示英文句子

LCD1602简介&#xff1a; 1602字符型液晶也叫1602液晶&#xff0c;它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。字符型液晶&#xff0c;能够同时显示16x02即32个字符。 它由若干个5X7或者5X11等点阵字符位组成&#xff0c;每个点阵字符位都可以显示一个字符&…

引入ant组件分页时显示英文问题

1、在main.js中引入 import ant-design-vue/dist/antd.css Vue.prototype.zhCNzhCN 2、在APP.vue中写入全局组件 这样分页显示的就是中文啦 哈哈哈

Matlab编程之混沌系统李雅普诺夫指数分析

简介 李雅普诺夫指数是衡量混沌系统的一个重要参数&#xff0c;下面截图是对其具体解释。 代码实现&#xff1a; clc; clear; global kk;e0ina10;final210;for kkina1:1:final2kk InitialTime0; %Initial time FinalTime500; %Final time TimeStep0.1; %Time step RelTol1e-5…

李雅普诺夫指数

1. 李雅普诺夫指数 Lyaponuv&#xff08;李雅普诺夫&#xff09;指数表示相空间相邻轨迹的平均指数发散率的数值特征。又称李雅普诺夫特征指数&#xff0c;是用于识别混沌运动若干数值的特征之一。 李雅普诺夫指数常常被用来判定一个系统的混沌性&#xff0c;通过图像可以直观…

李雅普诺夫函数定义

李雅普诺夫函数-维基百科

李雅普诺夫优化定义

李雅普诺夫优化-维基百科

关于Lyapunov李雅普诺夫判据——系统原点平衡状态大范围渐近稳定

研一上学期在现代控制理论课程学习中&#xff0c;接触到了一种题型&#xff0c;“用李雅普诺夫判据判断系统稳定性”&#xff0c;其中判断给定非线性系统大范围渐近稳定上来就是四个步骤&#xff0c;记录一下自己的理解。 不论述完整内容&#xff0c;仅表达一些问题看法和思考…

求最大李雅普诺夫指数(Largest Lyapunov Exponents,LLE)的 Rosenstein 算法

文章目录 原始论文python 相关代码混沌系统的常见指标最大李亚普诺夫指数的含义算法流程图python 代码模块最近邻maximum Lyapunov exponentRANSAC 拟合曲线 例子&#xff1a;计算洛伦兹系统的最大李雅普诺夫指数 原始论文 M.T. Rosenstein, J.J. Collins, and C.J. De Luca. …

李雅普诺夫稳定性

在数学和自动控制领域中&#xff0c;李雅普诺夫稳定性&#xff08;英语&#xff1a;Lyapunov stability&#xff0c;或李亚普诺夫稳定性&#xff09;可用来描述一个动力系统的稳定性。如果此动力系统任何初始条件在 {\displaystyle x_{0}}转存失败重新上传取消 附近的轨迹均能维…

现代控制理论——李雅普诺夫第一方法

李雅普诺夫关于系统的稳定性的方法对于线性系统和非线性系统都是适用的 李雅普诺夫关于稳定性的定义 注意&#xff1a;运动轨迹与平衡状态之间的距离小于 对于完全能观或能控的系统&#xff0c;内部稳定和外部稳定其实是等价的。

李雅普诺夫定理及条件的解释

大数定律包含几个主要的定理&#xff1a; 弱大数定理&#xff08;辛钦大数定理&#xff09;以及伯努利大数定理。独立同分布的中心极限定理。李雅普诺夫定理。利莫夫-拉普拉斯大数定理。 其中最核心的定理便是李雅普诺夫定理。但是&#xff0c;该定理的前提条件晦涩难懂&…

matlab 计算 Lorenz 系统最大李雅普诺夫指数

参考原理&#xff1a; Lyapunov 指数的计算与仿真&#xff1a;https://wenku.baidu.com/view/ae8e4f80680203d8ce2f2476.html Lorenz 系统的动力学方程 function dX Lorenz(t,X,params) a params(1); b params(2); c params(3);xX(1); yX(2); zX(3);dX zeros(3,1); d…

matlab判断李雅普诺夫稳定性

李雅普诺夫稳定性matlab仿真程序 李雅普诺夫稳定性判别有两种方法&#xff0c;直接法和间接法。直接法是求解状态方程的特征多项式&#xff0c;判断极点位置&#xff0c;全在左半平面则稳定。间接法是最常用的判断稳定性方法&#xff0c;无需求解&#xff0c;只要构造一个广义…

【李雅普诺夫方程】

文章目录 前言李雅普诺夫方程求解参考链接 前言 李雅普诺夫方程 (Lyapunov equation) 作为一种著名的矩阵方程为人所熟知&#xff0c;其在控制理论以及众多工程领域有着极为广泛的应用。 李雅普诺夫方程求解 参考链接 知乎

如何计算Lyapunov exponent spectrum?matlab计算李雅普诺夫指数

如何理解和计算Lyapunov exponent spectrum&#xff1f; 1、这是我听到最接近人话的描述。 混沌运动的基本特点是运动对初始条件极为敏感&#xff0c;两个极为靠近的初始值所产生的轨迹&#xff0c;随着时间推移将按照指数方式分离。李娜诺普指数就是描述这一现象的量。 2、 结…

Matlab求解李雅普诺夫(Lyapunov)方程

线性定常连续系统渐进稳定性的判别 Matlab中可以调用lyap函数求解P AX XA -C % 这是函数的内部定义式&#xff0c;恰好与理论定义的转置是反着的所以我们应该这样使用 P lyap(A, Q) % 一般令QI&#xff08;I指单位阵&#xff09;Matlab中可以调用eig函数解矩阵特征值 可…