按照题目要求,编写了程序,用PROTEUS绘出了仿真电路图。
;题目:汽车转向灯控制器的编程
;1号键(左转向)按下时实现P3.6闪亮,P0-P2口左流水;
;2号键(右转向)按下时实现P3.7闪亮,P0-P2口右流水;
;3号键(刹车键)按下时实现P0-P2口同时亮;
;4号键(紧急状况键)按下时实现P3.6和P3.7同时闪亮。
;按键按住时,执行上述程序,按键松开后关闭所有灯。
;=============================================
;按照题目要求,编写了程序,用PROTEUS绘出了仿真电路图,运行起来如下所示:
;程序如下:
L_TBIT00H;按键标志位
R_TBIT01H
S_TBIT02H
J_JBIT03H
SAMEEQU30H;按键缓冲区
RunwEQU31H;31H32H,共16位数,当做流水灯
SP_BEQU33H;栈底位置
;--------------------------------
ORG0000H
SJMPSTART
ORG000BH
SJMPT0_INT
;--------------------------------
START:
MOVTMOD,#01H
MOVTH0,#4CH;定时
MOVR3,#5;250ms闪烁一次
SETBTR0
MOVIE,#82H;开中断
MOVSP,#SP_B
MOVRunw,#255
MOVRunw+1,#0
;--------------------------------
M_LOOP:
MOVA,P1;读一次按键
ANLA,#0FH
MOVSAME,A;保存
MOVR7,#40;延时约20ms
MOVR6,#0
DJNZR6,$
DJNZR7,$-4
MOVA,P1;再读一次按键
ANLA,#0FH
CJNEA,SAME,M_LOOP;两次不等则是抖动
CPLA
MOVC,ACC.3;保存按键信息
MOVR_T,C
MOVC,ACC.2
MOVJ_J,C
MOVC,ACC.1
MOVS_T,C
MOVC,ACC.0
MOVL_T,C
SJMPM_LOOP;继续去读
;--------------------------------
T0_INT:
MOVTH0,#4CH;定时
PUSHACC
DJNZR3,T0_END;不到5次就退出
MOVR3,#5
;----------------------;以下每隔250ms执行一次
LEFT:
JNBL_T,RIGHT
MOVA,Runw
RRCA
MOVRunw,A
MOVA,Runw+1
RRCA
MOVRunw+1,A
MOVA,Runw
MOVACC.7,C
MOVRunw,A
MOVP2,Runw
MOVP0,Runw+1
SETBP3.7
CPLP3.6
JMPT0_END
RIGHT:
JNBR_T,STOP
MOVA,Runw
RLCA
MOVRunw,A
MOVA,Runw+1
RLCA
MOVRunw+1,A
MOVA,Runw
MOVACC.0,C
MOVRunw,A
MOVP2,Runw
MOVP0,Runw+1
CPLP3.7
SETBP3.6
JMPT0_END
STOP:
JNBS_T,JINJI
MOVP2,#0
MOVP0,#0
SETBP3.7
SETBP3.6
JMPT0_END
JINJI:
JNBJ_J,NOTHING
MOVP2,#255
MOVP0,#255
CPLP3.7
CPLP3.6
JMPT0_END
NOTHING:;关闭所有的灯
MOVP2,#255
MOVP0,#255
SETBP3.7
SETBP3.6
T0_END:
POPACC
RETI
;--------------------------------
END
;试验的时候,应该释放了前一个按键,再按下另一个按键,这才能有理想的结果。