ORG 0000H 主函数地址
LJMP MAIN 进入主函数
ORG 0003H 外部中断0入口地址
LJMP SUM 进入中断
ORG 1000H
GW EQU 20H 用GW 表示20H
SW EQU 21H 如上
BW EQU 22H 如上
MAIN:CLR P1.0 进入主函数。将P1.0位清0
MOV GW,#FFH 给GW 即20H赋初值,,这是立即寻址,你可以百度一下寻址方式
MOV SW,#00H
MOV DPTR,#8002H
MOV A,#0FFH
MOVX @DPTR,A 将A的值送往DPTR所指向的地址, DPTR是指针
MOV DPTR,#8004H
MOV A,#3FH
MOVX @DPTR,A
SETB IT0 下面三句是开中断
SETB EX0
SETB EA
LDO:
MOV DPTR,#8002H
MOVX @DPTR,A
MOV A,@RO 将R0所指向的地址的内容送给A
MOV DPTR,#TABLE 这是查表, 你也可以去翻翻资料,具体说不清
DIRO:MOVC A,@A+DPTR 查表指令。。。就是把下面TABLE里面的值送给A
MOV DPTR,#8004H
MOVX @DPTR,A 把A的值送往外部RAM,即DPTR指针所指向的地址
ACALL DL 调用指令 ,调用DL
INC R0 指针加一
MOV A,R1 将R1的值送往累加器A
JB ACC.2,DIR 判断累加器A的第2位为1吗?为1则转移到DIR函数,不为1执行下面的语句
RL A 左移A
MOV R1,A
AJMP LD0 跳转到LD0,与调用指令有区别
SUM:JB P1.1,JIAN 中断函数。 同上
INC GW
MOV A,GW
CJNE A,#10,QUIT 比较A里面的值与10相等吗?不相等则跳转到QUIT
MOV GW,#00H
INC SW
MOV A,#10,QUIT
MOV SW,#00H
INC BW
MOV A,BW
CJNE A,#2,QUIT
SETB P1.0 将P1.0置1
AJMP QUIT
JIAN: DEC GW GW减一
MOV A,GW
CJNE A,#0FFH,QUIT
MOV GW,#09
DEC SW
MOV A,BW
CJNE A,#1,QUIT
CLR P1.0
QUIT:RET1 reti 是中断返回的结束语。。调用的函数是用RET返回
DL:MOV R6,#10
DL0:MOV R7,#100
DL1:DJNE R7,#DL1
DJNE R6,DL0 这里是个延时函数
RET
TABLE: 表哥数据,用于查表
DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
END