流水灯c语言程序(如何用汇编和C语言写流水灯程序)

发布时间:2025-12-10 23:06:42 浏览次数:1

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

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

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

1学习汇编语言

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

MOVA,#00HMOVP1,A

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

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

2汇编转C语言

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

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

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

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

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

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

3对比用汇编和C语言写流水灯程序

汇编语言写程序的主要缺点:语法复杂、可读性差、代码量大等。

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

C语言版:

/********************宏定义**************************/#defineMAIN_Fosc22118400L//定义主时钟/********************延时函数**************************/voiddelay_ms(u8ms){u16i;do{i=MAIN_Fosc/13000;while(--i);//14Tperloop}while(--ms);}/********************主函数**************************/voidmain(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_KHZEQU22118;22118KHZSTACK_POIRTEREQU0D0H;堆栈开始地质;********************延时函数**************************/F_delay_ms:PUSH02H;入栈R2PUSH03H;入栈R3PUSH04H;入栈R4MOVR2,AL_delay_ms_1:MOVR3,#HIGH(Fosc_KHZ/13)MOVR4,#LOW(Fosc_KHZ/13)L_delay_ms_2:MOVA,R4;1TTotal13T/loopDECR4;2TJNZL_delay_ms_3;4TDECR3L_delay_ms_3:DECA;1TORLA,R3;1TJNZL_delay_ms_2;4TDJNZR2,L_delay_ms_1POP04H;出栈R2POP03H;出栈R3POP02H;出栈R4RET;********************主程序**************************/ORG0100H;resetF_Main:CLRAMOVP0M1,A;设置为准双向口MOVP0M0,AMOVP1M1,A;设置为准双向口MOVP1M0,AMOVP2M1,A;设置为准双向口MOVP2M0,AMOVP3M1,A;设置为准双向口MOVP3M0,AMOVP4M1,A;设置为准双向口MOVP4M0,AMOVP5M1,A;设置为准双向口MOVP5M0,AMOVP6M1,A;设置为准双向口MOVP6M0,AMOVP7M1,A;设置为准双向口MOVP7M0,AMOVSP,#STACK_POIRTERMOVPSW,#0;选择第0组R0~R7L_MainLoop:CLRP1.7MOVA,#250LCALLF_delay_ms;延时250msLCALLF_delay_ms;延时250msSETBP1.7CLRP1.6MOVA,#250LCALLF_delay_ms;延时250msLCALLF_delay_ms;延时250msSETBP1.6CLRP4.7MOVA,#250LCALLF_delay_ms;延时250msLCALLF_delay_ms;延时250msSETBP4.7CLRP4.6MOVA,#250LCALLF_delay_ms;延时250msLCALLF_delay_ms;延时250msSETBP4.6SJMPL_MainLoop

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

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

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

4最后

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

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

“如何用汇编和C语言写流水灯程序”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注本站网站,小编将为大家输出更多高质量的实用文章!

流水灯c语言程序
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477