51单片机LED操作汇编语言程序解释

ORG 00H
SJMP STAR
ORG 1BH
SJMP T1S
ORG 30H
STAR: MOV R2,#99
MOV R4,#20
MOV IE,#88H
MOV TMOD,#10H
MOV TH1,#3CH
MOV TL1,#0B0H
SETB TR1
MOV A,R2
MOV B,#10
DIV AB
ACALL SEG7
MOV P1,A
MOV A,B
ACALL SEG7
MOV P2,A
SJMP $
SJMP STAR
T1S: MOV TH1,#3CH
MOV TL1,#0B0H
DJNZ R4,T1S0
MOV R4,#20
DJNZ R2,T1S1
/*CLR TR1*/
SJMP T1S1
T1S0: RETI
T1S1: MOV A,R2
MOV B,#10
DIV AB
ACALL SEG7
MOV P1,A
MOV A,B
ACALL SEG7
MOV P2,A
CJNE R2,#0,T1S2
MOV R2,#100

T1S2: RETI

SEG7: INC A
MOVC A,@A+PC
RET
DB 0C0H,0F9H,0A4H,0B0H
DB 99H,92H,82H,0F8H
DB 80H,90H,88H,83H
DB 0C6H,0A1H,86H,8EH
END

ORG 00H ;程序初始地址
SJMP STAR ;跳转到STAR
ORG 1BH ;定时器T1的中断向量地址
SJMP T1S ;跳转到T1S
ORG 30H ;程序地址30H,即STAR标号地址
STAR: MOV R2,#99 ;将十进制数99送入R2中
MOV R4,#20 ;将十进制数20送入R4中
MOV IE,#88H ;开启EA和ET1
MOV TMOD,#10H ;使用T1的工作方式1
MOV TH1,#3CH ;给T1赋初值,这里是定时50ms
MOV TL1,#0B0H
SETB TR1 ;开启T1
MOV A,R2 ;将R2中的值送入A中
MOV B,#10 ;将十进制数10送入B中
DIV AB ;将A中的数除以B中的数,商在A中,余数在B中
ACALL SEG7 ;调用SEG7
MOV P1,A ;将A中值送入P1
MOV A,B ;将B中值送入A
ACALL SEG7 ;调用SEG7
MOV P2,A ;将A中值送入P2
SJMP $ ;死循环,等待中断
SJMP STAR
T1S: MOV TH1,#3CH ;中断程序,重新赋初值T1 50ms
MOV TL1,#0B0H
DJNZ R4,T1S0 ;R4中值先减1再看是否为0,若不为0则跳转到T1S0,若为0则顺序往下执行
MOV R4,#20 ;给R4重新赋值十进制数20,因此定时时间应该为1秒
DJNZ R2,T1S1 ;R2中值先减1再看是否为0,若不为0则跳转到T1S1,若为0则顺序往下执行
/*CLR TR1*/
SJMP T1S1 ;跳转到T1S1
T1S0: RETI ;中断返回
T1S1: MOV A,R2 ;将R2中的值送入A中
MOV B,#10 ;将十进制数10送入B中
DIV AB ;将A中的数除以B中的数,商在A中,余数在B中
ACALL SEG7 ;调用SEG7
MOV P1,A ;将A中值送入P1
MOV A,B ;将B中值送入A
ACALL SEG7 ;调用SEG7
MOV P2,A ;将A中值送入P2
CJNE R2,#0,T1S2 ;将R2中的值与十进制数0比较,若为0则跳转到T1S2,否则顺序执行
MOV R2,#100 ;给R2赋十进制数100

T1S2: RETI ;中断返回

SEG7: INC A ;A中的值加1
MOVC A,@A+PC ;先将PC中的值加1,然后与A相加,然后以此值为地址,将该地址中的数据送入A中
RET ;返回
DB 0C0H,0F9H,0A4H,0B0H;数据
DB 99H,92H,82H,0F8H
DB 80H,90H,88H,83H
DB 0C6H,0A1H,86H,8EH
END ;程序结束
=========================================================
我就是逐句解释了一下,至于程序要实现什么功能,我就不清楚了,要跟硬件相关
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-10-17
ORG 00H    ;主程序起始地址
SJMP STAR    ;跳转到主程序入口
ORG 1BH    ;定时器1中断入口
SJMP T1S    ;跳转到定时器1中断服务程序入口
ORG 30H    ;主程序入口地址
STAR: MOV R2,#99    ;R2=99
MOV R4,#20    ;R4=20
MOV IE,#88H    ;EA=1,ET1=1
MOV TMOD,#10H    ;定时器1为模式1
MOV TH1,#3CH    ;定时器1初始值高位
MOV TL1,#0B0H    ;定时器1初始值低位
SETB TR1    ;启动定时器1
MOV A,R2    ;R2送累加器A
MOV B,#10    ;B送10
DIV AB    ;A除以B
ACALL SEG7    ;调用SEG7子程序
MOV P1,A    ;P1=A
MOV A,B    ;A=B
ACALL SEG7    ;调用子程序
MOV P2,A    ;P2=A
SJMP $    ;原地死循环
SJMP STAR    ;跳转到STAR
T1S: MOV TH1,#3CH    ;重赋初始值高位
MOV TL1,#0B0H    ;重赋初始值低位
DJNZ R4,T1S0    ;R4减1不为0转T1S0
MOV R4,#20    ;为0则R4重赋值20
DJNZ R2,T1S1    ;R2减1不为0转T1S1
/*CLR TR1*/ 
SJMP T1S1    ;跳转到T1S1
T1S0: RETI    ;中断返回
T1S1: MOV A,R2    ;A=R2
MOV B,#10    ;B=10
DIV AB    ;A除以B
ACALL SEG7    ;调用子程序
MOV P1,A    ;P1=A
MOV A,B    ;A=B
ACALL SEG7    ;调用子程序
MOV P2,A    ;P2=A
CJNE R2,#0,T1S2    ;R2不等于0转T1S2
MOV R2,#100    ;等于0则重赋值100

T1S2: RETI    ;中断返回

SEG7: INC A    ;A加1
MOVC A,@A+PC    ;查表取值送A
RET
DB 0C0H,0F9H,0A4H,0B0H
DB 99H,92H,82H,0F8H
DB 80H,90H,88H,83H
DB 0C6H,0A1H,86H,8EH
END

本回答被网友采纳
第2个回答  2011-05-22
呵呵……我也是这样想。楼主太、太懒了
第3个回答  2011-05-22
LZ不好好学习。
相似回答