ORG 0000H
START:
;初始化程序
MOV SP,#30H
MOV R0,#00 ;R0作为偏移
MAIN:
INC R0
MOV A,R0
ANL A,#7
MOV DPTR,#LED_TABLE
MOVC A,@A+DPTR
CPL A
MOV P1,A
LCALL DELAY
SJMP MAIN
;延时子程序
DELAY:
MOV R3,#50
DELAY_LOOP1:
MOV R4,#100
DELAY_LOOP2:
MOV R5,#100
DJNZ R5,$;若R5减1不为0,跳至本行。$-当前行.重复这一指令.$就是本条指令的PC地址
DJNZ R4,DELAY_LOOP2
DJNZ R3,DELAY_LOOP1
RET ;子程序返回
LED_TABLE:
DB 00H,081H,0C3H,0E7H,0FFH,07EH,03CH,018H
END
程序是这样的。但是我想有谁能给我解释下,为什么刚开始的时候要给A赋值,然后后面又取反呢?
![](http://uphotos.eepw.com.cn/sdjntl/thumb/avatar.jpg)
1楼
A只不过是个中转寄存器
![](http://uphotos.eepw.com.cn/550450124/thumb/avatar.jpg)
2楼
在80c51单片机中R0,R1一般作为变化的地址存储器,变化的地址一般都放在这里面,寄存器A是个中间寄存器,因为你程序里用到了查表,地址是变化的,每一次查表都要R0自加一,而A一般不用作可变地址的存放,所以要用A做中间变量寄存器。 后面的a取反,是和led有关的,led是7段显示,程序中是把查表的数据给了a,为了显示所需要的数,所以要取反,你也可把LED_TABLE: DB 00H,081H,0C3H,0E7H,0FFH,07EH,03CH,018H 改一下,直接显示,就不用取反了, 你可以看一下led怎么显示数字的,就明白了。很简单的。
最新人才