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

📄 jp01.asm

📁 我用单片机做的一个键盘电路,模仿键盘矩阵电路,大部分键能发信号.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;  2DH:      待发数据地址暂存判断
;  2EH:      p2口取反 与原状态异或后暂存
;  2FH:      取反后 异或前p2口的新状态暂存 位=1表示键接通

;  30H~3FH:  16字节的发送缓冲区
;  50H~5FH:  键原状态暂存
;  40H:      延时 40微秒用
;  41H:      延时 50毫秒用
;  42H:      延时 50毫秒用
;  43H:      发送位数计数用
;  44H:      位(列位地址)扫循环计数 
;  45H:      行扫循环计数
;  46H:      当前发送数据计数=1该发送47h的数据了 =2该发48h =3该发49h =0下一步
;  47H:      当前待发数据第5 3 2 1字节或只有这一个字节
;  48H:      当前待发数据第4 2 1  字节
;  49H:      当前待发数据第3 1    字节
;  4AH:      当前待发数据第2      字节
;  4BH:      当前待发数据第1      字节
;  4CH:      
;  
;
;      位地址  20H:奇校验位暂存
;          70H~77H:可位寻址字节 异或后A值暂存 键扫p2口新状态暂存
;              21H:键扫描时p1 p3口选择位 =1选择p3口
;              22H:PAUSE键判断位=1证明是按第二次
;              23H:读取的奇校验位暂存
;              24H:=1表示接收到了有效命令
;              25H:
;
;  0组寄存器  R0:键扫描 行地址原状态字节指针
;             R1:待发数据的地址的存储单元字节指针
;             R2:
;             R3:正在被发送字节
;             R4:键扫描当前列数
;             R5:键扫描当前行数
;             R6:
;             R7:
;  1组寄存器  R0: 待发数据全部前移用指针
;             R1
;             R2: 待发数据全部前移次数计数
;             R3
;
;
;
;

ORG   0000H
LJMP  START

ORG   0030H
RETI

ORG   0034H
START:
      CLR    P0.2
      CLR    P0.3
      CLR    P0.4
      MOV    SP,#70H    ;设置堆栈指针
      MOV    R1,#30H    ;设置待发指针初始值
      SETB   22H        ;PAUSE键判断位=1证明是按第二次
      MOV    46H,#00H
      MOV    A,#00H
      MOV    5FH,#0FH
      MOV    R0,#50H
    ST1: 
      MOV    @R0,A
      INC    R0
      DJNZ   5FH,ST1
      
      MOV    R0,#50D  ;延时2.5秒
    ST2:              ;
      CALL   YS50MA    ;
      DJNZ   R0,ST2   ;

      SETB   P0.3
      SETB   P0.4
     
      CLR    24H      ;24h清零 证明没接收到有效命令
      MOV    4EH,#00H

;MAIN:       ;发送自检成功字节aa
;     MOV     R3,#0AAH
;     CALL    FSB1
    
     
MAIN1:
     CALL    MAIN2              ;调用 查看端口是否需要读  如需要且读取
     CALL    MAIN3              ;调用 判断接收到的命令 并执行
     CALL    SCANKEY            ;调用键扫描程序   
     
     MOV     A,46H              ;当前需发字节数送a
     CJNE    A,#00H,MAIN1_4     ;查看是否有要发字节 =0没有
   MAIN1_3:
     CJNE    R1,#30H,MAIN1_2    ;查看是否有待发字节地址需要转换为数据的=30h没有
     LJMP    MAIN1
   MAIN1_2:
     CALL    MAINFS             ;调用地址转数据子程
   MAIN1_4:  
     CALL    MAIN1_1            ;调用 发送 转换后数据
     LJMP    MAIN1_3

     
MAIN1_1:                     ;发送 转换后数据
     MOV     A,46H                ;待发字节数送a
     CJNE    A,#05H,MAIN1_11      ;发送第五字节
     MOV     R3,4BH
     CALL    FSB1                 ;调用 发送一个字节(R3)至主机子程序
     MOV     46H,#04H
     CALL    DDF
     CALL    YS50M
   MAIN1_11:             
     CJNE    A,#04H,MAIN1_12      ;发送第四字节
     MOV     R3,4AH
     CALL    FSB1
     MOV     46H,#03H
     CALL    DDF
     CALL    YS50M
   MAIN1_12:
     CJNE    A,#03H,MAIN1_13      ;发送第三字节
     MOV     R3,49H
     CALL    FSB1
     MOV     46H,#02H
     CALL    DDF
     CALL    YS50M
   MAIN1_13:
     CJNE    A,#02H,MAIN1_14      ;发送第二字节
     MOV     R3,48H
     CALL    FSB1
     MOV     46H,#01H
     CALL    DDF
     CALL    YS50M
   MAIN1_14:
     CJNE    A,#01H,MAIN1_15      ;发送第一字节
     MOV     R3,47H
     CALL    FSB1
     MOV     46H,#00H
     CALL    DDF
     CALL    YS50M
   MAIN1_15:
     RET

MAIN2:                ;(读端口 至少10ms检测一次)查看端口是否需要读  如需要且读取 子程序
     SETB    P0.0
     SETB    P0.1
     JB      P0.1,MA20
     MOV     4CH,#08H
   MAIN2_1:  
     CALL    YS20
     CLR     P0.0           ;把时钟线拉低
     CALL    YS40
     SETB    P0.0           ;把时钟线拉高
     CALL    YS20
     MOV     C,P0.1         ;读取一位数据
     
     RRC     A
     DJNZ    4CH,MAIN2_1

     CALL    YS20
     CLR     P0.0           ;把时钟线拉低
     CALL    YS40
     SETB    P0.0           ;把时钟线拉高
     CALL    YS20
     MOV     C,P0.1         ;读取一位数据

     MOV     23H,C       ;读取的奇校验位暂存
     CALL    YS20
     CLR     P0.0           ;把时钟线拉低
     CALL    YS40
     SETB    P0.0           ;把时钟线拉高
     CALL    YS20
     CLR     P0.1
   MAIN2_2:  
     CALL    YS20
     CLR     P0.0           ;把时钟线拉低
     CALL    YS40
     SETB    P0.0           ;把时钟线拉高
     CALL    YS20
     SETB    P0.1           ;释放数据线
     NOP
     NOP
     JNB     P0.1,MAIN2_2

     CPL     P0.4                            ;;;;;;;;;;;;;;;;;;;;;;;;;;
 
;     MOV     R3,#0FAH         ;发送应答字节0fa
;     CALL    FSB1
     

INC    R6
CJNE   R6,#01H,A01
MOV    4EH,A
A01:
CJNE   R6,#02H,A02
MOV    4FH,A
A02:
CJNE   R6,#03H,A03
MOV    60H,A
A03:
CJNE   R6,#04H,A04
MOV    61H,A
A04:
CJNE   R6,#05H,A05
MOV    62H,A
MOV    R6,#00H
A05:
    
   SETB    24H              ;24h置1 证明接收到了有效命令
   MA20:
     RET

MAIN3:                       ;判断接收到的命令 并执行
     JNB     24H,MA305       ;查看是否收到有效命令字节=1有命令继
     CLR     24H             ;清有效命令位
 
     CJNE    A,#0FFH,MA301     ;收到 键盘复位命令
     LJMP    START
   MA301:
     CJNE    A,#0F2H,MA302     ;收到 键盘回应2个字节的ID  0xab 0x83   命令
     MOV     R3,#0ABH
     CALL    FSB1
     MOV     R3,#83H
     CALL    FSB1
     LJMP    MA305
   MA302:
     CJNE    A,#0F0H,MA303     ;收到 回应使用哪套扫描码集 命令
   MA303:
     CJNE    A,#0EDH,MA305     ;收到 键盘灯状态 命令
     MOV     R3,#0FAH         ;发送应答字节0fa
     CALL    FSB1
   MA303_1:  
     SETB    P0.0
     SETB    P0.1
     JB      P0.1,MA303_1

     CALL    MAIN2
     JNB     24H,MA305
     CLR     24H
     
;     CPL     A          ;更新指示灯状态
 ;    RRC     A          ;
 ;    MOV     P0.4,C     ;
 ;    RRC     A          ;     
 ;    MOV     P0.3,C     ;
 ;    RRC     A          ;
 ;    MOV     P0.2,C     ;
   MA305:
     RET
  

  
MAINFS:                ;将待发数据地址一字节转为数据 并刷新缓冲区  子程序 
     SETB    RS0           ;用1组
     MOV     R0,#31H
     MOV     R2,#0FH
MAINFS1:    
     MOV     A,@R0
     DEC     R0
     MOV     @R0,A
     INC     R0
     INC     R0
     DJNZ    R2,MAINFS1    ;缓冲区前移一字节
     MOV     R0,#30H
     MOV     A,@R0         ;读入待发数据地址
     MOV     2DH,A         ;待发数据地址暂存 准备判断用
     ANL     A,#01111111B
     MOV     DPTR,#0500H
     MOVC    A,@A+DPTR
     CJNE    A,#0E0H,MAINFS2
     CALL    EPD
     LJMP    MAINFS5
   MAINFS2:  
     CJNE    A,#0E1H,MAINFS3
     CALL    EPD
     LJMP    MAINFS5
   MAINFS3: 
     CJNE    A,#00H,MAINFS4
     LJMP    MAINFS5
   MAINFS4:
     MOV     47H,A
     JB      2DH.7,MAINFS4_1
     MOV     46H,#01H
     LJMP    MAINFS5
   MAINFS4_1:
     MOV     48H,#0F0H
     MOV     46H,#02
MAINFS5:     
     CLR     RS0            ;用0组
     DEC     R1             ;待发数据指针减1
     RET

EPD:                      ;当数据是E0/E1时判断     
     MOV     A,2DH
     ANL     A,#01111111B
     
     CJNE    A,#00000011B,EPD1      ;R CTRL
     MOV     47H,#14H
     LJMP    EPD30
   EPD1:  
     CJNE    A,#00000100B,EPD2      ;SLEEP
     MOV     47H,#3FH
     LJMP    EPD30
   EPD2:  
     CJNE    A,#00000101B,EPD3      ;R START
     MOV     47H,#27H
     LJMP    EPD30
   EPD3:  
     CJNE    A,#00000110B,EPD4      ;POWER
     MOV     47H,#37H
     LJMP    EPD30
   EPD4:  
     CJNE    A,#00000111B,EPD5      ;PAUSE
     CPL     22H                    ;PAUSE键判断位=1证明是按第二次
     JB      22H,EPD4_1
     MOV     47H,#77H
     MOV     48H,#14H
     MOV     49H,#0E1H
     MOV     46H,#03H
     LJMP    EPD32
     EPD4_1:
     MOV     47H,#77H
     MOV     48H,#0F0H
     MOV     49H,#14H
     MOV     4AH,#0F0H
     MOV     4BH,#0E1H
     MOV     46H,#05H
     LJMP    EPD32
   EPD5:  
     CJNE    A,#00001000B,EPD6      ;PRINT
     MOV     47H,#12H
     LJMP    EPD30
   EPD6:  
     CJNE    A,#00001010B,EPD7      ;R ALT
     MOV     47H,#11H
     LJMP    EPD30
   EPD7:  
     CJNE    A,#00001110B,EPD8      ;L START
     MOV     47H,#1FH
     LJMP    EPD30
   EPD8:  
     CJNE    A,#00101001B,EPD9     ;DEL
     MOV     47H,#71H
     LJMP    EPD30
   EPD9:  
     CJNE    A,#00101010B,EPD10     ;DOWN
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
     MOV     4DH,#08H
     MOV     A,4FH
     CPL     A
     CLR     P0.2
     CLR     P0.3
     CALL    YS50M
     CALL    YS50M
     CALL    YS50M
     CALL    YS50M
  MAINA3_12:
     SETB    P0.2
     SETB    P0.3
     RLC     A
   
     MOV    R7,#40D  ;延时2.5秒
    MAINA3_1:              ;
      CALL   YS50M        ;
      DJNZ   R7,MAINA3_1   ;
  
     
     MOV     P0.3,C
     CLR     P0.2


     MOV    R7,#40D  ;延时2.5秒
    MAINA3_11:              ;
      CALL   YS50M        ;
      DJNZ   R7,MAINA3_11   ;
      DJNZ   4DH,MAINA3_12
    SETB     P0.2
    SETB     P0.3
    
   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
     MOV     47H,#72H
     LJMP    EPD30
   EPD10:  
     CJNE    A,#01001010B,EPD11     ;APPR(文档)
     MOV     47H,#2FH
     LJMP    EPD30
   EPD11:  
     CJNE    A,#00110001B,EPD12     ;INSERT
     MOV     47H,#70H
     LJMP    EPD30
   EPD12:  
     CJNE    A,#00110010B,EPD13     ;RIGHT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
     MOV     4DH,#08H
     MOV     A,61H
     CPL     A
     CLR     P0.2

⌨️ 快捷键说明

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