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口作为数码管输出)。