早期编程的乐趣现在很多人已经体会不到了。那个内存按KB算、主频按MHz算的年代写代码是一件极其克制的事情——每一行都要算计着用每一个字节都要抠着花。Microsoft BASIC M6502 就是那个时代的产物它跑在6502处理器上内存往往只有几KB到几十KB却撑起了无数人第一次接触编程的体验。这个标题里的“10个经典小程序”说白了就是当年那批人用最朴素的语句写出来的小玩意打印图案、算数学题、猜数字、模拟骰子、画简单图形。它们不复杂但每一个都能让你把BASIC的核心语句吃透。这篇文章适合两类人一类是对早期计算机历史好奇、想动手跑一跑老代码的爱好者另一类是刚学编程、想用最小成本理解“程序到底在干什么”的新手。我会把这10个小程序逐个拆开讲清楚它们为什么这么写、当年为什么只能这么写以及放到今天你该怎么复现和改造。1. 先搞清楚我们在玩什么M6502 与 Microsoft BASIC 的底子1.1 6502 这颗芯片为什么值得单独说6502 是一颗8位处理器1975年前后进入市场寄存器少、寻址方式朴素但价格便宜、外围简单被大量早期家用计算机采用。它的地址空间是64KB听起来寒酸但在当年很多机器实际只焊了4KB到16KB的内存剩下的地址空间留给ROM和I/O。Microsoft BASIC 就是烧在ROM里的那部分——机器一上电BASIC解释器就在那儿等着你敲命令。理解这一点很关键你写的每一行BASIC都不是编译成机器码再跑的而是被解释器逐行读取、逐行解释执行。所以那个年代的编程体验是“交互式”的敲一行PRINT 11立刻出结果跟今天在命令行里敲Python差不多。但代价是速度慢、内存占用高解释器本身就要吃掉好几KB。这也是为什么当年的程序都写得极短——不是不想写长是内存真的不够。1.2 Microsoft BASIC 的语句集有多“小”这套BASIC的语句数量不多核心就那么几十个PRINT、LET、INPUT、IF...THEN、FOR...NEXT、GOTO、GOSUB...RETURN、DIM、READ...DATA、REM、END。没有函数式编程没有面向对象连字符串处理都只有LEFT$、RIGHT$、MID$、LEN这几个基础货色。但正是这种“小”逼着人把逻辑想清楚。你不能靠库、不能靠框架所有东西都得自己用循环和判断拼出来。我个人的看法是用这套语句写10个小程序比用现代语言写100个demo更能锻炼基本功因为没有任何东西可以帮你兜底。1.3 复现环境怎么搭三个可选路径想真正跑起来你有三条路。第一条是找一台老机器或者用硬件模拟器原汁原味但门槛高第二条是用软件模拟器在电脑上加载ROM镜像这是最常用的方式第三条是用现代BASIC方言做近似复现比如某些开源BASIC解释器语法接近但不完全一致。我建议新手走第二条路找一个支持6502的模拟器加载对应的BASIC ROM然后就能进入那个熟悉的提示符界面。具体操作上模拟器一般需要你指定ROM文件路径和内存大小内存建议给到至少8KB否则稍长一点的程序会报OUT OF MEMORY。这里不展开具体软件名因为不同平台的模拟器操作差异较大你按“6502模拟器 BASIC ROM”这个思路去找基本都能找到可用的方案。注意不同机器上的Microsoft BASIC版本在细节上有差异比如字符串函数的名字、PRINT的分隔符行为、是否支持ELSE。下面所有程序我都按最保守的语法写尽量保证在多数版本上能跑。2. 10个经典小程序逐个拆解从打印到逻辑2.1 程序一Hello 式的字符打印与格式控制第一个程序永远是打印。但别小看打印BASIC的PRINT里藏着不少门道。10 REM PRINT DEMO 20 PRINT HELLO, 6502 30 PRINT 40 PRINT A, B, C 50 PRINT A; B; C 60 END这段代码的重点在第40行和第50行的区别。逗号在BASIC里是“跳到下一个制表位”分号是“紧挨着输出”。当年很多机器的制表位宽度是8或14个字符不同版本不一样所以你看到的对齐效果会有差异。第30行单独一个PRINT是输出一个空行这个技巧在排版时特别常用。为什么第一个程序要讲这个因为后面所有程序的输出美观度都依赖你对逗号和分号的掌握。我见过不少人写出来的表格歪歪扭扭就是因为全程用逗号或者全程用分号。实操心得是做表格用逗号做紧凑拼接用分号需要精确对齐时宁可自己数空格。2.2 程序二用 FOR...NEXT 打印三角形图案这是当年最经典的“图形”程序因为字符界面下你只能用星号拼图案。10 REM TRIANGLE 20 INPUT HOW MANY ROWS; N 30 FOR I 1 TO N 40 FOR J 1 TO I 50 PRINT *; 60 NEXT J 70 PRINT 80 NEXT I 90 END嵌套循环是这段代码的核心。外层I控制行数内层J控制每行的星号数。第70行的PRINT负责换行注意它没有分号所以会输出一个换行符。这里有个容易踩的坑如果你把第50行写成PRINT *不带分号每个星号都会换行图案就变成一条竖线了。另一个坑是变量名早期BASIC只认变量名的前两个字符所以I和J这种单字母最安全你要是写COUNT和TOTAL解释器可能把它们当成同一个变量。参数选择上N不要给太大超过20行在窄屏上就换行错乱了。当年屏幕普遍是40列所以三角形底边最好不要超过40个字符。2.3 程序三猜数字游戏理解 IF 与随机数猜数字是逻辑训练的入门标配它把输入、判断、循环三件事串起来了。10 REM GUESS NUMBER 20 R INT(RND(1) * 100) 1 30 C 0 40 INPUT GUESS 1-100; G 50 C C 1 60 IF G R THEN 100 70 IF G R THEN PRINT TOO LOW: GOTO 40 80 PRINT TOO HIGH 90 GOTO 40 100 PRINT GOT IT IN; C; TRIES 110 END第20行是重点。RND(1)返回0到1之间的随机小数乘100取整再加1得到1到100的整数。注意INT是向下取整所以INT(RND(1)*100)的范围是0到99加1才对。这个“加1”的细节很多人第一次写会漏掉结果永远猜不到100。第60行的THEN 100是THEN GOTO 100的简写早期BASIC允许这种省略。第70行用了冒号把两个语句写在一行这也是省内存的常见手法——行号本身也占空间能合并就合并。提示RND的参数在不同版本里行为不同有的版本RND(1)每次都返回新值有的版本需要RND(0)。如果你发现随机数不随机先检查这个参数。2.4 程序四简易四则运算器练 INPUT 与字符串转数字这个程序模拟一个计算器输入两个数和运算符输出结果。10 REM CALCULATOR 20 INPUT FIRST NUMBER; A 30 INPUT OPERATOR (-*/); O$ 40 INPUT SECOND NUMBER; B 50 IF O$ THEN R A B: GOTO 90 60 IF O$ - THEN R A - B: GOTO 90 70 IF O$ * THEN R A * B: GOTO 90 80 IF O$ / THEN R A / B 90 PRINT RESULT ; R 100 ENDO$带美元符号表示字符串变量这是BASIC的命名约定不带$的是数值变量。第50到80行是一串IF...THEN这种写法在早期BASIC里没有ELSE或者ELSE支持不好的情况下特别常见靠GOTO跳过后续判断。除法的坑在于除数为零。上面这段代码没做保护输入0会直接报错。实际写的时候应该在第80行前加一句IF B 0 THEN PRINT DIV BY ZERO: END。这种防御性写法在当年其实不流行因为大家默认输入是对的但放到今天复现加上更稳妥。2.5 程序五乘法口诀表双重循环与格式化输出打印九九乘法表是练格式化的好题目。10 REM MULTIPLICATION TABLE 20 FOR I 1 TO 9 30 FOR J 1 TO 9 40 P I * J 50 PRINT I; X; J; ; P, 60 NEXT J 70 PRINT 80 NEXT I 90 END第50行末尾的逗号让每个算式跳到下一个制表位形成列对齐。但制表位宽度固定两位数结果会把列撑歪所以更讲究的写法是用字符串函数补齐空格。不过早期BASIC的字符串拼接能力有限很多人就接受这种不完美。这里可以讲一个实操技巧如果制表位太宽导致一行放不下可以把内层循环改成FOR J 1 TO I只打印下三角这样每行长度递增视觉上更整齐。这也是当年常见的变体。2.6 程序六斐波那契数列理解变量交换与循环边界10 REM FIBONACCI 20 A 0 30 B 1 40 FOR I 1 TO 15 50 PRINT A; 60 C A B 70 A B 80 B C 90 NEXT I 100 PRINT 110 END第60到80行是经典的变量轮换用临时变量C存和然后A接BB接C。顺序不能错如果先写A B再写C A BA的旧值就丢了。这个“临时变量”的思路是所有交换逻辑的基础后面排序也会用到。循环次数选15是因为斐波那契数增长很快第15项是610再往后就接近早期BASIC整数变量的上限了。很多版本的整数范围是-32768到32767超过会溢出。这个边界意识在当年是必修课。2.7 程序七冒泡排序数组 DIM 与嵌套循环的实战排序是第一个真正有“算法味”的程序。10 REM BUBBLE SORT 20 DIM A(10) 30 FOR I 1 TO 10 40 READ A(I) 50 NEXT I 60 FOR I 1 TO 9 70 FOR J 1 TO 10 - I 80 IF A(J) A(J1) THEN 110 90 T A(J) 100 A(J) A(J1): A(J1) T 110 NEXT J 120 NEXT I 130 FOR I 1 TO 10 140 PRINT A(I); 150 NEXT I 160 DATA 5,3,8,1,9,2,7,4,6,0 170 END第20行的DIM A(10)声明一个11个元素的数组下标从0到10这是早期BASIC的特点DIM A(10)给的是0到10共11个位置。第40行的READ配合第160行的DATA是当年初始化数据的标准做法比一个个赋值省事。第80行的判断保证相等时不交换减少无谓操作。第90到100行就是前面说的临时变量交换。冒泡排序的效率不高但代码短、逻辑直观在只有几KB内存的环境里短就是最大的优点。注意DATA语句的位置有讲究它可以在程序任何地方READ按出现顺序读取。如果你把DATA放在END之后某些版本会跳过不执行这是安全的做法。2.8 程序八素数筛选用标记数组做判断10 REM PRIME NUMBERS 20 DIM F(100) 30 FOR I 2 TO 100 40 IF F(I) 1 THEN 80 50 PRINT I; 60 FOR J I * I TO 100 STEP I 70 F(J) 1 80 NEXT I 90 PRINT 100 END这是埃拉托斯特尼筛法的BASIC版。F数组当标记用0表示可能是素数1表示已划掉。第60行从I*I开始标记因为小于I*I的倍数已经被更小的素数划过了这个优化能省不少循环。STEP I是FOR循环的步长参数这里步长为I正好遍历所有倍数。这个程序的内存占用很小100个元素的数组在当年也算宽裕是展示“用少量内存做有用计算”的好例子。2.9 程序九字符画小房子纯 PRINT 的排版艺术10 REM HOUSE 20 PRINT /\\ 30 PRINT / \\ 40 PRINT / \\ 50 PRINT /______\\ 60 PRINT | | 70 PRINT | [] | 80 PRINT |______| 90 END这段没有任何逻辑全是PRINT但它教会你一件事反斜杠在字符串里要转义成\\否则会被当成特殊字符。不同BASIC版本对转义的处理不一样有的版本根本不支持转义那就得用CHR$(92)来输出反斜杠。字符画在当年是重要的“图形”手段因为真正的图形功能要么没有要么贵。排版的关键是每一行的空格数要精确错一个空格整个图就歪了。我的经验是先在纸上画好格子数清楚再敲代码。2.10 程序十简易菜单系统GOSUB 与程序结构最后一个程序把前面学的东西串起来做一个菜单。10 REM MENU SYSTEM 20 PRINT 1. TRIANGLE 30 PRINT 2. FIBONACCI 40 PRINT 3. EXIT 50 INPUT CHOOSE; C 60 IF C 1 THEN GOSUB 200 70 IF C 2 THEN GOSUB 300 80 IF C 3 THEN END 90 GOTO 20 200 REM TRIANGLE SUB 210 FOR I 1 TO 5 220 FOR J 1 TO I 230 PRINT *; 240 NEXT J 250 PRINT 260 NEXT I 270 RETURN 300 REM FIB SUB 310 A 0: B 1 320 FOR I 1 TO 10 330 PRINT A; 340 C A B: A B: B C 350 NEXT I 360 PRINT 370 RETURNGOSUB...RETURN是早期的子程序调用机制没有参数传递全靠全局变量。第60到80行根据输入跳转到不同子程序子程序执行完RETURN回到调用点的下一行。这种结构比满屏GOTO清晰得多是当年组织稍大程序的常用手法。第90行的GOTO 20形成主循环菜单会一直显示直到选3退出。这个“菜单子程序”的骨架几乎可以套用到任何交互式小程序上是这10个程序里最值得记住的结构。3. 把这些程序跑起来实操流程与参数细节3.1 从零到第一个提示符的完整步骤假设你已经找到了可用的模拟器并加载了BASIC ROM开机后你会看到一个提示符通常是或者READY。这时候你处在“直接模式”敲PRINT 22回车应该立刻看到4。这一步是验证环境是否正常的黄金标准如果这一步都不对后面全白搭。确认直接模式正常后输入NEW清空内存然后开始逐行敲程序。每敲完一行回车解释器会把它存进内存但不执行。全部敲完后输入RUN回车程序才开始跑。这个“先存后跑”的流程和今天的交互式环境不同需要适应。如果你想看内存里存了什么输入LIST会列出所有行。想删掉某一行输入行号直接回车即可。想改某一行重新输入同样的行号加新内容旧行会被覆盖。这三个命令NEW、LIST、RUN是你调试时用得最多的。3.2 行号间隔为什么习惯用10你会发现所有例子的行号都是10、20、30这样跳着走。这不是强迫症是为了留插入空间。如果后来发现第20行和第30行之间要加一句你可以用25不用重排整个程序。当年改程序全靠手敲重排行号是件痛苦的事所以大家约定俗成用10做间隔。行号本身也占内存每个行号在内存里占几个字节。程序特别长的时候有人会用1、2、3这样紧凑编号来省空间。但代价是没法插入改起来更麻烦。这是个典型的空间换便利的取舍。3.3 变量命名与内存占用的关系早期BASIC的变量名只有前两个字符有效而且不区分大小写。这意味着SCORE和SCOTT是同一个变量。这个限制在今天看来很荒谬但当年是为了让解释器用最少的表项管理变量。数值变量和字符串变量分开管理A和A$是两个不同的变量。数组用DIM声明不声明直接用会报错或者默认给10个元素不同版本行为不同。我的建议是永远显式DIM哪怕只用几个元素这样行为可预测。3.4 调试手段没有断点的时候怎么查错那个年代没有断点调试器查错全靠PRINT。在可疑的地方插一句PRINT HERE; X看程序有没有走到、变量值对不对。这个土办法虽然笨但极其有效而且逼着你在写代码时就考虑“哪里可能出问题”。另一个手段是STOP语句它会让程序暂停并显示断在哪一行然后你可以用PRINT查看变量当前值再用CONT继续。这算是当年最接近调试器的功能了。STOP和END的区别是END结束程序STOP只是暂停。4. 常见问题与排查技巧实录4.1 报错信息速查与对应原因报错常见原因排查方向SYNTAX ERROR语句拼写错、缺括号、多逗号用LIST看该行逐字符核对OUT OF MEMORY程序太长、数组太大、字符串太多精简代码、减小DIM、合并行UNDEFD STATEMENTGOTO/GOSUB跳到了不存在的行号检查目标行号是否敲错或已删除DIVISION BY ZERO除数为0在除法前加判断REDIMD ARRAY同一个数组DIM了两次删掉重复的DIMNEXT WITHOUT FORNEXT和FOR不匹配检查嵌套层级这张表是我踩坑踩出来的。最坑的是SYNTAX ERROR它只告诉你哪一行有问题不告诉你具体错在哪。我的经验是从行首开始逐字符看重点看逗号、分号、括号、引号是否配对。引号不配对是高频错误因为字符串里的内容解释器不管但引号本身必须成对。4.2 程序跑飞了怎么办死循环的识别与中断死循环是新手最容易遇到的问题典型症状是屏幕疯狂滚动或者光标卡住不动。当年的机器一般有一个中断键不同机器不一样常见的是Esc或CtrlC按下去能强制中断回直接模式。如果中断键不管用只能重启。所以写循环时一定要想清楚退出条件。FOR...NEXT循环相对安全因为次数是固定的GOTO循环最危险一定要有明确的跳出判断。我个人的习惯是任何GOTO回跳之前先问自己“什么条件下不跳”。4.3 输出排版错乱的三个根源排版错乱基本逃不出三个原因制表位宽度和你以为的不一样、字符串里有不可见字符、行宽超限自动换行。第一个原因前面讲过用逗号时尤其要注意。第二个原因常见于从别处复制来的代码里面混了空格或制表符。第三个原因是屏幕列数限制超过就折行图案全乱。解决办法排版前先用PRINT测一下制表位比如PRINT A, B看B出现在第几列。字符串尽量手敲不要复制。长行主动拆成多个PRINT。4.4 数值精度与溢出的隐蔽陷阱早期BASIC的数值变量分整数和浮点整数范围有限浮点精度也不高。做累加或者乘法时很容易溢出。比如连乘到十几项就可能超过整数上限结果变成负数或者报错。排查方法是分段PRINT中间结果看哪一步开始不对劲。预防方法是提前估算最大值超过范围就改用浮点变量加!后缀或者用DEFDBL视版本而定或者缩小计算规模。这个意识在当年是基本功今天用惯了大数库的人反而容易忽略。4.5 我踩过的两个真实坑第一个坑是DATA语句里的逗号。DATA 1,2,3是三个数但DATA 1, 2, 3在某些版本里空格也会被算进去导致READ读出来的值不对。解决办法是DATA里不留多余空格。第二个坑是字符串比较。IF A$ Y在有的版本里区分大小写输入小写y就匹配不上。稳妥的写法是先统一转成大写再比较或者同时判断两种写法。这种版本差异在复现老代码时特别常见遇到行为不符先怀疑版本差异别怀疑自己的逻辑。5. 从这10个程序里能带走什么这10个程序加起来可能不到200行但它们覆盖了BASIC的全部核心语句打印、输入、判断、循环、数组、子程序、数据初始化。更重要的是它们展示了在极端资源约束下怎么写代码——能合并的行就合并能用短变量名就用短的能省一次循环就省一次。这种“抠”的习惯放到今天写嵌入式或者性能敏感的场景依然是硬功夫。如果你想继续扩展有几个方向把这10个程序改造成一个统一的菜单驱动合集练习GOSUB的组织能力给猜数字加上次数限制和难度选择练习嵌套判断把排序扩展成支持字符串排序练习字符串数组。每一个扩展都会逼你面对新的边界问题而解决这些问题的过程就是编程能力真正长进的地方。我个人在实际操作中的体会是跑通这些老程序最大的障碍从来不是语法而是环境——找到对的ROM、配对的内存大小、适应没有断点的调试方式。一旦环境通了剩下的就是纯粹的逻辑乐趣。那种敲完RUN按下回车、屏幕立刻给出反馈的感觉和今天跑一个脚本没有本质区别只是当年的每一行代码都更“重”因为你清楚地知道内存里就那么点地方写下的每个字节都得算数。
企业数字化 ERP 产品动态
相关推荐
Paperclip:轻量级AI Agent编排协议与OpenClaw执行器契约设计 1. “Paperclip”不是回形针:它正在悄悄改写AI Agent的底层逻辑 最近在几个技术社区里频繁刷到“paperclip”这个词,点进去一看,既不是办公用品测评,也不是手工艺教程,而是一群人在讨论一个叫 Paperclip 的开源项目——… · 2026/11/2 14:33:45
回形针不简单:从发明历史到材质工艺的全面解析与避坑指南 1. 回形针这东西,远比你想象的复杂一支回形针,几毛钱一盒,办公室里一堆一堆地丢。但你真把它拿在手里端详过吗?掰开、撑直、再弯回去,你会发现它居然能弹回原来的形状,哪怕折腾个十几次依然不肯“投降”。就… · 2026/11/2 14:33:45
VoiceStudio构建指南:从录音降噪到TTS语音克隆的完整音频工作流 1. VoiceStudio到底是什么,值得折腾吗 第一次看到VoiceStudio这个名字的时候,我脑子里蹦出来的画面是一间堆满监听音箱、声学棉和防喷罩的录音棚。但实际接触下来你会发现,这个概念早就不局限于实体棚了,它更像是一整套“从声音到… · 2026/11/2 14:33:45
GPT-Image API 实战:图片编辑蒙版与 Alpha 通道避坑指南 最近我把 GPT-Image API 接进一个图片批处理工具里,需求本身不复杂:给商品图换背景、去掉照片角落的水印、局部改个颜色。原以为一个编辑接口几分钟调通,结果在图片蒙版(mask)和 Alpha 通道上反反复折腾了两天… · 2026/11/2 17:48:41
Paperclip附件上传库实战:从接入到迁移的完整指南 Paperclip 这个词,一般人的第一反应是办公桌上那种弯成两圈的小铁丝,但做 Rails 开发超过五六年的朋友,看到它第一反应大概率是另一件事:数据库里那串avatar_file_name、avatar_content_type、avatar_file_size、avatar_updated_a… · 2026/11/2 17:48:41
Testing Library用户事件测试:原理与实践指南 1. Testing Library 用户事件测试概述在现代前端测试实践中,用户交互行为的模拟是确保应用质量的关键环节。Testing Library 作为当前最流行的前端测试工具集之一,其用户事件(user-event)模块提供了比内置 fireEvent 更接近真实用户操作的模拟能力。这套… · 2026/11/2 17:48:41
从零构建AI工程体系:Rust+TypeScript+Julia分层实践 1. 什么是“从零构建AI工程体系”:不是写个模型,而是搭一座能跑十年的桥“ai-engineering-from-scratch”这个标题乍看像一句技术口号,但在我带过七支AI落地团队、亲手交付过23个工业级AI系统之后,它真正意味着:用工程… · 2026/11/2 17:48:41
蜂窝物联网低功耗设计:PSM与eDRX技术详解 1. 项目概述:蜂窝物联网的低功耗设计艺术在物联网设备设计中,电池寿命往往是最关键的考量因素之一。对于基于蜂窝网络(如LTE-M和NB-IoT)的物联网设备来说,如何在不影响功能的前提下最大限度地延长电池寿命,… · 2026/11/2 17:48:41
Gobot事件驱动架构实战:响应式机器人的事件流、时延与并发调优 做机器人项目最怕的从来不是电机不转,而是事件没到。我印象最深的一次调试,是一条本该在 20 毫秒内触发的碰撞回调,硬生生推迟了 400 毫秒才执行,排查了整整两天,最后发现是某个日志处理函数里塞了一次同步文件写入&am… · 2026/11/2 17:47:40
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18
雷达信号调制技术解析:从LFM到伪线性调频原理与应用 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 1:01:15
基于MAX14431与TM4C123的工业SPI隔离电路设计全攻略 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 1:01:15
PLFM_RADAR:相位线性调频雷达信号处理框架 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 1:01:15
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18