大创笔记——硬切法实现基于单片机的人机交互系统

发布于:2022-12-15 ⋅ 阅读:(274) ⋅ 点赞:(0)

        这是在开发鄙人负责的大创项目时给项目成员们写的简略教程,后期随缘更心得和踩的坑等等。。

        鉴于鄙人水平不高,如有错误惠请大佬们告知;如有疑问也欢迎各位在评论区交流。

---------------------------------------------------------

目录

一、硬件概述

二、要求与说明

三、页面设计(部分)

/************************************************/

一、硬件概述

1.单片机:灵动MM32F3277GXP

2.屏幕选型及参数

1)、选型:2.0’ IPS With 56K Colors.

2)、屏幕分辨率320(L)*240(W).

3)、屏幕行列:240/8=30行;320/8=40

3.交互外设

1)、设计四个独立按键K1~K4,主要功能分别为确认,+-,返回,不排除部分根据功能需要改变。

2)、设计一个独立的按键K5作为用来确认用户已经服药的独立按键。

二、要求与说明

这一点请大家根据自己所选用屏幕的实际情况设计,此处按照鄙人项目的屏幕选型描述。

取模软件可以用PC2LCD(希望没记错软件名字)等等

(一)、字符取模要求

1.字符大小:24*24,小二;

2.取模方式:C51

3.字体:楷体(在另一个项目中我用的是宋体,因为IPS200这个屏幕的分辨率足够,出于美观考虑选了楷体)

(二)、页面行列说明

18像素一行,因此UI中每两行纵坐标差3,每页最多10行;

2、列数不用太过关心,确保两字体之间相差3*8=24像素,计算后直接写坐标即可;

(三)、坐标计算方法说明

1、居中

Y从上到下为0~29X从左到右是0~319

下面的UI中纵坐标是从1开始的,但实际是从0,且

表格上的12实际相差的是Y轴上的3行。

        图1 屏幕坐标系

单行居中:行上下左右距离屏幕边界分别相等;

两行居中:左右方向要求同单行居中,向上距离以

上面一行的顶和屏幕顶端的距离为准,向下距离以

下面一行的底和屏幕顶端的距离为准。

2、不居中

1).左侧缩进8像素即坐标的X轴以80,包括“确定”等;

2).最底部的“返回”、“配药”等右侧缩进8像素,即最后一个字的最右侧坐标为y_max-8。

(四)、坐标的表达(以本人项目使用的库函数为标准描述)

        需要填写的数据格式:填写时每个字符都要带括号,颜色默认黑色字符的颜色在代码中是可以更改的,前提是硬件支持多色显示。

       (x,  y, size, *chinese_buffer, number, color)

x               坐标 x 方向的起点 参数范围 [0, x_max-1]
y               坐标 y 方向的起点 参数范围 [0, y_max-1]
size           取模的时候设置的汉字字体大小,也就是一个汉字占用的点阵长宽为多少个点 取模的时候需要长宽是一样的
* chinese_buffer   需要显示的汉字数组
number       需要显示多少位
color           显示颜色
(五)、坐标的表达(代码示例)
/*以下为从之前的项目复制来的16*16的坐标代码*/
//标题行示例(16*16)
lcd_display_chinese(64,2,16,Hzk[1],1,WHITE);		//目
Lcd_display_chinese(80,2,16,Hzk[17],1,WHITE);		//录	

//整页示例(16*16)					
Lcd_display_chinese(0,2,16,Hzk[1],1,RED);		//时
Lcd_display_chinese(16,2,16,Hzk[17],1,RED);		//间
Lcd_display_chinese(32,2,16,Hzk[13],1,RED);		//设
lcd_display_chinese(48,2,16,Hzk[14],1,RED);		//置

lcd_display_chinese(0,4,16,Hzk[24],1,WHITE);	   //清
lcd_display_chinese(16,4,16,Hzk[25],1,WHITE);	   //除
lcd_display_chinese(32,4,16,Hzk[22],1,WHITE);	   //参
lcd_display_chinese(48,4,16,Hzk[23],1,WHITE);	   //数

lcd_display_chinese(0,6,16,Hzk[20],1,WHITE);	   //确
lcd_display_chinese(16,6,16,Hzk[21],1,WHITE);	   //定

lcd_display_chinese(128,6,16,Hzk[18],1,WHITE);	   //返
lcd_display_chinese(144,6,16,Hzk[19],1,WHITE);	   //回

//下面给出两行24*24示例
lcd_display_chinese(8,2,24,Hzk[1],1,BLACK);
lcd_display_chinese(32,5,24,Hzk[17],1,BLACK);

       同一行的字符计算坐标后按照UI中从左到右的顺序,自上而下摆放,并要在其后备注每一行对应的字符。

        具体来讲(以字符24*24为例),我要求同一行字符横向的显示区域左侧起始空8像素,右侧结尾也空8个像素,所以每行第一个字符的横坐标就是7(0+7);第二个就是(7+24);第三个就是(7+24+24),依此类推。映射到我们常用的16*16取模的话,按照我需要起始空8像素的要求,第一个字符的横坐标还是7;第二个变成了(7+16);第三个则变为(7+16+16)。

        在此总结一个横坐标的通项公式:X = 起始需要空出的像素 + 字符像素 *(N - 1);

       对于纵坐标的计算,我们还是以字符24*24为例讲解,屏幕的坐标系如图一所示。纵坐标的起始和横坐标有些许不同,因为单片机开发中常用的取模方式C51,是按照C的常量数组格式生成的,也就是大家耳熟能详的bit Ubit[8]。所以每列第一个字符的纵坐标就是2(2+0);第二个就是2+3;第三个就是2+3+3,依此类推。映射到我们常用的16*16取模的,第一个字符的纵坐标变为1;第二个变成了(1+2);第三个则变为(1+2+2)。

        总结一个纵坐标的通项公式:Y = [( 字符像素 / 8 )- 1] + ( 字符像素 / 8 )*(N - 1);

(六)、需要取模的字体

        这里就默认略过了,大家根据需求确定。

    建议:

       1.设计时想到但暂时没有用到的建议也先取了,后面可能会用到。

       2. 大小写字母、标点符号和数字建议和中文分开两个库分别取模。

(七)、字模摆放格式(代码规范)

/**这里是24*24的字符嗷**/
Hzk[][72] = {
						{0x00,0x10,0x18,0x18,0x18,0x08,0xF8,0xFC,0x0C,0x8E,0x8E,0x00,0x10,0x70,0xE0,0xE0,/*"科",0*/	0x00,0xFE,0xFE,0xFE,0x04,0x00,0x00,0x00,0x00,0x01,0x83,0xC1,0xF1,0x7F,0xFF,0xFF,		0x39,0xF1,0xF1,0x01,0x0C,0x3C,0xF8,0xB0,0x80,0xFF,0xFF,0xFF,0xE0,0x60,0x60,0x00,		0x04,0x06,0x07,0x01,0x00,0xF8,0xFF,0xFF,0x00,0x03,0x03,0x03,0x01,0x01,0x01,0x01,		0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00},	
			{0x00,0x40,0x40,0x40,0x40,0xFE,0xFE,0xFC,0x60,0x60,0x40,0x40,0x40,0x40,0xFE,0xFE,/*"技",1*/		0xFE,0x44,0x40,0x40,0x60,0x60,0x40,0x00,0x00,0x60,0x60,0x70,0x30,0xFF,0xFF,0xFF,		0x0C,0x0C,0x0C,0x18,0xF8,0xE8,0x8F,0x0F,0x0F,0xC8,0xF8,0xFC,0x38,0x00,0x00,0x00,		0x00,0x10,0x30,0x30,0x70,0x7F,0x7F,0x5F,0x40,0x60,0x60,0x30,0x30,0x1B,0x1F,0x0E,		0x1F,0x3F,0x39,0x70,0x70,0x60,0x20,0x20},
	}
/**上页字模的摆放格式与此相同,请仔细观察好后再摆放。本页两个字仅作示例。**/

三、页面设计(部分)

        写到这个地方懒得一行行敲了。。直接上图:

页面设计图1 标题居中

 页面设计图2 横竖居中

页面设计图3 除去最后一行居中 

这个教程到这里就结束了,如果有什么问题惠请大家在评论区提出,我会不定时回来看的。


网站公告

今日签到

点亮在社区的每一天
去签到