自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

feiffer·hu的博客

MCU、Linux、BSP、sensor

  • 博客(135)
  • 资源 (1)
  • 问答 (2)
  • 收藏
  • 关注

原创 单片机C51 之(11)GPIO 显示 -- LCD12864

在之前的文章中讲到了显示器件–LCD1602,但是1602的缺点比较严重:1、仅有两行显示。2、仅能显示字符,不能显示汉字。12864是12864点阵液晶模块,其本质跟1602类似,只不过点阵数更多而已,可显示四行信息,单字符16,汉字8个。带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个1616点汉字,和128个16*8点ASCII字符集。利用该模块灵活的接口方式和简单、

2021-10-03 16:46:32 6272

转载 内存管理 内核内存检测KASAN

一、简介:         Kasan 是 Kernel Address Sanitizer 的缩写,它是一个动态检测内存错误的工具,主要功能是检查内存越界访问和使用已释放的内存等问题。KASAN可以检测的内存异常包括:slab-out-of-bounds/user-after-free/stack-out-of-bounds/global-out-of-bounds等。 ...

2021-05-12 10:45:07 825

转载 Linux内核KASAN内存检测原理

KASAN实现原理 KASAN实现原理1. 前言KASAN是一个动态检测内存错误的工具。KASAN可以检测全局变量、栈、堆分配的内存发生越界访问等问题。功能比SLUB DEBUG齐全并且支持实时检测。越界访问的严重性和危害性通过我之前的文章(SLUB DEBUG技术)应该有所了解。正是由于SLUB DEBUG缺陷,因此我们需要一种更加强大的检测工具。难道你不想吗?KASAN就是其中一种。KASAN的使用真的很简单。但是我是一个追求刨根问底的人。仅仅止步于使用的层面,我是不愿意的,只有更清楚的了解实现

2021-05-12 09:51:40 1319

原创 单片机C51 之(10)GPIO 显示 -- LCD1602

在之前的文章中讲到了显示器件–数码管,但是数码管两个缺点比较严重:1、显示单一、体积大,显示复杂内容时就相形见绌了。2、动态显示时序要求高,对于单片机但线程MCU来说很容易出现显示闪烁等问题。LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路及其扩展驱动电路,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。不同厂家生产的LCD1602芯片可能有所不同,但使用方法都是一样的。点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64

2021-04-11 19:02:56 9630 6

原创 单片机C51 之(9)GPIO按键--矩阵键盘

之前在 单片机C51 之(6)GPIO按键–基础应用 中说到,按键作为单片机最简单的输入设备,简单实用。一个单独的按键使用需要一个GPIO相连 扫描 电平的变化,从而相应对于的操作。但是如果一个系统中需要用到多个按键的时候怎么办呢?就像数码管一样,该如何解决多个按键输入问题?这里就引入矩阵键盘的概念:键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键

2021-04-11 17:18:41 2030

原创 单片机C51 之(8)GPIO 显示 -- 数码管--动态扫描

一个数码管就占用控制器8个管脚,如果4位就需要32个管脚,显然静态显示方法在实际使用中是有很大的缺陷。51单片机4组GPIO可以驱动4个数码管,那如果多个呢?这里就引入动态扫描的概念:根据视觉暂留现象的表现,只要切换速度达到一定的频率之后,人是分辨不出来的,就像人看不见子弹飞过一样。同理如果让每个数码管轮流显示,而不是全部显示。利用视觉暂留现象,人类是不会发现哪个数码管没有显示的。只要切换速度过快,就可以解决静态显示带来过度占用GPIO的问题。这样将所有的公共端用GPIO控制,不再像静态显示那样,公

2021-04-06 21:22:46 1098 2

原创 单片机C51 之(7)GPIO 显示 -- 数码管--静态GPIO驱动

数码管的一种是半导体发光器件,数码管可分为七段数码管和八段数码管,区别在于八段数码管比七段数码管多一个用于显示小数点的发光二极管单元DP(decimal point),可以理解成几个LED按照一定的位置摆放在一起的一个器件而已,包括类似于“米”型的数码管原理都是类似的,以及后面的点阵等。按照连接方式 分为共阴与共阳。由于51 单片机GPIO默认是高电平、GPIO的电流驱动力有限,所以一般使用共阳比较多。显示不同的数字,就是上不同位置的LED亮起来:#include <reg51.h>

2021-04-06 20:57:57 826

原创 单片机C51 之(6)GPIO按键--基础应用

按键作为在单片机系统中,最简单的、常用的输入之一。常用的机械弹性按键,也是比较便宜的,单片机最小系统里面使用的一般是这种,根据封装、尺寸分为很多型号。但基本机械原理都是类似的:按下时接通或断开电路,释放后状态即复原。简单的使用1、按下灯亮、松手灯灭:#include <reg51.h>sbit key = P2^0; //按键硬件绑定P2口0引脚void main(){ for( ; ; ) { if(key == 0){ //由于51单片机GPIO默认状态是高电平

2021-04-06 20:25:53 1524

原创 单片机C51 之(5)GPIO流水灯

流水灯是若干个灯泡依次点亮,视觉上感觉到灯光在流动就叫做流水灯。选用单片机的P0端口8只引脚作为输出脚,1只引脚控制1只LED灯。设置P0_0脚为低电平,使得第1只LED灯点亮,并延时一点时间,然后设置P0_0脚为高电平,熄灭第1只LED,以此同理控制其余7只引脚。比如:P0_0脚为低电平,使得第1只LED灯点亮P0_1脚为低电平,使得第2只LED灯点亮P0_2脚为低电平,使得第3只LED灯点亮P0_3脚为低电平,使得第4只LED灯点亮P0_4脚为低电平,使得第5只LED灯点亮P0_5脚为低

2020-06-14 19:04:45 2822

原创 单片机C51 之(4)GPIO闪烁灯

流水灯是若干个灯泡依次点亮,视觉上感觉到灯光在流动就叫做流水灯。选用单片机的P0端口8只引脚作为输出脚,1只引脚控制1只LED灯。设置P0_0脚为低电平,使得第1只LED灯点亮,并延时一点时间,然后设置P0_0脚为高电平,熄灭第1只LED,以此同理控制其余7只引脚。比如:P0_0脚为低电平,使得第1只LED灯点亮P0_1脚为低电平,使得第2只LED灯点亮P0_2脚为低电平,使得第3只LED灯点亮P0_3脚为低电平,使得第4只LED灯点亮P0_4脚为低电平,使得第5只LED灯点亮P0_5脚为低

2020-06-14 18:45:18 1165

原创 单片机C51 之(3)GPIO点亮LED

原理主控芯片和流水灯模块的原理图LED接在单片机的P0口,由原理图可以知道,在P00口给一个低电平即可点亮LED灯。相反,如果要LED灯熄灭,就要把P0口的电平变为高电平即可。#include<reg52.h> //包含特殊功能寄存器定义的头文件sbit LED = P0^0; //位地址声明,注意: sbit 必须小写、 P 大写!void main()//任何一个 C 程序都必须有且仅有一个 main 函数{ LED = 0; //LED=0, ==》 P00=0

2020-06-14 17:59:19 1599

原创 单片机C51 之(2)GPIO简介

单片机最小系统单片机最小系统,也叫做单片机最小应用系统,是用最少的原件组成单片机可以工作的系统。单片机最小系统的三要素就是电源、晶振、复位电路LED灯发光二极管是二极管中的一种,因此和普通二极管一样,这个二极管也有阴极和阳极,习惯上也称之为负极和正极。方向必须接对了才会有电流通过让 LED 小灯发光。由于电源从正极到负极有电压差,并且电路是导通的,所以就会有电流通过, LED小灯因为有了电流通过,所以就会直接发光。刚才提到了我们接入的 VCC 电压是 5V,发光二极管自身压降大概是 2V,那

2020-06-14 11:26:24 6078

原创 单片机C51 之(1)简介

单片机最小系统单片机最小系统,也叫做单片机最小应用系统,是用最少的原件组成单片机可以工作的系统。单片机最小系统的三要素就是电源、晶振、复位电路LED灯发光二极管是二极管中的一种,因此和普通二极管一样,这个二极管也有阴极和阳极,习惯上也称之为负极和正极。方向必须接对了才会有电流通过让 LED 小灯发光。由于电源从正极到负极有电压差,并且电路是导通的,所以就会有电流通过, LED小灯因为有了电流通过,所以就会直接发光。刚才提到了我们接入的 VCC 电压是 5V,发光二极管自身压降大概是 2V,那么

2020-06-13 19:52:21 8203

原创 单片机C51 之(0)keil与Proteus8.6安装及简介

软件下载keil网盘下载链接:https://pan.baidu.com/s/1aEFMy6oS6OzBHm3Wl6_EFg提取码:4k59Proteus8.6下载链接:https://pan.baidu.com/s/1KjjLSI6xDVncps7zUgnFFA提取码:vsjwkeil安装1、下载这三个文件2、解压前两个文件3、点击安装4、安装5、记住这个地址6、随便填7、安装好之后,到安装目录下查看。是否有 C51 这文件,如果没有进行7.1-7.3.如果有就跳

2020-06-13 19:04:42 1349 10

原创 10.14、驱动开发 -- input子系统

input子系统简介1、 Input驱动程序是linux输入设备的驱动程序,分成游戏杆(joystick)、鼠标(mouse和mice)、事件设备(event)。其中事件驱动程序是目前通用的驱动程序,可支持键盘、鼠标、触摸屏等多种输入设备。2、 输入子系统驱动分成三层3、 input驱动程序的主设备号是13、次设备号的分布如下:a) joystick游戏杆:0~16b) mouse鼠标: 32~62c) mice鼠标: 63d) 事件设备: 64~954、 2.6内核中定义的支持的类型#

2020-06-13 17:30:59 381

原创 10.13、驱动开发 -- spi总线

SPI英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如AT91RM9200.SP

2020-06-13 17:13:46 647

原创 10.12、驱动开发 -- i2c总线

I2C协议2条双向串行线,一条数据线SDA,一条时钟线SCL。SDA传输数据是大端传输,每次传输8bit,即一字节。支持多主控(multimastering),任何时间点只能有一个主控。总线上每个设备都有自己的一个addr,共7个bit,广播地址全0.系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯片而定,看datasheet。I2C位传输数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit;若SDA发生跳变,则用来表示一个会话的开始或结束(后面讲..

2020-06-13 17:02:22 405

原创 10.11、驱动开发 -- platform总线与字符设备

总线: 1:n 设备 驱动分离dts 代码如何识别一个属性,属于驱动还是属于设备中断 --设备驱动对象—驱动如果每个硬件都拥有 一个不同的属性,那么该属性属于 硬件/设备硬件专有的东西,放在 私有数据里面 dev_pri , 设备树如果 所有的硬件,都拥有相同的属性, 那么该属性 属于 驱动驱动拥有的东西, 放在全部变量即可.如果你想 将字符设备 融入 总线, 你需要 区分 字符设备中,那些属于驱动,那么属于设备1.设备号主设备号[] 驱动次设备号 设备2.字符设备对象 设备3.cl

2020-06-13 16:39:32 953

原创 10.10、驱动开发 -- platform总线

基本概念平台总线三要素:平台总线、平台设备、平台驱动平台总线原则:先分离,后合并分离:将设备信息封装成 platform_device,将驱动信息封装成 platform_driver,并为各自起名称,然后将 platform_device 中的 struct device 和 platform_driver 中的 struct device_driver 分别注册到设备链表和驱动链表中。int platform_device_register(struct platform_device *p

2020-06-13 16:33:06 454 1

原创 10.9、驱动开发 -- 内存

MMU内存管理单元memory manage unit内存 管理 单元内核/用户看到的都是虚拟地址, 物理RAM使用的是 物理地址.内核中空间分配:1、usrvoid *malloc(int size)当系统无法满足你的请求大小的时候, 进程会在 malloc内部睡眠.当资源满足的时候,进程被唤醒.2、kernelvoid *kmalloc(size_t size,gfp_t flags) flags: GFP_KERNEL: 告诉内核,当前环境可以睡眠, 如果你申请的空间...

2020-06-09 22:32:37 148

原创 10.8、驱动开发 -- 系统时钟

时间:绝对时间: 2020.6.9 23:59:59相对时间: 时间计量取决于 参考点 相对时间内核是如何计时:int jiffies; 一开机jiffies=0, 每隔一定的时间jiffies++;一秒钟,jiffies累加多少次呢??? 精确度(不高)x86 1000次/s 每次1ms 1msARM9 100次/s 10ms 10msARM-A53 200-500次/s不同的cpu 一秒钟jiffies累加的次数,是不确定的. 为了统一,内核 定义了 HZ这个宏.HZ 表示, 当...

2020-06-09 22:24:40 313

原创 10.7、驱动开发 -- 中断

软件和硬件交互方式:轮询: 软件主动反复的去读取硬件寄存器 效率很低,做很多无用功,浪费CPU资源中断: 硬件主动通知软件,发生了事件!!!硬件创建一个按键中断修改设备树文件:vim arch/arm/boot/dts/exynos4412-fs4412.dts1、添加 key2node{ compatible = "key 2"; interrupt-parent = <&gpx1>; //在gpx1 interrupts = <1 2&g.

2020-06-06 17:32:22 322

原创 10.6、驱动开发 -- IO模型、阻塞与非阻塞、同步与异步

IO模型: 一种通信的模型IO, input output 其实就是 ###通信####为了解决#通信#过程中,出现的问题.IO模型: 网络编程阻塞一个运行的进程 去访问资源,发现资源不满足,于是进程 ## 主动睡眠## 等待资源满足,被唤醒.当资源(一般伴随中断)到来的时候, (中断)去唤醒等待的进程.##睡眠###,不消耗定义并初始化一个##等待队列###运行的进程发现资源不满足, 主动将自己挂载到等待队列上去. 然后让内核重新调度.某个执行单元将数据送达, 然后唤醒等待.

2020-06-05 18:17:16 283

原创 10.5、驱动开发 -- 内核同步

内核的 同步/并发 /竞态/锁竞态: 多个执行单元,同时访问 同一个资源,会造成 竞争状态.生活中的例子:我们使用锁 来解决 同时访问的问题.在访问之前,加锁 锁可以保护 资源一个时刻,只被一个进程访问访问在访问完之后,解锁计算机中,多个执行单元1.SMP 对称多处理器 说白了,就是 一个cpu有多个核.2. 进程的抢占 一个进程会抢占另一个进程的执行. 单核处理一样出问题3. 中断/中断下半部分 抢占进程.内核中的锁:1、原子变量: i++有三条汇编指令构成,如果多个线程同时执行i+

2020-06-05 17:54:13 139

原创 10.4、驱动开发 -- 字符设备

一、基本概念linux系统,一切皆文件,字符设备就是实现一切皆文件,用户可以通过访问文件的方式,来访问硬件/内核。驱动:硬件 = 1:n 一个驱动程序,可以管理很多硬件给驱动程序 分配一个主设备号, 给该驱动管理的每个硬件 分配一个次设备号。同一类硬件,使用相同的驱动,所以 拥有相同的主设备号。设备号devno,请求取 主设备major, 次设备号minor:major = devno >> 20;minor = devno<<12>.

2020-06-05 17:46:16 286

原创 10.3、驱动开发 -- 内核模块

内核模块如果将驱动程序 融入到内核源码中, 当驱动修改的时候,内核需要重新编译,重新烧写!!!内核模块机制: 允许 驱动程序和操作系统分离. 将驱动程序写入写入模块内部, 模块可以动态的加入内核,或者动态的离开内核. 动态: 操作系统运行的时候. 优点: 大部分功能都喜欢写入模块!!!内核只需要保留最基本的功能,需要某个功能的时候,将他的模块动态的加进来.不需要的删除.模块的编写modules.c文件/*************

2020-06-05 17:30:01 252

原创 10.2、驱动开发 -- 一切皆文件

一切皆文件:一切硬件都是文件

2020-06-05 17:18:37 259

原创 10.1、驱动开发 -- C语言面向对象设计

面向对象的思想对象:凡是占据一定空间的事物,世界是对象之间的交互而进行的.类:不占空间,是 对象的抽象概念对象: 属性[静态] + 动作/方法/函数[动态]面向对象特性封装: 包装,将对象的 属性和方法 打包在一起,形成一个 类class cat { char name[32]; int weight; ........... void maimeng(void); .......

2020-06-05 17:15:14 598

原创 9.4、系统移植 -- 文件系统

文件系统:是一种最原始的界面:最初 用户都是操作文件系统来实现自己的功能,包括 放歌 看电影 娱乐因为在linux世界,一切皆文件. linux把所有的硬件都抽象为 对文件的读写 。内容:命令 配置文件 库文件 普通文件目录结构:bin-存放系统命令sbin-存放命令的etc-存放系统配置文件tmp 临时文件var: variable 可变的, 日志lib :库文件mnt : 系统推荐的挂载点usr: 存放你的 代码 ..

2020-06-05 16:55:15 266

原创 9.3、系统移植 -- 操作系统

os operation systemUbuntu 完整版os, 在内核的基础上增加 UI office套件 工具集 …板子os 内核[kernel] 没有图形界面kernel uImage [内核的 安装程序] 1.1M—>3.5M 我们的开发基于kernelUbuntu ISO [是完整版os的镜像,就是安装程序] 3.5G内核的源码如何得到源码: 从芯片

2020-06-05 16:44:36 213

原创 9.2、系统移植 -- BootLoader

为什么需要bootloader 实现双系统 刷机 配置CPU 升级操作系统 U盘系统bootloader 目的,加载OS 是一类 软件的统称设备: bootloader os fs你可以把bootloader当成 一个 单任务的 单片机程序启动CPU --> 硬件初始化 --> [交互模式] --> 加载OS过程:汇编[开机启动 -->核心硬件初始化(串口 flash RAM

2020-06-05 16:34:53 366

原创 9.1、系统移植 -- 基本概念

系统移植 CPMS 最相近的系统,修修改改 使之能够运行新的板子上驱动开发 开发硬件的驱动,让操作系统能够使用该硬件低端嵌入式 遥控器 温湿度传感器 智能小车 — 单任务 无应用 裸数据存储高端嵌入式 路由器 手机 平板 机器人 行车记录仪 监控摄像头 — 多任务 应用 文件c lib就是对系统调用syscall的封装.usr app ->c lib ->syscall - > os - &

2020-06-05 16:17:42 668

原创 8.9、ARM接口编程 -- ADC

模拟电路:模拟量数字电路:数字量模拟-》数字 ADCADC 4 CH 位数10bit/12bit参考电压 1.8量程 0-1.8V电位器 - XadcAIN3电压测量ADC配置:ADCCON[16] = 1 12位ADC[15] 只读标志, 1 表示转换完成 0 正在转换[14] = 1 使能ADC[13:6] = 26 预分频值 F=133M 133M/ 26 5M[2] = 0 使能ADC正常工作模式[1] = 0 不使能..

2020-06-05 16:02:04 387

原创 8.8、ARM接口编程 -- PWM

PWM 脉宽调制器:方波:占空比:有效电平占整个周期的比值。周期和频率:使用PWM,输出50HZ 波形蜂鸣器 GPD0_0 PWM0F = 100Mhz1、 配置PWM0TCFG0:[7:0] = 预分频寄存器 0-255 0xffTCFG1:[3:0] = 固定分频 1 2 4 8 16 0x4TCON:[4] = 0 不使能死区[3] = 1 使能自动重载[2] = 1 打开输出使能[1] = 1 手动更新 tcmpb tcntb[..

2020-06-05 15:57:31 337

原创 8.7、ARM接口编程 -- 看门狗

看门狗当程序异常(死机),可以自动重启。看门狗定时器WTCON 预分频寄存器[15:8] = 0xff 对总线时钟做除法,降低频率[5] =1 启用wdt[4:3] = 3 固定分频[2] = 1 使能中断[0] = 1 使能复位信号WTDAT 重载寄存器 [15:0]WTCNT [15:0] 减法计数寄存器 = 15259WTCLRINT 中断清除寄存器1、定时5S?系统时钟 100M100M/128 / (255+1)计数15

2020-06-05 15:53:24 435

原创 8.6、ARM接口编程 -- 中断GIC

irq 中断异常 中断信号线:irq fiq中断源: 中断信号的来源,芯片内部的控制器,芯片外部,外部中断中断控制器:GIC管理这些中断源,中断扩展管理中断的优先级管理中断源,报告中断ID管理中断的响应,屏蔽某些中断记录中断,中断挂起外部中断K2 GPX1_1 按下 0 弹起 1GIC中断源表: 中断源 与 中断ID 和GIC管脚 一一对应1、配置GPIO : GPX1_1 K2GPX1CON [7:4] = 0xf 配置GPX1..

2020-06-05 15:47:33 803

原创 8.5、ARM接口编程 -- UART

串口使用1、会看电路图2、分析电路结构//清楚器件和控制器的工作原理3、查芯片手册,操作寄存器uartrx -》 GPA1_0tx -》 GPA1_1 CH2寄存器配置1、配置GPIO控制器:GPA1CON[3:0] = 0x2[7:4] = 0x2[7:0] = 0x22 设置管脚 A1_0 A1_1 为串口工作模式2、串口控制器:ULCON2 0x13820000[6] = 0 正常模式[5:3]= 000 无校验[2] =

2020-06-05 15:40:17 300

原创 8.4、ARM接口编程 -- GPIO

接口编程接口编程的环境 交叉编译环境 arm-gcc软件如何控制和驱动硬件(外部设备和外部控制器)1、会看电路图:(1),根据电路图找硬件(2),根据硬件找电路图2、工程文件start.s 启动文件map.lds 链接控制文件main.c C入口文件Makefile 工程文件管理器配置文件4412.h 头文件寄存器:软件和硬件的接口GPIOGPA0CON — 配置寄存器GPA0DAT — 数据寄存器当您将端口配置为输

2020-06-05 15:36:15 281

原创 8.3、ARM汇编

.text @代码段开始 汇编符号,编译时不会生成机器码.data @从此处开始,是数据段,程序有读写权限汇编指令 每条指令对应一条机器码ARM指令集: 精简处理器指令集1、长度固定 arm指令 4字节2、大部分指令为单周期执行3、全部都可以条件执行ARM汇编文件编写:1、汇编符号2、指令3、伪指令字节 8bit char半字 2字节 short字 4字节 int双字 8字节 double.

2020-06-05 15:31:27 432

原创 8.2、ARM CPU

ARM处理器分类cortex-M 单片机 低端 低功耗 传感器 stm 32cortex-R 实时性要求高的场合。无人机 汽车 实时性操作系统cortex-A 多媒体应用 图形图像采集,高端应用 带操作系统ARMCPU核心结构1、运算器 运算2、控制器3、寄存器 是硬件与软件的接口 CPU留给用户的接口寄存器1、通用寄存器 r0-r122、特殊功能寄存器r13 sp 栈指针寄存器 C语言运行基本条件r14

2020-06-05 15:13:30 1102

简易Notepad QT实现.7z

使用C++开发简易notepad++,具有打开、新建、修改文件的功劳,类似于一个记事本。基于qt的MainWindow开发。

2020-06-05

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除