汇编语言学习(三)

汇编相对于C来说,的确是很麻烦,需要不停的查表,尤其是对初学者来说,不过,也还是蛮有味道的。

主要说明一点,那就是汇编的延时,我以自己的汇编延时子程序为例:

我们使用R5、6、7三个寄存器来存储数值,那么,这里就有一个问题,这个数值有没有限制呢?答案是有的,我今天开始设置了远超255的值,结果程序老是有警告,但不知道问题出在哪里,后来看提示,勉强懂得好像是这只是8位的单片机,于是便想了下,28 = 256,是不是不能起过这个值,我就度了下,果然Rn的最大值不能大于255,也就是说取值范围为 0 ~ 255,共256个数,对应于51单片机的8位数据处理能力。

好了,不多说,附今天的数码管循环显示源程序。

ORG0000H
START:MOVDPTR, #TABLE ;16位常数装入到数据指针(指针指向表头地址)
CLRP1.3 ;开总使能
CLRP1.4
CLRP1.5
S1:SETBP1.5   ;开位选
MOVP0, #00H
CLRP1.5
MOVP0, #00H ;消隐(共阴极数码管)
MOVA, #00H ;设置地址偏移量
MOVCA, @A+DPTR ;程序存储器代码字节送到累加器(查表取得段码,送A)
CJNEA, #01H, S2 ;比较立即数和A,不相等则转移
LJMPSTART
S2:SETBP1.4 ;开段选
MOVP0, A
CLRP1.4
LCALLDELAY ;子程序调用
INCDPTR ;指针自加1,由此来改变指针所指向地址的内容
LJMPS1
DELAY:MOVR5, #20
D1:MOVR6, #20
D2:MOVR7, #248
D3:DJNZR7, D3
DJNZR6, D2
DJNZR5, D1
RET ;子程序返回,【必不可少】的代码
TABLE:DB3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH
 ;(伪指令)共阴数码管段码表
DB77H, 7CH, 39H, 5EH, 79H, 71H, 73H, 3EH, 6EH, 76H, 38H, 40H, 00H
DB01H ;结束符
END