单片机程序设计之人机交互界面程序的完整设计 | 太极博弈原理官方站|紫欽天|融通百科为我所用|生活全智慧|生活智慧之书

正在阅读:

单片机程序设计之人机交互界面程序的完整设计

1,172

人机交互界面程序的完整设计

           通过以上几课的学习,我们已经初步掌握了按键,显示器,中断程序的设计,下面我们来设计一个完整的人机交互程序,任务如下:

       当实验板开机时,段码管显示器显示”8951”,当有键按下时,显示器显示所有按键,并且从右向左移动,如果10秒内没有键按下,又回到原来的显示状态,显示”8951”,

     思路:至于按键和段码管显示器的程序,上面已经有实例了,10秒的程序怎样做呢?用延时吗?如果在延时时,有键按下怎幺办?用延时去做10秒的定时可能有些麻烦,因此用中断是首选的方式,只要注意中断的开关即可,我们用T0模式1产生20毫秒定时,当中断500次时,10秒定时时间到,下面我们不妨来试一是:

        主程序如下: (程序编号为:LEDKEY02.ASM)

   说明:50---53H 用作显示缓冲区; 71—72H用作中断计数区

           

        OVERFLAG              EQU  70H               ;10秒定时到标志,1为有效

        KEYFLAG         EQU  69H                ;按键按下标志,1为有效

        ORG     0000H

        LJMP    START

        ORG     000BH

        LJMP    TTT000

        ORG     0050H

START:

        LCALL INITI

        MOV    A,#0FFH                                  ;请按键

        MOV    P1,A

        MOV    P2,A                                  ;关显示

        MOV    R4,#04H

        MOV    R0,#50H

CLEAR:

        MOV    @R0,#00H

        INC      R0

        DJNZ    R4,CLEAR

START1:

        MOV    R3,#0F7H                   ;按键扫描码送R3

        MOV    R1,#00H                            ;先将按键值置0

START2:

        MOV    A,R3                           ;开始扫描按键

        MOV    P1,A

        MOV    A,P1                           ;读按键

        MOV    R4,A                           ;按键存入R4

        SETB    C

        MOV    R5,#04H                            ;按键扫描4

START3:

        RLC             A                                ;看有没有按键按下

        JNC      KEYIN

        INC      R1                                      ;没有,指针加一

        DJNZ    R5,START3                ;扫描四列了吗?

        LCALL DISPLAY

        MOV    A,R3                           ;扫描值送入A

        SETB    C

        RRC     A

        MOV    R3,A

        JC  START2                             ;4行扫描完了吗?

        MOV    A,OVERFLAG

        CJNE    A,#1,START1

        MOV    OVERFLAG, #0

        MOV    50H,#2

        MOV    51H,#5

        MOV    52H,#9

        MOV    53H,#8

        CLR      TR0

        LJMP    START1                             ;

KEYIN:

        MOV    R7,#70                               ;消抖延时程序

KEYIN1:

        MOV    R6,#200

        DJNZ    R6,$

        DJNZ    R7,KEYIN1

KEYIN2:

        MOV    A,P1                                  ;在次读按键

        XRL      A,R4                                  ;与前一次按键值比较

        JZ  KEYIN2                                          ;按键松开了吗?

        MOV    A,R1                                  ;

        MOV    DPTR,#TAB1                           ;查表

        MOVC A,@A+DPTR

        ;MOV   30H,A                                ;键值存在50H

        XCH     A,50H                                ;所有键值前移一位

        XCH     A,51H

        XCH     A,52H

        XCH     A,53H

        LCALL DISPLAY                          ;显示键值

        MOV    71H,#00H

        MOV    72H,#00H

        MOV    OVERFLAG, #0

        SETB    TR0

        LJMP    START1

DISPLAY:

        MOV    A,#0FH                             ;清第1个显示器

        ADD     A,#40H

        MOV    P2,A

        LCALL DELAY

        MOV    A,50H                         ;显示当前按键值            

        ADD     A,#40H

        MOV    P2,A

        LCALL DELAY

        MOV    A,#0FH                      ;清第2个显示器

        ADD     A,#10H

        MOV    P2,A

        MOV    A,51H                         ;显示第2个按键值

        ADD     A,#10H

        MOV    P2,A

        LCALL DELAY

        MOV    A,#0FH                      ;清第3个显示器

        ADD     A,#20H

        MOV    P2,A

        MOV    A,52H                         ;显示第3个按键值

        ADD     A,#20H

        MOV    P2,A

        LCALL DELAY

        MOV    A,#0FH                      ;清第4个显示器

        ADD     A,#30H

        MOV    P2,A

        MOV    A,53H                         ;显示第4个按键值

        ADD     A,#30H

        MOV    P2,A

        LCALL DELAY

 

        RET

DELAY:

        PUSH   07H

        PUSH   06H

        MOV    R7,#08H

DELAY1:

        MOV    R6,#200

        DJNZ    R6,$

        DJNZ    R7,DELAY1

        POP      06H

        POP      07H

        RET

INITI:

              MOV     P1,#0FFH

        MOV   P2,#00H

        MOV   P0,#00H

        MOV   P3,#00H

              MOV     OVERFLAG, #1

              MOV     KEYFLAG,#00H

              MOV     50H,#2

              MOV     51H,#5

              MOV     52H,#9

              MOV     53H,#8

        MOV   TMOD,#01H                     ;T0模式1

        MOV   TH0,#0B1H                ;定时20MS

              MOV     TL0,#0E0H                 ;

              SETB     ET0                      ;充许T0中断

              SETB     EA                       ;开所有中断

              CLR       TR0                            ;T0中断

        RET

TTT000:

              MOV     TL0,#0E0H                 ;;重设置定时参数

              MOV     TH0,#00B1H                     ;

        INC     71H                            ;;中断次数加1

              MOV     A,71H                         ;

              CJNE     A,#0FFH,RN00                 ;;中断255次吗?

              MOV     71H,#00H                   ;;是,清0

              INC       72H                            ;

        MOV   A,72H                         ;

              CJNE     A,#02H,RN00                   ;;中断1000次吗?

              MOV     72H,#00H                   ;;是

              MOV     OVERFLAG, #1

              MOV     KEYFLAG,#0H

RN00:

              RETI

TAB1:                                                     ;此表与按键对应

        DB 0DH,0EH,00H,0FH

        DB 0CH,07H,08H,09H

        DB 0BH,04H,05H,06H

        DB 0AH,01H,02H,03H

        END

 

抱歉,这篇文章关闭了评论功能。

关闭