首页 » 技术SOS » 嵌入式系统 » 单板计算机 » 一个led的程序解释

一个led的程序解释

菜鸟
2008-07-11 23:54:07
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赋值,然后后面又取反呢?
分享
关键词: led, 程序  
专家
2009-08-20 08:30:06
1楼

A只不过是个中转寄存器

菜鸟
2009-11-27 23:28:15
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怎么显示数字的,就明白了。很简单的。