STM32 OLED 显示原理的讲解以及OLED显示汉字与图片的代码

STM 32 OLED 显示原理的讲解以及OLED显示汉字与图片的代码

本文主要涉及OLED显示原理的讲解以及OLED显示汉字与图片的代码。

文章目录

  • STM 32 OLED 显示原理的讲解以及OLED显示汉字与图片的代码
    • 一、 OLED简介
      • 1.1 OLED 的特点
      • 1.2 OLED 8080并行接口信号线说明
      • 1.3 OLED控制器SSD1306
      • 1.4 程序显存原理
      • 1.5 OLED 初始化过程
    • 二、OLED 初始化代码
      • 2.1 显示汉字与ASCII
      • 2.2 显示一个图片

一、 OLED简介

OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display,OELD) 。
OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。OLED显示技术具有自发光的特性,采用非常薄的有机材料涂层和玻璃基板,当有电流通过时,这些有机材料就会发光,而且OLED显示屏幕可视角度大,并且能够节省电能,从2003年开始这种显示设备在MP3播放器上得到了应用。
LCD都需要背光,而OLED不需要,因为它是自发光的。这样同样的显示,OLED效果要来得好一些。以目前的技术, OLED的尺寸还难以大型化,但是分辨率确可以做到很高。

1.1 OLED 的特点

  • 1、0.96 寸OLED 有黄蓝,白,蓝三种颜色可选;其中黄蓝是屏上1/4部分为黄光,下3/4 为蓝;而且是固定区域显示固定颜色,颜色和显示区域均不能修改;白光则为纯白,也就是黑底白字;蓝色则为纯蓝,也就是黑底蓝字。

  • 2、分辨率为128*64

  • 3、多种接口方式;OLED 裸屏总共种接口包括:6800、8080 两种并行接口方式、4线串行SPI 接口方式、IIC 接口方式(只需要2根线就可以控制 OLED 了!),这五种接口是通过屏上的BS0~BS2 来配置的。

1.2 OLED 8080并行接口信号线说明

  • CS:OLED片选信号。
  • WR:向OLED写入数据。
  • RD:从OLED读取数据。
  • D[7:0]:8位双向数据线。
  • RST(RES):硬复位 OLED。
  • DC: 命令/数据标志(0,读写命令;1,读写数据
    在这里插入图片描述

模块的8080并口读/写的过程为:
先根据要写入/读取的数据的类型,设置DC为高(数据)/低(命令),然后拉低片选,选中SSD1306,接着我们根据是读数据,还是要写数据置RD/WR为低,然后:
<1>、读数据:在RD上升沿,使数据锁存到数据线(D[7:0])上;
<2>、写数据:在WR上升沿,使数据写入到SSD1306里面;

并口写时序图
在这里插入图片描述

并口读时序图
在这里插入图片描述

1.3 OLED控制器SSD1306

OLED 模块显存:
SSD1306的显存总共为 12864bit 大小,SSD1306将这些显存分为8页 。每页包含了128个字节,总共8页,这样刚好是12804的点阵大小。
在这里插入图片描述

1.4 程序显存原理

在STM32的内部建立一个 缓存 (共128*8个字节),在每次修改的时候,只是修改STM32上的缓存 (实际上就是SRAM),在修改完了之后,一次性把STM32上的缓存数据写入到OLED的GRAM。
该方法也有坏处,就是对于那些SRAM很小的单片机(比如51系列)就比较麻烦了。
SSD1306 的命令
在这里插入图片描述

1、命令0X81:设置对比度。包含两个字节,第一个0X81为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。
2、命令0XAE/0XAF::0XAE为关闭显示命令;0XAF为开启显示命令。
3、命令0X8D:包含2个字节,第一个为命令字,第二个为设置值,第二个字节的BIT2表示电荷泵的开关状态,该位为1,则开启电荷泵,为0则关闭、在模块初始化的时候,这个必须要开启,否则是看不到屏幕显示的。
4、命令0XBO~B7:用于设置贡地址,其低三位的值对应着GRAM的页地址。
5、命令0X00~0X0F:用于设置显示时的起始列地址低四位。
6、命令0×10~0X1F:用于设置显示时的起始列地址高四位。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.5 OLED 初始化过程

在这里插入图片描述

二、OLED 初始化代码

/********通过IIC向OLED发送一个字节命令*********/
//参数:cmd 需要发送的命令
//返回值 :0 发送成功 非0发送失败
uint8_t Oled_Send_One_Byte_Cmd(uint8_t cmd)
{//1、发送起始信号Software_IIC_Start();//2、发送设备地址Software_IIC_Send_One_Byte_Data(OLED_SLAVE_ADDR); //设备地址最低位是0 表示写操作//3、等待从机响应  读应答if(Software_IIC_Read_ACK())  //如果从机没有应答 直接退出{Software_IIC_Stop();//退出之前 发送停止信号  结束总线占用return 1;}//4、指令模式Software_IIC_Send_One_Byte_Data(OLED_SLAVE_CMD);//5、读应答if(Software_IIC_Read_ACK())  //如果从机没有应答 直接退出{Software_IIC_Stop();//退出之前 发送停止信号  结束总线占用return 2;}//6、发送指令模式Software_IIC_Send_One_Byte_Data(cmd);//5、读应答if(Software_IIC_Read_ACK())  //如果从机没有应答 直接退出{Software_IIC_Stop();//退出之前 发送停止信号  结束总线占用return 3;}//8、发送停止信号  结束通信Software_IIC_Stop(); return 0;//成功  
}/********通过IIC向OLED发送一个字节数据*********/
//参数:Dat 需要发送的数据
//返回值 :0 发送成功 非0发送失败
uint8_t Oled_Send_One_Byte_DATA(uint8_t Dat)
{//1、发送起始信号Software_IIC_Start();//2、发送设备地址Software_IIC_Send_One_Byte_Data(OLED_SLAVE_ADDR); //设备地址最低位是0 表示写操作//3、等待从机响应  读应答if(Software_IIC_Read_ACK())  //如果从机没有应答 直接退出{Software_IIC_Stop();//退出之前 发送停止信号  结束总线占用return 1;}//4、数据模式Software_IIC_Send_One_Byte_Data(OLED_SLAVE_DATA);//5、读应答if(Software_IIC_Read_ACK())  //如果从机没有应答 直接退出{Software_IIC_Stop();//退出之前 发送停止信号  结束总线占用return 2;}//6、发送数据Software_IIC_Send_One_Byte_Data(Dat);//5、读应答if(Software_IIC_Read_ACK())  //如果从机没有应答 直接退出{Software_IIC_Stop();//退出之前 发送停止信号  结束总线占用return 3;}//8、发送停止信号  结束通信Software_IIC_Stop(); return 0;//成功  
}//填充缓存区中的数据
void OLed_Fill(unsigned char bmp_data)
{unsigned char y,x;for(y=0;y<8;y++)  {//设置PAGE地址 //b0 ~ b7Oled_Send_One_Byte_Cmd(0xb0+y); //页寻址只有最低三位有效 因为只有8页//然后就是B开头 多以第一页起始地址为b0//设置列地址Oled_Send_One_Byte_Cmd(0x00);  //列地址低位Oled_Send_One_Byte_Cmd(0x10); //列地址高位for(x=0;x<128;x++){Oled_Send_One_Byte_DATA(bmp_data);                               }} 
}//给OLED发送命令 初始化
void Oled_Init(void)
{Oled_Send_One_Byte_Cmd(0xAE);//--turn off oled panelOled_Send_One_Byte_Cmd(0x00);//---set low column addressOled_Send_One_Byte_Cmd(0x10);//---set high column addressOled_Send_One_Byte_Cmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)Oled_Send_One_Byte_Cmd(0x81);//--set contrast control registerOled_Send_One_Byte_Cmd(0xCF); // Set SEG Output Current BrightnessOled_Send_One_Byte_Cmd(0xA1);//--Set SEG/Column Mapping     0xa0???? 0xa1??Oled_Send_One_Byte_Cmd(0xC8);//Set COM/Row Scan Direction   0xc0???? 0xc8??Oled_Send_One_Byte_Cmd(0xA6);//--set normal displayOled_Send_One_Byte_Cmd(0xA8);//--set multiplex ratio(1 to 64)Oled_Send_One_Byte_Cmd(0x3f);//--1/64 dutyOled_Send_One_Byte_Cmd(0xD3);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)Oled_Send_One_Byte_Cmd(0x00);//-not offsetOled_Send_One_Byte_Cmd(0xd5);//--set display clock divide ratio/oscillator frequencyOled_Send_One_Byte_Cmd(0x80);//--set divide ratio, Set Clock as 100 Frames/SecOled_Send_One_Byte_Cmd(0xD9);//--set pre-charge periodOled_Send_One_Byte_Cmd(0xF1);//Set Pre-Charge as 15 Clocks & Discharge as 1 ClockOled_Send_One_Byte_Cmd(0xDA);//--set com pins hardware configurationOled_Send_One_Byte_Cmd(0x12);Oled_Send_One_Byte_Cmd(0xDB);//--set vcomhOled_Send_One_Byte_Cmd(0x40);//Set VCOM Deselect LevelOled_Send_One_Byte_Cmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)Oled_Send_One_Byte_Cmd(0x02);//Oled_Send_One_Byte_Cmd(0x8D);//--set Charge Pump enable/disableOled_Send_One_Byte_Cmd(0x14);//--set(0x10) disableOled_Send_One_Byte_Cmd(0xA4);// Disable Entire Display On (0xa4/0xa5)Oled_Send_One_Byte_Cmd(0xA6);// Disable Inverse Display On (0xa6/a7) Oled_Send_One_Byte_Cmd(0xAF);//--turn on oled panelOled_Send_One_Byte_Cmd(0xAF); /*display ON*/ OLed_Fill(0x00);//缓存区数据全为0
}//取消OLED初始化
void off_Init_OLed(void)
{Oled_Send_One_Byte_Cmd(0xAE);//--turn off oled panelOled_Send_One_Byte_Cmd(0x00);//---set low column addressOled_Send_One_Byte_Cmd(0x10);//---set high column addressOled_Send_One_Byte_Cmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)Oled_Send_One_Byte_Cmd(0x81);//--set contrast control registerOled_Send_One_Byte_Cmd(0xCF); // Set SEG Output Current BrightnessOled_Send_One_Byte_Cmd(0xA1);//--Set SEG/Column Mapping     0xa0???? 0xa1??Oled_Send_One_Byte_Cmd(0xC8);//Set COM/Row Scan Direction   0xc0???? 0xc8??Oled_Send_One_Byte_Cmd(0xA6);//--set normal displayOled_Send_One_Byte_Cmd(0xA8);//--set multiplex ratio(1 to 64)Oled_Send_One_Byte_Cmd(0x3f);//--1/64 dutyOled_Send_One_Byte_Cmd(0xD3);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)Oled_Send_One_Byte_Cmd(0x00);//-not offsetOled_Send_One_Byte_Cmd(0xd5);//--set display clock divide ratio/oscillator frequencyOled_Send_One_Byte_Cmd(0x80);//--set divide ratio, Set Clock as 100 Frames/SecOled_Send_One_Byte_Cmd(0xD9);//--set pre-charge periodOled_Send_One_Byte_Cmd(0xF1);//Set Pre-Charge as 15 Clocks & Discharge as 1 ClockOled_Send_One_Byte_Cmd(0xDA);//--set com pins hardware configurationOled_Send_One_Byte_Cmd(0x12);Oled_Send_One_Byte_Cmd(0xDB);//--set vcomhOled_Send_One_Byte_Cmd(0x40);//Set VCOM Deselect LevelOled_Send_One_Byte_Cmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)Oled_Send_One_Byte_Cmd(0x02);//Oled_Send_One_Byte_Cmd(0x8D);//--set Charge Pump enable/disableOled_Send_One_Byte_Cmd(0x14);//--set(0x10) disableOled_Send_One_Byte_Cmd(0xA4);// Disable Entire Display On (0xa4/0xa5)Oled_Send_One_Byte_Cmd(0xA6);// Disable Inverse Display On (0xa6/a7) Oled_Send_One_Byte_Cmd(0xAF);//--turn on oled panel 
}

2.1 显示汉字与ASCII


/***********
设置显示字符位置的函数
参数:x--> 列地址y--> 页地址 相当于行的(0-7)
返回值:无
************/
void OLed_SetPos(unsigned char x, unsigned char y)
{ Oled_Send_One_Byte_Cmd((0xb0+y));  //页的首地址 + y 偏移单位Oled_Send_One_Byte_Cmd(((x&0xf0)>>4)|0x10);  //列地址高位 Oled_Send_One_Byte_Cmd((x&0x0f)|0x00);   //列地址低位
}/****************
在指定位置显示一个汉字,显示一个汉字时,
参数: x 显示位置,每次递增16个bity 显示位置,每次递增2页 16bitbuf 需要显示的字符字模
返回值:无
****************/
void OLed_ShowChina(uint8_t x,uint8_t y,uint8_t *buf)
{uint8_t i = 0;OLed_SetPos(x,y);for(i=0;i<16;i++)  { Oled_Send_One_Byte_DATA(buf[i]);}OLed_SetPos(x,(y+1));for(i=0;i<16;i++)  { Oled_Send_One_Byte_DATA(buf[i+16]);}
}//在指定位置显示ASCLL字符
void OLed_ShowASCII(uint8_t x, uint8_t y,char *str)
{uint8_t i = 0;char *pstr = str;while(*pstr){OLed_SetPos(x,y);for(i=0;i<8;i++)  { Oled_Send_One_Byte_DATA(F8X16[((*pstr)-32)*16+i]);}OLed_SetPos(x,y+1);for(i=0;i<8;i++)  { Oled_Send_One_Byte_DATA(F8X16[((*pstr)-32)*16+8+i]);}pstr++;x +=8;} 
}/*******
在指定的位置显示连续的文字 "中国"
*******/
void OLed_ShowTest(unsigned char x,unsigned char y)
{uint8_t i = 0;OLed_SetPos(x,y);for(i=0;i<16;i++)  { Oled_Send_One_Byte_DATA(fbuf1[i]);}OLed_SetPos(x,(y+1));for(i=0;i<16;i++)  { Oled_Send_One_Byte_DATA(fbuf2[i]);}OLed_SetPos((x+16),y);for(i=0;i<16;i++)  { Oled_Send_One_Byte_DATA(fbuf3[i]);}OLed_SetPos((x+16),(y+1));for(i=0;i<16;i++)  { Oled_Send_One_Byte_DATA(fbuf4[i]);} 
}//显示温度和 湿度
void OLed_ShowTemp(void)
{//第1行显示温度OLed_ShowChina(0,0,HZ1);OLed_ShowChina(16,0,HZ2);//第2行显示湿度OLed_ShowChina(0,2,HZ3);OLed_ShowChina(16,2,HZ2);
}//显示 距离
void OLed_ShowDist(void)
{//第二行显示距离OLed_ShowChina(0,4,HZ4);OLed_ShowChina(16,4,HZ5);
}//显示 关照
void OLed_ShowLight(void)
{//第二行显示光照OLed_ShowChina(0,6,HZ6);OLed_ShowChina(16,6,HZ7);
}

2.2 显示一个图片

//显示一张图片 HQYJ
void Oled_Show_BGM_HQYJ(void)
{unsigned char y,x;unsigned char *str = HQYJ;for(y=0;y<8;y++)  {//设置PAGE地址 //b0 ~ b7Oled_Send_One_Byte_Cmd(0xb0+y); //页寻址只有最低三位有效 因为只有8页//然后就是B开头 多以第一页起始地址为b0//设置列地址Oled_Send_One_Byte_Cmd(0x00);  //列地址低位Oled_Send_One_Byte_Cmd(0x10); //列地址高位for(x=0;x<128;x++){Oled_Send_One_Byte_DATA(*str);str++;}} 
}

关于上面的工程,大家可以在我的gitee上面去拉,在master分支下的单片机课设工程中04-OLED显示DHT11的数据,工程下载地址

工程实现效果图:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE5 runtime模式下自定义视口大小和位置并跟随分辨率自适应缩放

本文旨在解决因UI问题导致屏幕中心位置不对的问题 处理前的现象&#xff1a;如果四周UI透明度都为1&#xff0c;那么方块的位置就不太对&#xff0c;没在中心 处理后的现象&#xff1a; 解决办法&#xff1a;自定义大小和视口偏移 创建一个基于子系统的类或者蓝图函数库(什么类…

使用opencv实现图像中几何图形检测

1 几何图形检测介绍 1.1 轮廓(contours) 什么是轮廓&#xff0c;简单说轮廓就是一些列点相连组成形状、它们拥有同样的颜色、轮廓发现在图像的对象分析、对象检测等方面是非常有用的工具&#xff0c;在OpenCV 中使用轮廓发现相关函数时候要求输入图像是二值图像&#xff0c;这…

Apache Tomcat httpoxy 安全漏洞 CVE-2016-5388 已亲自复现

Apache Tomcat httpoxy 安全漏洞 CVE-2016-5388 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用修复建议 总结 漏洞名称 漏洞描述 在Apache Tomcat中发现了一个被归类为关键的漏洞&#xff0c;该漏洞在8.5.4(Application Server Soft ware)以下。受影响的是组…

Windows下安装MongoDB实践总结

本文记录Windows环境下的MongoDB安装与使用总结。 【1】官网下载 官网下载地址&#xff1a;Download MongoDB Community Server | MongoDB 这里可以选择下载zip或者msi&#xff0c;zip是解压后自己配置&#xff0c;msi是傻瓜式一键安装。这里我们分别对比进行实践。 【2】ZI…

车载V2X方案的选型分享

ACX200T面向 5G车联网C-V2X 应用的安全芯片&#xff0c;满足V2X场景下消息认证的专用安全芯片&#xff0c;该款芯片采用公司自主的 高速硬件加密引擎 &#xff0c;支 持国家标准SM1、SM2、SM3、SM4密码算法&#xff0c;同时支持国际ECDSA、AES、SHA-1密码算法。可实现网联汽车云…

使用包、Crate 和模块管理项目(下)

1、使用 use 关键字将路径引入作用域 在之前的示例中我们引用模块中的函数或者结构体之类的&#xff0c;都是需要用到相对路径或者绝对路径去引用&#xff0c;然尔在这里&#xff0c;有一种方法可以简化这个过程。我们可以使用 use 关键字创建一个短路径&#xff0c;然后就可以…

云原生扫盲篇

What 云原生加速了应用系统与基础设施资源之间的解耦,向下封装资源以便将复杂性下沉到基础设施层;向上支撑应用,让开发者更关注业务价值 云原生是一种构建和运行应用程序的方法,也是一套技术体系和方法论. Cloud 表示应用程序位于云中而不是传统的数据中心Native表示应用程序从…

C# NPOI导出datatable----Excel模板画图表

1、创建Excel模板 2、安装NPOI管理包 3、创建工作簿 &#xff08;XLSX和XLS步骤一样&#xff0c;以XLS为例&#xff09; IWorkbook workbook null; string time DateTime.Now.ToString("yyyyMMddHHmmss"); string excelTempPath Application.StartupPath "…

Apache Pulsar 技术系列 - PulsarClient 实现解析

导语 Apache Pulsar 是一个多租户、高性能的服务间消息传输解决方案&#xff0c;支持多租户、低延时、读写分离、跨地域复制&#xff08;GEO replication&#xff09;、快速扩容、灵活容错等特性。同时为了达到高性能&#xff0c;低延时、高可用&#xff0c;Pulsar 在客户端也…

快速从图中提取曲线坐标数据的在线工具WebPlotDigitizer

快速从图中提取曲线坐标数据的在线工具WebPlotDigitizer 1 介绍2 WebPlotDigitizer在线版的使用2.1 上传图像2.2 点击横纵坐标点&#xff1a;2.3 选择曲线 3 查看数据参考 1 介绍 写论文时要对比别人曲线图、点图、柱形图的数据&#xff0c;但是只有图没有原始数据怎么办&…

最新国内可用使用GPT4.0,GPT语音对话,Midjourney绘画,DALL-E3文生图

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和用户进行创作交流。 然而&#xff0c;GP…

【优化】XXLJOB修改为使用虚拟线程

【优化】XXLJOB修改为使用虚拟线程 新建这几个目录 类&#xff0c; 去找项目对应的xxljob的源码 主要是将 new Thread 改为 虚拟线程 Thread.ofVirtual().name("VT").unstarted 以下代码是 xxljob 2.3.0版本 举一反三 去修改对应版本的代码 <!-- 定…

计算机基础以及实施运维工程师的介绍

目录 什么是实施、运维工程师 实施工程师 实施工程师的职责 什么是运维工程师 运维功工程师的职责 需要的技术 计算机的介绍 CPU 存储器 IO 系统总线 主板 BIOS 什么是实施、运维工程师 实施工程师 纯实施工程师是指在工程项目实施阶段专门负责实施工作的工程师。与其他…

大模型赋能“AI+电商”,景联文科技提供高质量电商场景数据

据新闻报道&#xff0c;阿里巴巴旗下淘天集团和国际数字商业集团都已建立完整的AI团队。 淘天集团已经推出模特图智能生成、官方客服机器人、万相台无界版等AI工具&#xff0c;训练出了自己的大模型产品 “星辰”&#xff1b; 阿里国际商业集团已成立AI Business&#xff0c;…

Gazebo GUI模型编辑器

模型编辑器 现在我们将构建我们的简单机器人。我们将制作一个轮式车辆&#xff0c;并添加一个传感器&#xff0c;使我们能够让机器人跟随一个斑点&#xff08;人&#xff09;。 模型编辑器允许我们直接在图形用户界面 &#xff08;GUI&#xff09; 中构建简单的模型。对于更复…

在使用mapstruct,想忽略掉List<DTO>字段里面的,`data` 字段的映射, 如何写ignore: 使用@IterableMapping

在使用mapstruct,想忽略掉List字段里面的,data 字段的映射, 如何写ignore 代码如下: public interface AssigmentFileMapper {AssigmentFileDTO assigmentFileToAssigmentFileDTO(AssigmentFile assigmentFile);AssigmentFile assigmentFileDTOToAssigmentFile(Assigment…

用全志R128复刻自平衡赛车机器人,还实现了三种不同的操控方式

经常翻车的朋友们都知道&#xff0c;能在翻车后快速摆正车身的车才是好车。 就像动画《四驱兄弟》中展现的那样&#xff0c;在比赛中需要跟着赛车一起跑圈&#xff0c;而且赛车如果被撞翻还需要重新用手扶正&#xff0c;所浪费的时间非常影响比赛结果。 如果小豪和小烈可以拥有…

flutter自定义地图Marker完美展示图片

世人都说雪景美 寒风冻脚无人疼 只道是一身正气 结论 参考Flutter集成高德地图并添加自定义Maker先实现自定义Marker。如果自定义Marker中用到了图片&#xff0c;那么会碰到图片没有被绘制到Marker的问题&#xff0c;此时需要通过precacheImage来预加载图片&#xff0c;从而解…

智能化创作与艺术:发展、问题、未来趋势

导言 随着人工智能技术的不断进步&#xff0c;智能化创作在艺术领域逐渐崭露头角。本文将深入研究智能化创作与艺术的发展过程、遇到的问题、解决的过程&#xff0c;探讨未来的可用范围&#xff0c;并分析在各国的应用和未来的研究趋势。最后&#xff0c;探讨在哪些方面能取胜&…

一. 模块之间的依赖 ------ 详细解析官网购物应用优秀案例(鸿蒙开发)

一. 项目目录简介 ├──**common** // 公共能力层 │ ├──components │ │ ├──CommodityList.ets // 商品列表组件 │ │ ├──CounterProduct.ets // 数量加减组件 │ │ └──EmptyComponent.ets /…