8路抢答器,显示的结果总是一半,做不好,请高手帮忙修改一下,这是我的邮箱191284972@qq.com

这是一半的程序,需要电路图和全部程序的发我邮箱
SAMO:
JNB P1.0,XS1
JNB P1.1,XS2
JNB P1.2,XS3
JNB P1.3,XS4 ;预扫描 选手按键是否按下
JNB P1.4,XS5
JNB P1.5,XS6
JNB P1.6,XS7
JNB P1.7,XS80
RETURN2:RET ;未按下则返回
XS80: LJMP XS8
XS1: LCALL DELAY ;去抖动再判是否按下
JNB P1.0,XS11
JMP RETURN2
XS11: MOV R1,#01H
setb P3.6 ;按下则 显示1号 扬声器关闭
mov p0,#06h
JMP RETURN2
XS2: LCALL DELAY
JNB P1.1,XS22
JMP RETURN2
XS22: MOV R1,#01H
setb P3.6 ;按下则 显示2号 扬声器关闭
mov p0,#5bh
JMP RETURN2
XS3: LCALL DELAY
JNB P1.2,XS33
JMP RETURN2
XS33: MOV R1,#01H
setb P3.6 ;按下则 显示3号 扬声器关闭
mov p0,#4fh
JMP RETURN2
XS4: LCALL DELAY
JNB P1.3,XS44
JMP RETURN2
XS44: MOV R1,#01H
setb P3.6 ;按下则 显示4号 扬声器关闭
mov p0,#66h
JMP RETURN2
XS5: LCALL DELAY
JNB P1.4,XS55
JMP RETURN2
XS55: MOV R1,#01H
setb P3.6 ;按下则 显示5号 扬声器关闭
mov p0,#6dh
JMP RETURN2
XS6: LCALL DELAY
JNB P1.5,XS66
JMP RETURN2
XS66: MOV R1,#01H
setb P3.6 ;按下则 显示6号 扬声器关闭
mov p0,#7dh
JMP RETURN2
XS7: LCALL DELAY
JNB P1.6,XS77
JMP RETURN2
XS77: MOV R1,#01H
setb P3.6 ;按下则 显示7号 扬声器关闭
mov p0,#07h
JMP RETURN2
XS8: LCALL DELAY
JNB P1.7,XS88
JMP RETURN2
XS88: MOV R1,#01H
setb P3.6 ;按下则 显示8号 扬声器关闭
mov p0,#0ffh
JMP RETURN2
XIANSH1:
MOV A,R0
MOV B,#0AH ;R0中存放的倒计时显示值 除10 分出十位和个位
DIV AB
MOV R7,A ;十位存入R7中
MOV R6,B ;个位存入R6中
XIANGSH2:
LCALL DLAY
CLR P3.3
SETB P3.4 ;选择显示十位的数码管
MOV A,R7
MOV DPTR,#SEGTAB ;调入代码
MOVC A,@A+DPTR
MOV P2,A ;显示十位
LCALL DLAY
CLR P3.4
SETB P3.3 ;选择显示个位的数码管
MOV A,R6
MOV DPTR,#SEGTAB ;调入代码
MOVC A,@A+DPTR
MOV P2,A ;显示个位
LCALL DLAY
RET

第1个回答  2012-12-02
貌似DLAY延时时间太短,你是先显示十位再显示个位,每次调用XIANSH1显示子程时,十位只显示了DLAY子程延时时间,显示子程结束时都停留在显示个位上,如果XIANSH1显示子程调用不是太频繁则基本上看不到十位的显示效果,因为在一个调用周期内十位只显示了DLAY子程延时时间,其余时间都在显示个位内容。
如果你先显示个位再显示十位,恐怕又看不到个位的内容了。
事实上对于一个逐位扫描显示电路,在刷新每一位时尽可能使它们的时间均等,这样显示效果才会均匀。
第2个回答  2012-12-02
蜂鸣器所连接的三极管,用的不对。

应该是 NPN 型的。

如果用 PNP,其发射极,应该接正电源。
----
另外,设计抢答器,选手的按键,并不应该延时去抖。追问

嗯嗯,受教了,还有请问那个倒计时的显示怎么做到个位和十位同时显示呢

追答

你的显示程序,有错。
……
XIANGSH2:
MOV DPTR, #SEGTAB ;调入代码
MOV A, R7
MOVC A, @A + DPTR
MOV P2, A ;显示十位
SETB P3.4 ;选择显示十位的数码管
LCALL DLAY
CLR P3.4
MOV A, R6
MOVC A, @A + DPTR
MOV P2, A ;显示个位
SETB P3.3 ;选择显示个位的数码管
LCALL DLAY
CLR P3.3
RET

试试看。

追问

谢谢,已经好了很多了,但是是一起在跳动,选手按下后,倒计时的就看不到了,我想可能是延时的问题吧,但我调了好久都不行,可以再帮帮忙吗,非常感谢
DLAY: MOV 32H,#43H
LOOP5: MOV 33H,#1EH
LOOP4:DJNZ 33H,LOOP4
DJNZ 32H,LOOP5
RET

追答

延时程序,并没有错误。
前面的扫描程序,倒可以大幅度化简。

但是,显示闪烁的问题,并不在这几个程序里面。

追问

恩嗯,小菜鸟一个看不出问题所在,可以帮我看看到底是那里的问题吗,可以给你的邮箱我吗,或者你直接发一个邮件我的邮箱我回复你。191284972@qq.com 谢谢

追答

我在我的百度空间,留有邮箱。

本回答被提问者采纳

8路抢答器,显示的结果总是一半,做不好,请高手帮忙修改一下,这是我...
十位只显示了DLAY子程延时时间,显示子程结束时都停留在显示个位上,如果XIANSH1显示子程调用不是太频繁则基本上看不到十位的显示效果,因为在一个调用周期内十位只显示了DLAY子程延时时间,其余时间都在显示个位内容。

相似回答