求大神修改一下51单片机的按键计数器程序!在线等急!!!
ORG0000HLJMPSTARTORG000BHLJMPT_0ORG0030HSTART:MOVDPTR,#TABLEMOVSP,#60HMOVTH0,#0FFHMOV...
ORG 0000H
LJMP START
ORG 000BH
LJMP T_0
ORG 0030H
START:
MOV DPTR,#TABLE
MOV SP,#60H
MOV TH0,#0FFH
MOV TL0,#0F0H
SETB EA
SETB ET0
MOV TMOD,#05H
SETB TR0
LOOP:
MOV A,TL0
SUBB A,#0F0H
CJNZ A,#100,OVER
MOV B,#100
DIV AB
MOVC A,@A+DPTR
MOV P2,#00001101B
MOV P1,A
LCALL DELAY4MS
MOV A,B
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P2,#00001011B
MOV P1,A
LCALL DELAY4MS
MOV A,B
MOVC A,@A+DPTR
MOV P2,#00000111B
MOV P1,A
LCALL DELAY4MS
LJMP LOOP
T_0:
PUSH ACC
PUSH DPH
PUSH DPL
CPL P3.0
MOV TH0,#0FFH
MOV TL0,#0F0H
POP DPL
POP DPH
POP ACC
RETI
DELAY4MS:
MOV R5,#10
DELAY_LOOP1:
MOV R4,#200
DELAY_LOOP2:DJNZ R4,DELAY_LOOP2
DJNZ R5,DELAY_LOOP1
RET
TABLE:DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
源程序是从0计数到15.我想修改一下,让他从0计数到3然后再按下去的时候显示1, 然后再这样循环(01231 01231 01231。。。)其他功能不变,求大神指点怎么修改。 展开
LJMP START
ORG 000BH
LJMP T_0
ORG 0030H
START:
MOV DPTR,#TABLE
MOV SP,#60H
MOV TH0,#0FFH
MOV TL0,#0F0H
SETB EA
SETB ET0
MOV TMOD,#05H
SETB TR0
LOOP:
MOV A,TL0
SUBB A,#0F0H
CJNZ A,#100,OVER
MOV B,#100
DIV AB
MOVC A,@A+DPTR
MOV P2,#00001101B
MOV P1,A
LCALL DELAY4MS
MOV A,B
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P2,#00001011B
MOV P1,A
LCALL DELAY4MS
MOV A,B
MOVC A,@A+DPTR
MOV P2,#00000111B
MOV P1,A
LCALL DELAY4MS
LJMP LOOP
T_0:
PUSH ACC
PUSH DPH
PUSH DPL
CPL P3.0
MOV TH0,#0FFH
MOV TL0,#0F0H
POP DPL
POP DPH
POP ACC
RETI
DELAY4MS:
MOV R5,#10
DELAY_LOOP1:
MOV R4,#200
DELAY_LOOP2:DJNZ R4,DELAY_LOOP2
DJNZ R5,DELAY_LOOP1
RET
TABLE:DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
源程序是从0计数到15.我想修改一下,让他从0计数到3然后再按下去的时候显示1, 然后再这样循环(01231 01231 01231。。。)其他功能不变,求大神指点怎么修改。 展开
2个回答
展开全部
你能确定发上来的程序是对的吗?你的仿真图确实是运行了这个程序的吗?
不是吧,这个程序有错误,编译不通过的,那仿真图的结果是怎么出来的,是从别人那拍照下来的吧。
这行:
CJNZ A,#100,OVER
CJNZ 指令是错误的,后面的标号OVER,程序中并没有,不知转向何处,这程序怎么可能编译通过呢?
另外问一句,这样循环(01231 01231 01231。。。)有什么意思吗?为什么要这样?
不是吧,这个程序有错误,编译不通过的,那仿真图的结果是怎么出来的,是从别人那拍照下来的吧。
这行:
CJNZ A,#100,OVER
CJNZ 指令是错误的,后面的标号OVER,程序中并没有,不知转向何处,这程序怎么可能编译通过呢?
另外问一句,这样循环(01231 01231 01231。。。)有什么意思吗?为什么要这样?
追问
把CJNZ A,#100,OVER这删了,就对了。我就是想在SUBB A,#0F0H后面加个几行来实现这个功能
追答
可为什么非要(01231 01231 01231。。。)循环,而不是(01234 01234 01234。。。)循环呢?
还有一个问题,原程序是计16个数,那个发光二极管D1取反一次,即亮/灭转换一次,你这样计数循环后,还是计16个数,那个发光二极管D1取反一次?还是计5个数取反一次?
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如下即可:
ORG 0000H
JMP START
ORG 000BH
CPL P3.0
RETI
START:
MOV TMOD, #06H
MOV TH0, #0FCH
MOV TL0, #0FCH
MOV IE, #82H
SETB TR0
MOV DPTR, #TABLE
LOOP:
MOV A, TL0
CLR C
SUBB A, #0FCH
MOV B, #100
DIV AB
MOV P2, #00001101B
CALL DELAY4MS
MOV A, B
MOV B, #10
DIV AB
MOV P2, #00001011B
CALL DELAY4MS
MOV A, B
MOV P2, #00000111B
CALL DELAY4MS
LJMP LOOP
DELAY4MS:
MOVC A, @A + DPTR
MOV P1, A
MOV R5, #20
DJNZ R4, $
DJNZ R5, $ - 2
RET
TABLE:
DB 3FH, 06H, 5BH, 4FH, 66H
DB 6DH, 7DH, 07H, 7FH, 6FH
END
追问
这个是0123 0123 我想要的效果是 01231 01231 01231.应该是源程序不变,加几行代码就能实现吧?
追答
哦, 0123 后面,还要有个 1 ?
没有注意。
改好了:
ORG 0000H
JMP START
ORG 000BH
CPL P3.0
RETI
START:
MOV TMOD, #06H
MOV TH0, #0FBH
MOV TL0, #0FBH
MOV IE, #82H
SETB TR0
MOV DPTR, #TABLE
LOOP:
MOV A, TL0
CLR C
SUBB A, #0FBH
MOV B, #100
DIV AB
MOV P2, #00001101B
CALL DELAY4MS
MOV A, B
MOV B, #10
DIV AB
MOV P2, #00001011B
CALL DELAY4MS
MOV A, B
MOV P2, #00000111B
CALL DELAY4MS
LJMP LOOP
DELAY4MS:
MOVC A, @A + DPTR
MOV P1, A
MOV R5, #20
DJNZ R4, $
DJNZ R5, $ - 2
RET
TABLE:
DB 3FH, 06H, 5BH, 4FH, 06H
DB 6DH, 7DH, 07H, 7FH, 6FH
END
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询