您的位置:首页单片机合泰单片机
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

KEY_按键示例程序

[日期:2008-01-17 ] [来源: 作者:] [字体: (投递新闻)


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

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

 

阅读:
录入:JETTA

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
站长推荐