×
单片机 > 单片机程序设计 > 详情

四个按键控制四个数字递增

发布时间:2020-08-26 发布时间:
|

电路:

采用AT89S52单片机。

P3.0到P3.3外接四个按键。
P3.4到P3.7是控制四个数码管的位选端口,P1口是数码管的段选端口。

要求:

初始数字都是0。
每按一次第一个按键第一个数字 + 1;
每按一次第二个按键第二个数字 + 2;
每按一次第三个按键第三个数字 + 3;
每按一次第四个按键第四个数字 + 4。

;===================================================
最佳答案:

按照要求,用PROTEUS绘制电路,并仿真,效果截图如下:

控制程序用汇编语言编写,下列程序,已经调试成功:

    ORG  0000H
    JMP  START

START:
    MOV  30H, #0
    MOV  31H, #0
    MOV  32H, #0
    MOV  33H, #0
;----------------------------
M_LOOP:
    CALL DISP 
    MOV  P3, #0FH
    MOV  A, P3       ;读入按键信息.
    CPL  A
    ANL  A, #0FH
    JZ   M_LOOP      ;没有按键就循环显示.
;--------------------
    CALL DISP        ;延时消抖.
    MOV  P3, #0FH
    MOV  A, P3
    CPL  A
    ANL  A, #0FH
    JZ   M_LOOP      ;再次确认.
    MOV  B, #1
    JB   ACC.0,  J1  ;分支.
    JB   ACC.1,  J2
    JB   ACC.2,  J3
    JB   ACC.3,  J4
    JMP  M_LOOP
;------------------下面计算加1234
J4: INC  B
J3: INC  B
J2: INC  B
J1: MOV  A, #2FH
    ADD  A, B
    MOV  R0, A
    MOV  A, @R0
    ADD  A, B
    MOV  B, #8
    DIV  AB
    MOV  @R0, B
;------------------下面等待按键释放.
J_J:
    CALL DISP 
    MOV  P3, #0FH
    MOV  A, P3
    ORL  A, #0F0H
    CPL  A
    JNZ  J_J
    JMP  M_LOOP
;------------------下面是显示程序
DISP:
    MOV  R0, #30H
    MOV  R2, #10H
D_LOOP:
    MOV  A,  @R0
    INC  R0
    ADD  A,  #(D_TAB - $ - 3)
    MOVC A, @A + PC
    MOV  P3, #0FH
    MOV  P1, A
    MOV  P3, R2
    CALL DELAY
    MOV  A,  R2
    RL   A
    MOV  R2, A
    CJNE R2, #1, D_LOOP
    RET
;----------------------------
D_TAB: 
    DB  0C0H, 0F9H, 0A4H, 0B0H,  99H,  92H, 82H, 0F8H
    DB   80H,  90H,  88H,  83H, 0C6H, 0A1H, 86H,  8EH, 0FFH ;FF是空白的代码.
;---------------------------------------
DELAY:
    MOV  R6, #20
D1: MOV  R7, #250
    DJNZ R7, $
    DJNZ R6, D1
    RET
;---------------------------------------
END

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

后记:
提问者的电路已经做成了 PCB 板子,显示部分的实际电路是采用了三极管反相器来进行位驱动。
因此,显示程序应该做如下修改:

;------------------下面是显示程序
DISP:
    MOV  R0, #30H
;    MOV  R2, #10H
    MOV  R2, #0EFH
D_LOOP:
    MOV  A,  @R0
    INC  R0
    ADD  A,  #(D_TAB - $ - 3)
    MOVC A, @A + PC
;    MOV  P3, #0FH
    MOV  P3, #255
    MOV  P1, A
    MOV  P3, R2
    CALL DELAY
    MOV  A,  R2
    RL   A
    MOV  R2, A
;    CJNE R2, #1, D_LOOP
    CJNE R2, #254, D_LOOP
    RET
;----------------------------

把修改后的程序通过电子邮件进行传递,稍候即有邮件回复:
太牛了  我弄了好几天了 。。没弄好。。谢谢 行啦。一次就烧录成功了!非常感谢。。
程序工作在实际的电路板上的照片如下:




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会