赞助论坛
  • 3508阅读
  • 0回复

学习单片机之---4*4键盘程序 [复制链接]

楼层直达
jswr  
发帖
339
精华
1
金币
264
威望
8
贡献
7
好评
15
注册
2008-06-30
楼主    jswr 发表于: 2008-08-05 14:49:03 
4*4键盘程序
Posted by 光明之子 2005-12-31 12:57:57
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 4*4键盘程序
        ;******************************************************
                ;* 名称:readkyeboard
                ;* 功能:从键盘中读入按键值,存入寄存器A
              ;* 调用函数: key_on   delay10ms   key_p key_ccode
                ;* 输入:
                ;* 输出: A=按键值
                ;* 使用的寄存器:R2,R3,R5,R6,R7
        ******************************************************
readkeyboard:
  begin: acall key_on           ;判断有无键按下
      jnz   delay
      ajmp readkeyboard
  delay:acall delay10ms           ;消除抖动
    acall key_on
      jnz   key_num           ;有键按下,转定按键位置
      ajmp begin
  key_num:acall key_p           ;调定键位置子程序
      anl a,#0FFh
      jz begin               ; 出错继续扫描
      acall key_ccode           ;对按键编码
    push a
  key_off:acall key_on           ;等待按键释放
      jnz   key_off
      pop a
        ret
        ;<<<<<<<<< 判断是否有键按下子程序
        key_on: mov a,#00h
      orl a,#0fh
    mov p1,a
    mov a,p1
      orl a,#0f0h
      cpl a
      ret
        ;<<<<<<<<<<<<<<编码程序
        key_p:
      mov r7,#0efh     ; R7存列扫描值
  l_loop:mov a,r7
      mov p1,a
    mov a,p1
      orl a,#0f0h
      mov r6,a       ; R6存行读入值
      cpl a
      jz next
      ajmp key_c
  next: mov a,r7
    jnb acc.7,error
      rl a
      mov r7,a
      ajmp l_loop
  error:mov a,#00h
      ret
  key_c:mov r2,#00h ;r2 行号
      mov r3,#00h ;r3 列号
      mov a,r6
      mov r5,#04h
again1:jnb acc.0,out1
      rr a
      inc r2
    djnz r5, again1
  out1: inc r2
      mov a,r7
    mov r5,#04h
again2:jnb acc.4,out2
      rr a
      inc r3
      djnz r5,again2
  out2: inc r3
      mov a, r2
      swap a
      add a,r3
      ret

        ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<解码程序
        key_ccode:
      push a
      swap a
      anl a,#0fh
      dec a
      rl a     ;行号乘4
      rl a
      mov r7,a
      pop a
    anl a,#0fh
      dec a
      add a,r7
      ret


        ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<延时10Ms
        delay10ms:
    anl tmod,#0f0h
  orl tmod,#01h

  mov th0,#0d8h
    mov tl0,#0f0h
    setb tr0
wait:jbc tf0,over
    ajmp wait
    clr tr0
  over:ret