51单片机 求助

来源:百度知道 编辑:UC知道 时间:2024/06/08 16:59:03
我是刚学的 编了一个程序能测试过去 就是不能在实验版上显示结果 好郁闷啊 有哪位大虾帮我看看 指点一下 看看是哪里出问题了 谢谢

org 00h
ajmp start
org 0050h
start:mov a,p3
anl a,#0fh
cjne a,#0f0h,ben
sjmp start
ben:lcall d10ms ;10ms消除抖动
mov a,p3
anl a,0fh
cjne a,0fh,qq
sjmp start
qq:jb p3.0,key2 ;开关1按下没有
ljmp k1
key2:jb p3.1,key3 ;开关2按下没有
ljmp k2
key3:jb p3.2,key4 ;开关3按下没有
ljmp k3
key4:jb p3.3,do ;开关4按下没有
ljmp k4
do:sjmp start ;返回
d10ms:nop ;抖动的延时
lop2:mov r0,#20
lop:mov r1,#100
nop
nop
nop
djnz r1,lop
djnz r0,lop2
ret
k1:mov p1,#00h ;开关1的子程序 8盏 灯全亮
ret
k2:mov p1,#0ffh ;开关2的子程序 8盏灯全灭
ret
k3:nop ;开关3的子程序 8盏灯闪烁 我用的延时程序就是一直在反复查询P3口的0
xc:mov p3,#00h
lcall d20ms
jb p3.0,f1
sjmp hh
f1:jb p3.1,f2
sjmp hh

将你的电路图贴上来才知道怎么做,用51来控制200个LED,还是比较困难的。

建议一个键一个键的调试,我也刚做过不久,现在基本上大家都用c语言写程序了,用汇编有点繁琐吧?
一般是按键程序加个抖动延时,弹开的时候再加个延时,基本上就没问题了
下面是平凡写的键控流水灯,你看看,应该有帮助的,我试过了,可以用的,里面还有注释,
UpDown EQU 00H ;上下行标志
StartEnd EQU 01H ;起动及停止标志
LAMPCODE EQU 21H ;存放流动的数据代码
ORG 0000H
AJMP MAIN
ORG 30H
MAIN:
MOV SP,#5FH
MOV P0,#0FFH
CLR UpDown ;启动时处于向上的状态
CLR StartEnd ;启动时处于停止状态
MOV LAMPCODE,#0FEH ;单灯流动的代码
LOOP:
ACALL KEY ;调用键盘程序
JNB F0,LNEXT ;如果无键按下,则继续
ACALL KEYPROC ;否则调用键盘处理程序
LNEXT:
ACALL LAMP ;调用灯显示程序
AJMP LOOP ;反复循环,主程序到此结束
;---------------------------------------
DELAY:
MOV R7,#10
D1: MOV R6,#100
DJNZ R6,$
DJNZ R7,D1
RET
;---------延时程序,键盘处理中调用
KEYPROC:
MOV A,B ;从B寄存器中获取键值
JB ACC.2,KeyStart ;分析键的代码,某位被按下,则该位为1
JB ACC.3,KeyOver
JB ACC.4,KeyUp
JB ACC.5,KeyDown
AJMP KEY_RET
KeyStart:
SETB StartEnd ;第一个键按下后的处理
AJMP