51单片机汇编入门基础代码学习-定时器数码管显示

51单片机汇编入门基础代码学习-定时器数码管显示

一、例程代码

学习任何一种语言最基础最首先的事情必然是看懂这个语言,如果连看都看不懂别人的代码如何能写。注释是用于提高工作效率,而对于学习,注释似乎并没有那么重要。每个语句的介绍都在后面列出,读者可先学习它们,照着它们再次查阅这段代码,相信汇编理解它不会那么难了。

该程序主要作用是计数按下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口作为数码管输出)。

发布了3 篇原创文章 · 获赞 6 · 访问量 257

猜你喜欢

转载自blog.csdn.net/weixin_44313435/article/details/104179601