⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jp01.asm

📁 我用单片机做的一个键盘电路,模仿键盘矩阵电路,大部分键能发信号.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
     CLR     P0.3
     CALL    YS50M
     CALL    YS50M
     CALL    YS50M
     CALL    YS50M
  MAINA3_122:
     SETB    P0.2
     SETB    P0.3
     RLC     A
   
     MOV    R7,#40D  ;延时2.5秒
    MAINA3_1222:              ;
      CALL   YS50M        ;
      DJNZ   R7,MAINA3_1222   ;
  
     
     MOV     P0.3,C
     CLR     P0.2


     MOV    R7,#40D  ;延时2.5秒
    MAINA3_112:              ;
      CALL   YS50M        ;
      DJNZ   R7,MAINA3_112   ;
      DJNZ   4DH,MAINA3_122
    SETB     P0.2
    SETB     P0.3
    
   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
     MOV     47H,#74H
     LJMP    EPD30
   EPD13:  
     CJNE    A,#00110011B,EPD14     ;KP /
     MOV     47H,#4AH
     LJMP    EPD30
   EPD14:  
     CJNE    A,#00111000B,EPD15     ;PG DOWN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
     MOV     4DH,#08H
     MOV     A,62H
     CPL     A
     CLR     P0.2
     CLR     P0.3
     CALL    YS50M
     CALL    YS50M
     CALL    YS50M
     CALL    YS50M
  MAINA3_123:
     SETB    P0.2
     SETB    P0.3
     RLC     A
   
     MOV    R7,#40D  ;延时2.5秒
    MAINA3_13:              ;
      CALL   YS50M        ;
      DJNZ   R7,MAINA3_13   ;
  
     
     MOV     P0.3,C
     CLR     P0.2


     MOV    R7,#40D  ;延时2.5秒
    MAINA3_113:              ;
      CALL   YS50M        ;
      DJNZ   R7,MAINA3_113   ;
      DJNZ   4DH,MAINA3_123
    SETB     P0.2
    SETB     P0.3
    
   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
     MOV     47H,#7AH
     LJMP    EPD30
   EPD15:  
     CJNE    A,#00111001B,EPD16     ;PG UP
     MOV     47H,#7DH
     LJMP    EPD30
   EPD16:  
     CJNE    A,#01000000B,EPD17     ;END
     MOV     47H,#69H
     LJMP    EPD30
   EPD17:  
     CJNE    A,#01000001B,EPD18     ;HOME
     MOV     47H,#6CH
     LJMP    EPD30
   EPD18:  
     CJNE    A,#01000010B,EPD19     ;LEFT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
     MOV     4DH,#08H
     MOV     A,60H
     CPL     A
     CLR     P0.2
     CLR     P0.3
     CALL    YS50M
     CALL    YS50M
     CALL    YS50M
     CALL    YS50M
  MAINA3_121:
     SETB    P0.2
     SETB    P0.3
     RLC     A
   
     MOV    R7,#40D  ;延时2.5秒
    MAINA3_114:              ;
      CALL   YS50M        ;
      DJNZ   R7,MAINA3_114   ;
  
     
     MOV     P0.3,C
     CLR     P0.2


     MOV    R7,#40D  ;延时2.5秒
    MAINA3_111:              ;
      CALL   YS50M        ;
      DJNZ   R7,MAINA3_111   ;
      DJNZ   4DH,MAINA3_121
    SETB     P0.2
    SETB     P0.3
    
   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
     MOV     47H,#6BH
     LJMP    EPD30
   EPD19:  
     CJNE    A,#01000100B,EPD20     ;UP
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
     MOV     4DH,#08H
     MOV     A,4EH
     CPL     A
     CLR     P0.2
     CLR     P0.3
     CALL    YS50M
     CALL    YS50M
     CALL    YS50M
     CALL    YS50M
  MAIN3_12:
     SETB    P0.2
     SETB    P0.3
     RLC     A
   
     MOV    R7,#40D  ;延时2.5秒
    MAIN3_1:              ;
      CALL   YS50M        ;
      DJNZ   R7,MAIN3_1   ;
  
     
     MOV     P0.3,C
     CLR     P0.2


     MOV    R7,#40D  ;延时2.5秒
    MAIN3_11:              ;
      CALL   YS50M        ;
      DJNZ   R7,MAIN3_11   ;
      DJNZ   4DH,MAIN3_12
    SETB     P0.2
    SETB     P0.3
    
   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
     MOV     47H,#75H
     LJMP    EPD30
   EPD20:  
     CJNE    A,#01000101B,EPD21     ;KP ENTER    
     MOV     47H,#5AH
     LJMP    EPD30
   EPD21:
     LJMP    EPD32
EPD30:
     JB      2DH.7,EPD31
     MOV     48H,#0E0H
     MOV     46H,#02H
     LJMP    EPD32
   EPD31:
     MOV     49H,#0E0H
     MOV     48H,#0F0H
     MOV     46H,#03H
   EPD32:
     RET  

YS20:                          ;延时20us子程序
     MOV     40H,#08D
     DJNZ    40H,$
     RET
YS30:                          ;延时30us子程序
      MOV    40H,#11D
      DJNZ   40H,$
      RET
YS40:                          ;延时40us子程序
      MOV    40H,#18D
      DJNZ   40H,$
      RET
YS50M:                         ;延时50ms子程序   
      MOV    41H,#0F0H
      MOV    42H,#28H
      YS50M1:
      NOP
      NOP
      NOP
      DJNZ   41H,YS50M1
      CALL   MAIN2
      CALL   MAIN3
      DJNZ   42H,YS50M1
      RET
YS50MA:                         ;延时50ms子程序   (纯的)
      MOV    41H,#0F0H
      MOV    42H,#28H
      YS50MA1:
      NOP
      NOP
      NOP
      DJNZ   41H,YS50MA1
      DJNZ   42H,YS50MA1
      RET

DDF:                 ;等待抑制释放子程序
      SETB   P0.0
      SETB   P0.1
      JNB    P0.0,DDF
      JNB    P0.1,DDF
      RET
     

FSA1:                      ;发送进位标志位子程序
      MOV    P0.1,C             ;进位标志位送到数据脚
      NOP                       ;延时5微秒
      NOP
      NOP
      NOP
      NOP
      CLR    P0.0               ;时钟脚变低
      CALL   YS40               ;调延时40微秒
      SETB   P0.0               ;时钟脚变高
      CALL   YS30               ;延时30微秒
      RET

FSB1:                     ;发送一个字节(R3)至主机子程序
      SETB   P0.0              ;准备读取时钟脚状态
      SETB   P0.1              ;准备读取数据脚状态
      JNB    P0.0,FSB1         ;时钟不为高跳
      JNB    P0.1,FSB1         ;数据不为高跳
      MOV    A,R3              ;要发送的字节送入a
      MOV    C,P               ;偶效验位存入进位标志位
      MOV    20H,C             ;偶效验位存入20h
      CPL    20H               ;转为奇效验位
      MOV    43H,#08H          ;装入发送位数为8位
      CLR    C                 ;发送位清零
      CALL   FSA1              ;发送起始位
   FSB2:                      ;发送数据位
         RRC    A               ;数据低位送c
         CALL   FSA1            ;发送c
         DJNZ   43H,FSB2        ;循环发送8位
      MOV    C,20H              ;发送奇校验位
      CALL   FSA1
      SETB   C                  ;发送停止位
      CALL   FSA1
      RET

SCANKEY:                    ;键扫描子程序
      MOV    P1,#0FFH
      MOV    P2,#0FFH
      MOV    P3,#0FFH

      MOV    R0,#50H
      MOV    R5,#00H
      MOV    R4,#00H
      CLR    P1.0          ;行口变低
      CLR    21H           ;选择p1口扫描
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;VVV
   SA01:   
      MOV    45H,#08H      ;设置行扫循环次数
                      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;VVV
   SA02:  
      MOV    P2,#0FFH
      NOP
      MOV    A,P2
      CPL    A
      MOV    2FH,A         ;p2口状态取反后暂存 位=1表示键接通
      MOV    A,@R0
      XRL    A,2FH
      MOV    2EH,A        ;p2口取反 与原状态异或后暂存
   
   
      MOV    R4,#00H      ;列地址清零
      MOV    44H,#08H     ;设置位扫8次
                                        ;;;;;;;;;;;;;;;;;;;;;;;;VVV
   SA03:   
      JNB    2EH.0,SA05    ;查看本位是否有变化 =1有变化继(变化情况)
                         ;键接通时先将待发指针加一然后将本位地址发至待发指针指向的地址
      MOV    A,R5        ;将行地址装入a
      MOV    B,#08H
      MUL    AB          ;将行地址左移3位
      ADD    A,R4        ;行地址与列地址相加 得到7位地址
      JB     2FH.0,SA04_1  ;查看新状态=1为接通变化跳过    (新状态)
      ADD    A,#10000000B  ;    新状态=0为断开变化执行地址7位置1
   SA04_1:   
      CJNE   R1,#3FH,SA04_2
      LJMP   SA05           ;发送缓冲满时跳过  
   SA04_2:
      INC    R1            ;发送缓冲不满时待发指针加一
      MOV    @R1,A         ;本位地址发至待发缓冲区
   SA05:
      INC    R4         ;键扫列地址加1
      MOV    A,2EH
      RR     A
      MOV    2EH,A      ;是否变化右环移
      MOV    A,2FH
      RR     A
      MOV    2FH,A       ;新状态右环移
      DJNZ   44H,SA03
                                        ;;;;;;;;;;;;;;;;;;;;;;;;AAA
      MOV    @R0,2FH     ;刷新p2口原状态
      INC    R0         ;p2口原状态指针加一
      INC    R5         ;键扫行地址加一
      
      DJNZ   45H,SA07_1  ;检查行循环是否到8次 =0到继
      LJMP   SA07
      SA07_1:
      JB     21H,SA06
      MOV    A,P1
      RL     A
      MOV    P1,A      ;下一行变低 扫描下一行
      LJMP   SA02
      SA06:
      MOV    A,P3
      RL     A
      MOV    P3,A
      LJMP   SA02
      SA07:
       
                    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAA
      JB     21H,SA08     ;p1/p3口扫描转换  =1选择p3口
      SETB   21H          
      MOV    P1,#0FFH     ;p1口停止扫描
      CLR    P3.0         ;准备扫描p3.0行点
      LJMP   SA01         ;跳至行扫描
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAA
      SA08:
      RET
      
   
    ;JJT:                     ;键接通时先将待发指针加一然后将本位地址发至待发指针指向的地址
    ;  MOV    A,R5        ;将行地址装入a
    ;  MOV    B,#08H
    ;  MUL    AB          ;将行地址左移4位
    ;  ADD    A,R4        ;行地址与列地址相加 得到7位地址
    ;                         ;键接通时先将待发指针加一然后将本位地址发至待发指针指向的地址
    ;  MOV    A,R4        ;将列地址(即p2口位地址)装入a
    ;  MOV    B,#10H      ;将列地址移至456位
    ;  MUL    AB
    ;  ADD    A,R5          ;与行地址的0123位相加
    ;  CJNE   R1,#3FH,JJT1
    ;  LJMP   JJT2          ;发送缓冲满时跳过  
    ;JJT1:
    ;  INC    R1            ;发送缓冲不满时待发指针加一
    ;  MOV    @R1,A         ;本位地址发至待发缓冲区
    ;JJT2:  
    ;  RET
    ;
    ;JDK:                    ;键断开时先将待发指针加一然后将本位地址发至待发指针指向的地址
    ;  MOV    A,R4        ;将列地址(即p2口位地址)装入a
    ;  MOV    B,#10H      ;将列地址移至456位
    ;  MUL    AB
    ;  ADD    A,R5          ;与行地址的0123位相加
    ;  ADD    A,#80H        ;将本键地址7位置一表示为本位的断开状态
    ;  CJNE   R1,#3FH,JDK1
    ;  LJMP   JDK2          ;发送缓冲满时跳过  
    ;JDK1:
    ;  INC    R1            ;发送缓冲不满时待发指针加一
    ;  MOV    @R1,A         ;本位地址发至待发缓冲区
    ;JDK2:  
    ;  RET

ORG  0500H      ;实发键值表
      BIA01:   DB   03H, 14H, 00H,0E0H,0E0H,0E0H,0E0H,0E1H    ;    F5, Z CTRL,   WAKE,  Y CTRL, SLEEP, YSTART,  POWER,PAUSE
      BIA02:   DB  0E0H, 00H,0E0H, 00H, 11H, 00H,0E0H, 7EH    ; PRINT,       ,  R ALT,        , L ALT,       , LSTART,S-LOCK
      BIA03:   DB   45H, 4EH, 4AH, 00H, 52H, 4CH, 54H, 4DH    ;     0,      -,      /,        ,     ',      ;,      [,    P
      BIA04:   DB   09H, 01H, 07H, 5AH, 78H, 5DH, 66H, 00H    ;   F10,     F9,    F12,   ENTER,   F11,      \,  SPACE,
      BIA05:   DB   00H, 00H, 00H, 00H, 00H, 59H, 12H, 00H    ;      ,       ,       ,        ,      ,R SHIFT,L SHIFT,
      BIA06:   DB   00H,0E0H,0E0H, 77H, 29H, 69H, 6BH, 6CH    ;      ,    DEL,   DOWN,     NUM,  APPS,    KP1,    KP4,  KP7
      BIA07:   DB   00H,0E0H,0E0H,0E0H, 70H, 72H, 73H, 75H    ;      , INSERT,  RIGHT,     KP/,   KP0,    KP2,    KP5,   KP8
      BIA08:   DB  0E0H,0E0H, 7BH, 7CH, 71H, 7AH, 74H, 7DH    ;PGDOWN,  PG UP,    KP-,     KP*,   KP.,    KP3,    KP6,   KP9
      BIA09:   DB  0E0H,0E0H,0E0H, 00H,0E0H,0E0H, 00H, 79H    ;   END,   HOME,   LEFT,        ,    UP,KPENTER,       ,   KP+
      BIA10:   DB   46H, 0AH,0E0H, 49H, 00H, 4BH, 83H, 44H    ;     9,     F8,   WORD,       .,      ,      L,     F7,  W-O
      BIA11:   DB   3EH, 55H, 00H, 41H, 0BH, 42H, 5BH, 43H    ;     8,      =,       ,      , ,    F6,      K,      ],     I
      BIA12:   DB   3DH, 36H, 31H, 3AH, 33H, 3BH, 35H, 3CH    ;     7,      6,      N,       M,     H,      J,      Y,     U
      BIA13:   DB   25H, 2EH, 32H, 2AH, 34H, 2BH, 2CH, 2DH    ;     4,      5,      B,       V,     G,      F,      T,     R
      BIA14:   DB   26H, 06H, 00H, 21H, 0CH, 23H, 04H, 24H    ;     3,     F2,       ,       C,    F4,      D,     F3,     E
      BIA15:   DB   1EH, 05H, 00H, 22H, 00H, 1BH, 58H, 1DH    ;     2,     F1,       ,       X,      ,      S,   CAPS,     W
      BIA16:   DB   16H, 0EH, 00H, 1AH, 76H, 1CH, 0DH, 15H    ;     1,      `,       ,       Z,   ESC,      A,    TAB,     Q


  END          
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -