汇编相对于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