0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

教大家如何在单片机中用汇编优雅的点灯

strongerHuang 来源:strongerHuang 作者:strongerHuang 2021-07-27 15:37 次阅读

现在可能很少看到汇编程序了,但单片机的启动文件、RTOS底层代码等一些地方,依然还有汇编代码的身影。

不知道大家有没有学过汇编,或者有没有用汇编语言编过程?

今天就给大家分享一下汇编语言的那些事。

1

学习汇编语言我在10年学习单片机编程的时候,老师教学都还是用汇编教我们,包括教学实验,也是要求我们用汇编写程序。

MOV A,#00HMOV P1,A

我记得那会儿,老师要求我们把汇编指令背下来。虽然现在很多汇编指令写不出来了,但看到很多汇编代码,还是基本明白它的意思。

以前计算机三级(PC技术)的上机考试,就是用汇编编程,我那个时候上机考试还是满分。当时觉得自己很牛逼,现在看来就是一菜鸟

2

汇编转C语言刚开始学习汇编那会儿,我真的用汇编在51单片机上写流水灯程序。后面看了用C语言写流水灯程序,突然发现,哇,用C语言写程序还能这么简单、方便。

于是,我就那个时候开始放弃了汇编,转向了C语言。包括后面我在大学实验室自己学习、DIY做东西、以及后面的全国大学生电子设计竞赛,都是用C语言编写的程序。

10行汇编程序,可能只需要一行C语言代码就能实现,这是C语言相比汇编简化的优点。

但是,C语言编写的程序,经过编译,也会转为汇编。比如我们在线调试代码的时候,会看到类似的“汇编窗口”:

9ce82660-eb93-11eb-a97a-12bb97331649.png

因为以前单片机的运行速度不高,且内存和Flash容量不大,要求节约程序空间。

所以使用汇编的优点:代码运行效率更高、更节约代码存储空间。

3

对比用汇编和C语言写流水灯程序汇编语言写程序的主要缺点:语法复杂、可读性差、代码量大等。

下面分享一个实例:51单片机上的流水灯程序。分别用C语言和汇编写出来,大家对比一下就知道了。

C语言版:

/******************** 宏定义 **************************/#define MAIN_Fosc 22118400L //定义主时钟

/******************** 延时函数 **************************/void delay_ms(u8 ms){ u16 i; do{ i = MAIN_Fosc / 13000; while(--i) ; //14T per loop }while(--ms);}

/******************** 主函数 **************************/void main(void){ P0M1 = 0; P0M0 = 0; //设置为准双向口 P1M1 = 0; P1M0 = 0; //设置为准双向口 P2M1 = 0; P2M0 = 0; //设置为准双向口 P3M1 = 0; P3M0 = 0; //设置为准双向口 P4M1 = 0; P4M0 = 0; //设置为准双向口 P5M1 = 0; P5M0 = 0; //设置为准双向口 P6M1 = 0; P6M0 = 0; //设置为准双向口 P7M1 = 0; P7M0 = 0; //设置为准双向口

while(1) { P17 = 0; delay_ms(250); delay_ms(250); P17 = 1; P16 = 0; delay_ms(250); delay_ms(250); P16 = 1; P47 = 0; delay_ms(250); delay_ms(250); P47 = 1; P46 = 0; delay_ms(250); delay_ms(250); P46 = 1; }}

汇编语言版:

;******************** 宏定义 **************************/Fosc_KHZ EQU 22118 ;22118KHZ

STACK_POIRTER EQU 0D0H ;堆栈开始地质

;******************** 延时函数 **************************/F_delay_ms: PUSH 02H ;入栈R2 PUSH 03H ;入栈R3 PUSH 04H ;入栈R4

MOV R2,A

L_delay_ms_1: MOV R3, #HIGH (Fosc_KHZ / 13) MOV R4, #LOW (Fosc_KHZ / 13) L_delay_ms_2: MOV A, R4 ;1T Total 13T/loop DEC R4 ;2T JNZ L_delay_ms_3 ;4T DEC R3L_delay_ms_3: DEC A ;1T ORL A, R3 ;1T JNZ L_delay_ms_2 ;4T DJNZ R2, L_delay_ms_1

POP 04H ;出栈R2 POP 03H ;出栈R3 POP 02H ;出栈R4 RET

;******************** 主程序 **************************/ ORG 0100H ;resetF_Main: CLR A MOV P0M1, A ;设置为准双向口 MOV P0M0, A MOV P1M1, A ;设置为准双向口 MOV P1M0, A MOV P2M1, A ;设置为准双向口 MOV P2M0, A MOV P3M1, A ;设置为准双向口 MOV P3M0, A MOV P4M1, A ;设置为准双向口 MOV P4M0, A MOV P5M1, A ;设置为准双向口 MOV P5M0, A MOV P6M1, A ;设置为准双向口 MOV P6M0, A MOV P7M1, A ;设置为准双向口 MOV P7M0, A

MOV SP, #STACK_POIRTER MOV PSW, #0 ;选择第0组R0~R7

L_MainLoop: CLR P1.7 MOV A, #250 LCALL F_delay_ms ;延时250ms LCALL F_delay_ms ;延时250ms SETB P1.7

CLR P1.6 MOV A, #250 LCALL F_delay_ms ;延时250ms LCALL F_delay_ms ;延时250ms SETB P1.6

CLR P4.7 MOV A, #250 LCALL F_delay_ms ;延时250ms LCALL F_delay_ms ;延时250ms SETB P4.7

CLR P4.6 MOV A, #250 LCALL F_delay_ms ;延时250ms LCALL F_delay_ms ;延时250ms SETB P4.6

SJMP L_MainLoop

上面两个程序,实现的功能都一样(流水灯),但对比代码,大家发现有啥区别?

对于有汇编基础的同学来说,可能这个简单的流水灯程序还是很好理解。

但是,对于大部分人来说,肯定都会觉得汇编很难读。是的,这个是汇编的“特点”。

4

最后汇编语法,对于绝大部分读者来说,我现在是不建议再深入学习了,只需要了解一些基础的内容即可。

有少部分人,想从事底层开发,比如底层驱动、单片机验证、固件库开发等这些读者,有时间还是可以进一步了解汇编的一些技术。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6030

    文章

    44504

    浏览量

    632315

原文标题:如何在单片机中用汇编优雅的点灯

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    keil可以读出单片机的程序吗

    Keil是一款广泛应用于单片机程序开发的软件,它提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案。然而,关于Keil是否能直接“读出”单片机的程序,这一
    的头像 发表于 09-02 10:32 633次阅读

    一个暑假如何学习单片机

    一个暑假是学习和掌握单片机基础知识的良好时机。以下是一个关于如何在暑假期间学习单片机的建议计划
    的头像 发表于 07-03 09:19 468次阅读
    一个暑假如何学习<b class='flag-5'>单片机</b>

    STM32单片机有哪几种常见的开发环境?

    STM32单片机是一款广泛应用于嵌入式系统开发的单片机,针对其开发,有以下几种常见的方式:STM32单片机有哪几种常见的开发环境?KeilMDK是一款广泛使用的单片机集成开发环境,支持
    的头像 发表于 05-18 08:04 2848次阅读
    STM32<b class='flag-5'>单片机</b>有哪几种常见的开发环境?

    请问stm8s单片机中的发送中断标志位用什么来表示?

    各位大神,51单片机中的RI在stm8s单片机中用UART2_SR_RXNE来表示,那么51单片机中的TI在stm8s单片机
    发表于 05-15 07:31

    新手学习单片机最常见的六大误区!

    最近看到台私信要资料的同学比较多,想必大家都是对单片机有着浓厚的学习兴趣,但是很多新手开始入门单片机的时候都会遇到一些学习的误区,今天就来整理一下大家可能会遇到的六大误区。
    的头像 发表于 03-28 08:03 729次阅读
    新手学习<b class='flag-5'>单片机</b>最常见的六大误区!

    单片机抗干扰措施有哪些?

    电磁干扰(EMI)问题日益成为影响单片机稳定性与可靠性的主要障碍。因此,探讨和实施有效的抗干扰措施对于提高单片机系统的性能至关重要。下面为大家简单介绍一种单片机抗干扰措施
    的头像 发表于 03-15 16:36 2051次阅读
    <b class='flag-5'>单片机</b>抗干扰措施有哪些?

    单片机的最小系统由什么组成 单片机的最小系统包括哪些

    单片机(Microcontroller Unit,MCU)的最小系统包括以下几个主要组成部分: 单片机芯片:单片机是整个最小系统的核心部分,它集成了中央处理器(Central Processing
    的头像 发表于 02-02 11:27 9735次阅读

    汽车ECU编程是单片机C语言还是汇编语言?

    汽车ECU编程是单片机C语言吗?还是汇编语言?
    发表于 01-26 06:08

    C语言能够实现单片机功能,为什么还要使用汇编呢?

    C语言能够实现单片机功能,为什么还要使用汇编呢? C语言是一种高级编程语言,它具有跨平台、可移植性强、易于使用的特点,使得开发人员能够快速且方便地编写复杂的程序。然而,尽管C语言在许多方面都非常强大
    的头像 发表于 01-15 14:59 933次阅读

    开关电源中用哪种AD芯片将电压和电流传输给单片机比较好啊?

    开关电源中用哪种AD芯片将电压和电流传输给单片机比较好啊?一直找不到啊
    发表于 01-09 07:54

    stc51单片机怎么烧录

    步骤 常见问题与解决方法 STC51单片机是一种常见的8位单片机,广泛应用于各种嵌入式系统。它具有高性能、低成本、易于学习和使用等优点。STC51单片机使用汇编语言或C语言进行编程,可
    的头像 发表于 01-02 17:41 2962次阅读

    pic单片机汇编程序实例

    以下是一个简单的PIC单片机汇编程序示例,这个程序将实现一个LED闪烁的功能。 首先,我们需要了解PIC单片机的结构和指令集。PIC单片机是一种基于哈佛结构的8位微控制器,具有丰富的指
    的头像 发表于 12-14 11:01 1757次阅读

    单片机按键切换模式怎么设置

    单片机作为一种微处理器,在各种嵌入式系统中扮演着核心控制器的角色。其中,按键输入作为单片机控制中常见的交互方式,实现模式切换是常见的需求。本文将详细介绍如何在单片机中实现按键切换模式。
    的头像 发表于 12-13 11:07 3698次阅读

    你用过哪些编程语言开发单片机

    C语言是最常用的一种用于单片机的开发语言,也是一种高级编程语言,具有较好的可移植性和可读性。对于单片机,通常使用嵌入式C来进行开发。 举例:用C语言写一段STM32单片机点灯程序。
    发表于 12-04 10:18 1237次阅读

    什么是C语言?单片机有什么特点?为什么要用C语言编程?

    随着技术的发展,电子产品越来越多,方便了我们的日常生活,大多数电子产品上都有单片机,而单片机是通过执行软件逻辑来实现功能的。而单片机编程最合适的编程语言是汇编语言,但是最常用、最普及的
    的头像 发表于 11-21 10:06 1535次阅读
    什么是C语言?<b class='flag-5'>单片机</b>有什么特点?为什么要用C语言编程?