作业:基于STM32的0.96寸OLED显示屏显示数据

文章介绍了如何通过串口在Linux系统中传输文件,使用Ubuntu处理汉字字模并显示,以及详细讲解了SPI接口的工作原理和应用,包括在0.96寸OLED显示屏上显示个人信息、AHT20传感器数据及动态文本的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、串口传输文件的练习

1.实验步骤

使用两个use接口,并用杜邦线连接,然后分别连接上两台笔记本电脑,并打开串口助手进行文件传输。

2.过程

波特率:115200,发送文件
在这里插入图片描述

接收文件
在这里插入图片描述

波特率:2000000,发送文件
在这里插入图片描述

接收文件
在这里插入图片描述

二.使用Ubuntu完成汉字的字模读取和显示

1.介绍

国标码:国标码是一个四位十六进制数,它将一个汉字用两个字节表示,每个字节只有7位,与ASCII码相似。因此,必须将“区码”和“位码”分别加上32(十六进制为20H,后缀H表示十六进制),作为国标码。也就是说,国标码相当于将区位码向后偏移了32,以避免与ASCII字符中0~32的不可显示字符和空格字符相冲突。

汉字机内码:为了避免ASCII码和国标码同时使用时产生二义性问题,大部分汉字系统都采用将国标码每个字节高位置1作为汉字机内码。这样既解决了汉字机内码与西文机内码之间的二义性,又使汉字机内码与国标码具有极简单的对应关系。

汉字区位码:区位码一个四位的十进制数,它将GB2312—80的全部字符集组成一个94×94的方阵,每一行称为一个“区”,编号为01~94;每一列称为一个“位”,编号为01~94,这样得到GB2312—80的区位图,用区位图的位置来表示的汉字编码,称为区位码。

2.步骤

1.新建一个文件夹存放文件
在这里插入图片描述

2.新建一个cpp文件
在这里插入图片描述

3.编写代码,输入完毕后按esc输入:wq退出

#include<iostream>

#include<opencv/cv.h>

#include"opencv2/opencv.hpp"

#include<opencv/cxcore.h>

#include<opencv/highgui.h>

#include<math.h>

using namespace cv;

using namespace std;

void paint_chinese(Mat& image,int x_offset,int y_offset,unsigned long offset);

void paint_ascii(Mat& image,int x_offset,int y_offset,unsigned long offset);

void put_text_to_image(int x_offset,int y_offset,String image_path,char* logo_path);

int main(){
   

    String image_path="/home/swordfish/qianrushi/work4/chinesetest/image.jpg";

    char* logo_path=(char*)"/home/swordfish/qianrushi/work4/chinesetest/logo.txt";

    put_text_to_image(20,300,image_path,logo_path);

    return 0;

}



void paint_ascii(Mat& image,int x_offset,int y_offset,unsigned long offset){
   

    //绘制的起点坐标

	Point p;

	p.x = x_offset;

	p.y = y_offset;

	 //存放ascii字膜

	char buff[16];           

	//打开ascii字库文件

	FILE *ASCII;

	if ((ASCII = fopen("/home/swordfish/qianrushi/work4/chinesetest/Asci0816.zf", "rb")) == NULL){
   

		printf("Can't open ascii.zf,Please check the path!");

		//getch();

		exit(0);

	}

	fseek(ASCII, offset, SEEK_SET);

	fread(buff, 16, 1, ASCII);

	int i, j;

	Point p1 = p;

	for (i = 0; i<16; i++)                  //十六个char

	{
   

		p.x = x_offset;

		for (j = 0; j < 8; j++)              //一个char八个bit

		{
   

			p1 = p;

			if (buff[i] & (0x80 >> j))    /*测试当前位是否为1*/

			{
   

				/*

					由于原本ascii字膜是8*16的,不够大,

					所以原本的一个像素点用4个像素点替换,

					替换后就有16*32个像素点

					ps:感觉这样写代码多余了,但目前暂时只想到了这种方法

				*/

				circle(image, p1, 0, Scalar(0, 0, 255), -1);

				p1.x++;

				circle(image, p1, 0, Scalar(0, 0, 255), -1);

				p1.y++;

				circle(image, p1, 0, Scalar(0, 0, 255)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值