;单片机汇编语言编程:汽车转向灯控制器

来源:互联网 发布:svg3dtagcloud.js 编辑:程序博客网 时间:2024/05/16 18:04

;刚才在百度知道上看到一个题目:http://zhidao.baidu.com/question/439326240.html

;转眼之间,知道宝贝又找不到了,百度真是变化莫测。

;呵呵,做而论道已经提前一步保存下来了题目的要求。

;=================================================

;题目:汽车转向灯控制器的编程

;1号键(左转向)按下时 实现P3.6闪亮,P0-P2口左流水;
;2号键(右转向)按下时 实现P3.7闪亮,P0-P2口右流水;
;3号键(刹车键)按下时 实现P0-P2口同时亮;
;4号键(紧急状况键) 按下时 实现P3.6和P3.7同时闪亮。

;按键按住时,执行上述程序,按键松开后关闭所有灯。

;=================================================

;按照题目要求,做而论道编写了程序,用 PROTEUS 绘出了仿真电路图,运行起来如下所示:

;单片机汇编语言编程:汽车转向灯控制器 - 非著名博主 - 电子信息角落

;图片链接:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/b4f3e2dea9ec8a134811484bf703918fa1ecc077.html#

;程序如下:

L_T   BIT  00H     ;按键标志位
R_T   BIT  01H
S_T   BIT  02H
J_J   BIT  03H

SAME  EQU  30H    ;按键缓冲区
Runw  EQU  31H     ;31H 32H,共16位数,当做流水灯
SP_B  EQU  33H     ;栈底位置
;--------------------------------
    ORG   0000H
    SJMP  START
    ORG   000BH
    SJMP  T0_INT
;--------------------------------
START:
    MOV   TMOD, #01H
    MOV   TH0, #4CH    ;定时
    MOV   R3, #5       ;250ms闪烁一次
    SETB  TR0
    MOV   IE, #82H     ;开中断
    MOV   SP, #SP_B
    MOV   Runw, #255
    MOV   Runw + 1, #0
;--------------------------------
M_LOOP:
    MOV   A, P1        ;读一次按键
    ANL   A, #0FH
    MOV   SAME, A      ;保存

    MOV   R7, #40      ;延时约20ms
    MOV   R6, #0
    DJNZ  R6, $
    DJNZ  R7, $ - 4

    MOV   A, P1        ;再读一次按键
    ANL   A, #0FH
    CJNE  A, SAME, M_LOOP ;两次不等则是抖动

    CPL   A
    MOV   C, ACC.3     ;保存按键信息
    MOV   R_T, C
    MOV   C, ACC.2
    MOV   J_J, C
    MOV   C, ACC.1
    MOV   S_T, C
    MOV   C, ACC.0
    MOV   L_T, C
   
    SJMP  M_LOOP       ;继续去读
;--------------------------------
T0_INT:
    MOV   TH0, #4CH    ;定时
    PUSH  ACC
    DJNZ  R3, T0_END   ;不到5次就退出
    MOV   R3, #5
;----------------------;以下每隔250ms执行一次
LEFT:                 
    JNB   L_T, RIGHT
    MOV   A, Runw
    RRC   A
    MOV   Runw, A
    MOV   A, Runw + 1
    RRC   A
    MOV   Runw + 1, A
    MOV   A, Runw
    MOV   ACC.7, C
    MOV   Runw, A

    MOV   P2, Runw
    MOV   P0, Runw + 1
    SETB  P3.7
    CPL   P3.6
    JMP   T0_END
RIGHT:
    JNB   R_T, STOP
    MOV   A, Runw
    RLC   A
    MOV   Runw, A
    MOV   A, Runw + 1
    RLC   A
    MOV   Runw + 1, A
    MOV   A, Runw
    MOV   ACC.0, C
    MOV   Runw, A

    MOV   P2, Runw
    MOV   P0, Runw + 1
    CPL   P3.7
    SETB  P3.6
    JMP   T0_END
STOP:
    JNB   S_T, JINJI
    MOV   P2, #0
    MOV   P0, #0
    SETB  P3.7
    SETB  P3.6
    JMP   T0_END
JINJI:
    JNB   J_J, NOTHING
    MOV   P2, #255
    MOV   P0, #255
    CPL   P3.7
    CPL   P3.6
    JMP   T0_END
NOTHING:               ;关闭所有的灯
    MOV   P2, #255
    MOV   P0, #255
    SETB  P3.7
    SETB  P3.6
T0_END:
    POP   ACC
    RETI
;--------------------------------

    END

;试验的时候,应该释放了前一个按键,再按下另一个按键,这才能有理想的结果。

0 0
原创粉丝点击