哥哥些,上次问过大家的抢答器程序我已基本完成只是在时间调节显示时,显示会出现乱码,程序设定的0减1跳到99,显示的确是其他的,还有就是调节完了后,按开始抢答键计时器要经过10S左右才开始计时,程序如下: ;***********************抢答器程序********************* ;程序包含初始化模块,显示模块(等待状态,错误抢答显示,正常抢答显示,答题时间显示 ;时间调整显示),键盘扫描模块(错误答题,正常抢答) ;寄存器分配:30h:抢答剩余时间暂存,31h答题剩余时间暂存,32h选手号暂存,33h抢答时间调整,34h答题时间调整 ;35h鹗S嗍奔湓荽妫?6h剩余时间暂存 ;单片机IO分配,p0:抢答键接口,p1:段选,p2:片选,p3.0:抢答开始,p3.1:抢答结束。 ;外中断0:抢答时间调整,外中断1 ;单片机晶振6M ;七段数码管为共阳3为;为高两位显示时间,低位显示选手号 ;****************************************************************************************************** org 0000h ljmp main org 0003h ljmp qdt; 抢答时间调节 org 000bh ljmp timerq; 抢答时间剩余计时器 org 0013h ljmp dtq; 答题时间调节 org 001bh ljmp timerd; 答题剩余时间计时器 org 0040h main: mov ie,#8fh; 初始化 mov tmod,#22h mov ip,#01h mov th0,#06h mov tl0,#06h mov tl1,#06h mov th1,#06h mov ip,#01h mov 30h,#30 mov 31h,#90 mov 32h,#71h mov 33h,#30 mov 34h,#90 ;*******定时器寄存器********** mov 35h,#0 mov 36h,#0 mov 37h,#0 mov 38h,#0 mov r0,#0; 抢答处理寄存器 mov sp,#60h ;**************调试用********************* ; mov p3,#7fh ; mov p0,#7fh ; mov p3,#0feh ;****************主程序************************* loop: lcall display jnb p3.0 ,jp; 判断抢答是否开始 lcall k11 ajmp loop jp: lcall dly jb p3.0,loop lcall jp1 ;**********错误抢答检查************************ k1: lcall dly jb p0.0,k22 mov 32h,#1 ljmp disp2 k2: lcall dly jb p0.1,k33 mov 32h,#2 ljmp disp2 k3: lcall dly jb p0.2,k44 mov 32h,#3 ljmp disp2 k4: lcall dly jb p0.3,k55 mov 32h,#4 ljmp disp2 k5: lcall dly jb p0.4,k66 mov 32h,#5 ljmp disp2 k6: lcall dly jb p0.5,k77 mov 32h,#6 ljmp disp2 k7: lcall dly jb p0.6,k88 mov 32h,#7 ljmp disp2 k8: lcall dly jb p0.7,loop mov 32h,#8 ljmp disp2 k11: jnb p0.0,k1 k22: jnb p0.1,k2 k33: jnb p0.2,k3 k44: jnb p0.3,k4 k55: jnb p0.4,k5 k66: jnb p0.5,k6 k77: jnb p0.6,k7 k88: jnb p0.7,k8 ret ;**************抢答处理*************************** jp1: setb tr0 mov r2,30h cc: lcall display2; 无人抢答显示 mov a,p0 orl a,#00h cpl a cjne a,#01h,jp22 mov 32h,#1 ljmp display1;正常抢答显示 jp22: cjne a,#02h,jp33 mov 32h,#2 ljmp display1 jp33: cjne a,#04h,jp44 mov 32h,#3 ljmp display1 jp44: cjne a,#08h,jp55 mov 32h,#4 ljmp display1 jp55: cjne a,#10h,jp66 mov 32h,#5 ljmp display1 jp66: cjne a,#20h,jp77 mov 32h,#6 ljmp display1 jp77: cjne a,#40h,jp88 mov 32h,#7 ljmp display1 jp88: cjne a,#80h,jp1 mov 32h,#8 ljmp display1 ajmp cc ;****************正常抢答显示*************** ;抢答剩余时间停止计时,答题剩余时间开始计时 display1: clr tr0 setb tr1 mov dptr,#tab mov r2,31h; 判断答题剩余时间 cjne r2,#0,lp1 next: mov 31h,34h mov 30h,33h clr tr1 ljmp loop lp1: jnb p3.1,wc33; 判断主持人是否按下重启键 mov a,31h mov b,#10 div ab movc a,@a+dptr mov p1,a mov p2,#01h lcall dly mov p1,#0ffh mov a,b movc a,@a+dptr mov p1,a mov p2,#02h lcall dly mov p1,#0ffh mov a,32h movc a,@a+dptr mov p1,a mov p2,#04h lcall dly mov p1,#0ffh ajmp display1 wc33: lcall dly jb p3.1,lp1 setb p3.6 ajmp next ;***********无人抢答显示********* ;抢答剩余时间开始计时, display2: mov r2,30h cjne r2,#0,wc4 CLR tr0 mov 30h,33h ajmp wc444 wc4: jnb p3.1,wc44 mov dptr,#tab mov a,30h mov b,#10 div ab movc a,@a+dptr mov p1,a mov p2,#01h lcall dly mov p1,#0ffh mov a,b movc a,@a+dptr mov p1,a mov p2,#02h lcall dly mov p1,#0ffh mov p1,#8eh mov p2,#04h lcall dly mov p1,#0ffh ret wc44: lcall dly jb p3.1,display2 wc444: clr tr0 mov 30h,33h setb p3.6 ljmp loop ;*************初始化显示*********** ;数码管显示F display: mov p1, #8eh mov p2,#0ffh ret ;************错误抢答显示********* disp2: clr p3.6 mov dptr,#tab jnb p3.1,ww mov p1,#8eh mov p2,#01h lcall dly mov p1,#0ffh mov p1,#8eh mov p2,#02h lcall dly mov p1,#0ffh mov a,32h movc a,@a+dptr mov p1,a mov p2,#04h lcall dly mov p1,#0ffh ajmp disp2 ww: lcall dly jb p3.1,disp2 setb p3.6 ljmp loop ;********t0程序抢答剩余时间计时 timerq: inc 35h mov r3,35h cjne r3,#200,fh mov 35h,#0 inc 37h mov r3,37h cjne r3,#20,fh mov 37h,#0 dec 30h mov r3,30h cjne r3,#10,fh clr p3.6 fh: reti timerd: inc 36h mov r3,36h cjne r3,#200,fh1 mov 36h,#0 inc 38h mov r3,38h cjne r3,#20,fh dec 31h mov 38h,#0 mov r3,31h cjne r3,#9,fh clr p3.6 fh1: reti ;************抢答剩余时间调节************* qdt: push psw push 0 push 1 push 2 push 3 push 4 push 5 push 6 push 7 push acc clr ex0 lop11: jnb p3.0,ad1 jnb p3.1,sub1 jnb p3.2,fhx0 lcall dis ajmp lop11 ad1: lcall dly jb p3.0,lop11 jnb p3.0,$; 放键检查 inc 33h mov 30h,33h mov r0,30h cjne r0,#99,lop11 mov 33h,#00h mov 30h,33h lcall dis ajmp lop11 sub1: lcall dly jb p3.1,lop11 jnb p3.1,$ dec 33h mov 30h,33h mov r0,30h cjne r0,#00h,lop11 mov 33h,#99 mov 30h,33h lcall dis ajmp lop11 fhx0: ;lcall dly ; jb p3.2,lop11 ; jnb p3.2,$ pop acc pop 7 pop 6 pop 5 pop 4 pop 3 pop 2 pop 1 pop 0 pop psw setb ex0 reti ;*************答题剩余时间调节******** dtq: push psw push 0 push 1 push 2 push 3 push 4 push 5 push 6 push 7 push acc clr ex1 lop12: jnb p3.3,fhx1 jnb p3.0,ad11 jnb p3.1,sub11 lcall dis1 ajmp lop12 ad11: lcall dly jb p3.0,lop12 jnb p3.0,$ inc 34h mov 31h,34h mov r0,31h cjne r0,#99,lop12 mov 34,#00h mov 31h,34h lcall dis1 ajmp lop12 sub11: lcall dly jb p3.1,lop12 jnb p3.1,$ dec 34h mov 31h,34h mov r0,34h cjne r0,#00h,lop12 mov 34h,#99 mov 31h,34h lcall dis1 ajmp lop12 fhx1: ;lcall dly ; jb p3.3,lop12 ; jnb p3.3,$ pop acc pop 7 pop 6 pop 5 pop 4 pop 3 pop 2 pop 1 pop 0 pop psw setb ex1 reti ;*********时间调整显示********** dis: mov 37h,30h lcall disp ret dis1: mov 37h,31h lcall disp ret disp: mov dptr,#tab mov a,37h mov b,#10 div ab movc a,@a+dptr mov p1,a mov p2,#01h lcall dly mov p1,#0ffh mov a,b movc a,@a+dptr mov p1,a mov p2,#02h lcall dly mov p1,#0ffh mov p1,#8eh mov p2,#04h lcall dly mov p1,#0ffh ret 在线等,谢谢大家了 |