×
嵌入式 > 技术百科 > 详情

KEY_按键示例程序

发布时间:2020-06-18 发布时间:
|

KEY_按键示例程序

;*************************************************************

   #include ht48c10.inc
;------------------------------------------------------------------------data

            data  .section  'data'           ;数据段
            temp  db  ?                   ; 暂时数据寄存器
            disp   db  ?                  ; 键值显示寄存器
            count1 db  ?                   ; 延时计数指针
            mask  db  ?                   ; 屏蔽寄存器
           matrix  db  ?                   ; 键盘阵列寄存器
            temp1  db ?
            temp2  db ?
;------------------------------------------------------------------------------------------------------code
         code     .section   at  0 'code'     ;程序段
                   org 00h                 ; ISR 地址初始
                    jmp       start
             start:                         ; 程序开始
                   clr     pbc             ; 设置PB口为输出口
                   MOV     a,   0f0h   ;(1)  ; 设置PA高4位为输入口                       
                                           ; 设置PA低四位为输出口
                   MOV     PAC,  a          ;
                   clr      pa              ; 清PA 口
                   set      pb              ; 清PB 口
         keyloop:                           ; 键扫描循环
                  MOV     a,  0feh     ;(2) ;扫描第一行是否被按下
                  MOV    matrix,   a        ; 将第一行的代码送matrix
                  MOV    pa,      a        ; 输出扫描码到PA 口
                  MOV    a,       pa       ; 读入PA口 的状态到ACC
                  xor  a,      0feh      ;屏蔽高四位,取出键所在的列
                   sz    acc               ; 第一行是否有键按下
                  jmp   get_key            ;有键按下跳到读键值
                  MOV     a,     0fdh   ;(2) ; 扫描第二行是否被按下
                  MOV     matrix,  a       ; 将第二行的代码送matrix
                  MOV     pa,     a       ;
                  MOV     a,     pa       ;
                  xor     a,     0fdh     ;
                  sz      acc ;
                  jmp    get_key         ;
                  MOV   a,      0fbh  ;(2) ; 扫描第三行是否被按下
                  MOV matrix,   a         ; 将第三行的代码送matrix     
                  MOV    pa,    a         ;
                  MOV    a,    pa         ;
                  xor    a,   0fbh        ;
                  sz       acc           ; 
                  jmp   get_key          ;
                  MOV   a,   0f7h   ;(2)    ; 扫描第四行是否被按下
                  MOV   matrix,  a         ; 将第三行的代码送matrix
                  MOV      pa,  a         ;
                  MOV     a,    pa        ;
                   xor     a,   0f7h       ;
                 sz     acc               ;
                 jmp     get_key          ;
                 jmp     keyloop          ;?跳到键循环扫描
         get_key:                  ;  取键值
                  call    key_in                ;(3) ;  调用key_in 子程序
                 
                 MOV   pb,     a      ;(11) ; 从PB口显示键值
                 jmp  keyloop            ; 跳到键循环扫描
                 key_in proc              ; 键值读入子程序
                 MOV      a,  pa ;
                 MOV   temp,   a      ;(4) ; 将PA口的状态读入的 temp寄存器中
                 MOV   temp1,a
                 MOV    temp2,a
                call delays           ;(5) ; 调用延时子程序
      get_release:                        ; 等待键松开
                MOV    a,  pa           ;将PA口的主状态值送ACC
                 
                 and   a,  0f0h
                  xor a,0f0h         ; 屏蔽ACC高四位,取按键状态
                 sz     acc         ;(6) ; 等键松开 , 键如松开则acc=0
                 jmp   get_release       ;  
                MOV    a,   0fh          ; 取屏蔽寄存器的低四位
               andm   a,  temp        ;
                  MOV   a,temp
                   MOV    a,    0  
                 set  c         ;
     get_row:                            ; 取行数
               rrc      temp          ;(7) ; 右移 matrix 指针
               snz      status.0             ; 检查并取键行
              jmp      get_column1            ; 如果找到键行,跳到 get_next 
               clr      c                  ; 如果还未找到键行,清carry_c
              add      a,   4h         ;(8) ; 加4到显示指针
              jmp        get_row          ;  跳回get_row
        
     get_column1:                            ; 取列值
               MOV   temp,a
                MOV    a,0f0h
               andm   a, temp2
               swap   temp2
               MOV   a,0h
       get_column: 
                rrc temp2
                snz   status.0
                jmp   next
                clr c
                add   a,1h
                 jmp  get_column
          next:  add  a,temp
                  xor  a,0ffh
              ret
        key_in endp
       delays proc                           ; 延时子程序
               MOV    a,  0ffh ;
               MOV    count1,     a          ;
           d1:
              sdz     count1
              jmp     d1
          ret
         delays endp
            org 300h ; light up table
            dc 0ffh, 0feh, 0fdh, 0fch
            dc 0fbh, 0fah, 0f9h, 0f8h
            dc 0f7h, 0f6h, 0f5h, 0f4h
        dc 0f3h, 0f2h, 0f1h, 0f0h
   end



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

热门文章 更多
Semtech的LoRa技术携手Chipsafer将牧场连接至云端