完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、例程代码
学习任何一种语言最基础最首先的事情必然是看懂这个语言,如果连看都看不懂别人的代码如何能写。注释是用于提高工作效率,而对于学习,注释似乎并没有那么重要。每个语句的介绍都在后面列出,读者可先学习它们,照着它们再次查阅这段代码,相信汇编理解它不会那么难了。 该程序主要作用是计数按下button的次数,最高到100,并通过数码管显示出来。 COUNT EQU 20H BUTTON BIT 0B7H ORG 30H START: MOV COUNT,#01H RUN: MOV A,COUNT MOV B,#10 DIV A,B MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,B MOVC A,@A+DPTR RL A MOV P2,A JB BUTTON,$ JNB BUTTON,$ INC COUNT MOV A,COUNT CJNE A,#100,RUN AJMP START TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END 该汇编程序电路图如图所示,可直接运行。 二、基础指令集简介 汇编指令集是由芯片厂商制定的,其实际意义还是1和0。作为最接近硬件的程序语言,它能够帮助我们更容易理解微型计算机的运行原理。当然如果你能够对硬件有所了解,学习它必然是事半功倍的(学习C语言对你学习任何一门语言都有帮助)。 1、数据传递指令 mov MOV A,Rn Rn指的是通用寄存器R0-R7,将Rn寄存器中的内容放入累加器A中。 MOV A,direct direct就是指的直接的地址,将该地址内的数据放入累加器A中。 MOV A,#data #data为立即数(前面加#用于区分立即数和地址),将立即数送入累加器A中。 **MOVC ** MOVC用法结构类似于mov,差别在于:MOV 是访问片内的RAM和SFR时用的,而MOVC是访问ROM(只读不写)时用的。 有下面历程被使用到: MOV DPTR,#TABLE 将TABLE(自己定义的数组,在后文中提到)的地址传到寄存器DPTR中。 MOVC A,@A+DPTR 从寄存器DPTR指令地址开始偏移A个地址的数读取到A中(根据上下文可知,其类似于调用数组的过程)。 2、条件转移指令 JB bit,rel 如果某一位或某个管脚的值是1则程序跳转到rel,不是1则顺序执行。 JNB bit,rel 于JB相反,如果某一位或某个管脚的值不是1则程序跳转,是1则顺序执行。 通用写法是:JNB bit,rel bit是位变量,rel是跳转时的相对偏移量 CJNE 参与比较的两个数,若不相等,则转移,若相等则程序顺序执行;利用这条指令,就可以判断两数是否相等。 有下面历程被使用到: *JB BUTTON ,$ * button管脚值为1则原地跳转,当为0时执行下一条语句。 *JNB BUTTON ,$ * button管脚值为0则原地跳转,当为1时执行下一条语句。 注:上述两条语句组合成为一个按键从按下到松开的过程。 CJNE A,#100,RUN 判断累加器A的值是否为100,若不等于则跳转到RUN去执行。 3、算数运算指令 DIV 在汇编里是除法指令, INC 自加指令,类似于C语言中的++。 有下面历程被使用到: DIV A,B A除B值的整数部分给A,余数部分给B。 INC COUNT count自加1,类似于C语言的(COUNT++)。 4、跳转指令 1.短转移类指令 AJMP addr11 2.长转移类指令 LJMP addr16 3.相对转移指令 SJMP rel 都用于指令跳转,从当前位置跳转到后面的地址位(一般为自己拟了名字的地址如DELAY:)。(它们的差别在于跳转的范围:LJMP一下能跳64Kb。而AJMP最多只能跳2Kb,而SJMP则最多只能跳256b) 有下面历程被使用到: 详细例程可参考我的另一篇关于汇编流水灯的博客。 5、伪指令 是用于对汇编过程进行控制的指令,该类指令并不是可执行指令,不生成机器代码。只用于帮助汇编器提供汇编信息。 ORG address 控制汇编程序最终运行在内存的address地址上。 BUTTON BIT 0B7H 将地址0B7H赋给BUTTON,正好是对应单片机的P3.7引脚。 汇编中数组的定义 TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH 该数组内包含的是数码管显示1~9对应的码值(上述程序使用的是p0和p2口作为数码管输出)。 |
|
|
|
只有小组成员才能发言,加入小组>>
2597 浏览 0 评论
794浏览 1评论
240浏览 1评论
559浏览 0评论
305浏览 0评论
517浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-24 09:44 , Processed in 1.075090 second(s), Total 77, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号