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

📄 jawen.asm

📁 这是一个51单片机与PC的通信系统:利用3*4小键盘输入0~9的一串数字(不大于5)
💻 ASM
字号:
       IN    EQU  40H        ;pc输入缓冲区
       OUT   EQU  48H        ;键盘输入缓冲区
       TEMP  EQU  50H        ;显示缓冲

             org 0000h

                sjmp init


             org 0023h
             push    acc
             jbc     ri, inter       ;判接收标志,
             pop     acc
             reti
   inter:    clr     ea               ;关中断
             acall   recv             ;接收存数据
             mov     r0,#IN
             acall   disp             ;显示接收数据
             setb    ea               ;开中断
             pop     psw
             reti


    init:    acall   clear            ;清空存储区
             mov     scon, #11010000b ;9位异步串行通信
             mov     pcon, #80h       ;波特坡4800
             setb    ea
             setb    es
             mov     tmod, #20h       ;晶振频率11.0592mhz
             mov     th1, #0f4h
             mov     tl1, #0f4h
             setb    tr1
             mov     sp, #60h          ;设栈顶值

    main:    acall   testkey           ;判键
             jz      main
             acall   getkey            ;得键值
             cjne    a, #0ah,  main1   ;不是发送键就跳转,否则发送
             acall   send              ;调用发送程序
             mov     r0,#OUT           ;送显示首地址
             acall   disp              ;调用显示程序
             ljmp    main

    main1:   cjne    a, #0bh,   main2  ;不是清除键则跳转,否则清空存储区
             acall   clear             ;清除子程序
             mov     r0,#IN
             acall   disp
             ljmp    main

    main2:   mov     r1, #IN            ;将从键盘获得的值存缓冲区
             acall   store
             mov     r0,#IN
             acall   disp
             ljmp    main               ;跳回主循环



   TestKey:
      MOV   P1,#0FH         ;读入键状态
      MOV   A,P1
      CPL   A
      ANL   A,#0fh          ;存值
      ret
   GetKey:
      ACALL  DELAY          ;去抖动
      MOV   P1,#0FH         ;再次判键
      MOV   A,P1
      CJNE  A,#0FH, K12
      LJMP  main            ;误操作
K12:  MOV   B,A             ;存列值
      MOV   P1,#3FH         ;键在第一行
      MOV   A,P1
      CJNE  A,#3FH,K13
      MOV   P1,#5FH         ;键在第二行
      MOV   A,P1
      CJNE  A,#5FH,K13
      MOV   P1,#6FH         ;键在第三行
      MOV   A,P1
      CJNE  A,#6FH,K13
      LJMP  main            ;多奸同时按下
K13:  ANL   A,#0F0H         ;得键值
      ORL   A,B
      MOV   B,A             ;存键值
      MOV   R1,#12          ;12个键
      MOV   R2,#0           ;键码初值
      MOV   DPTR,#KEYTABLE
K14:  MOV   A,R2            ;从键表中取键值
      MOVC  A,@A+DPTR
      CJNE  A,B,K16         ;比较相等则执行下步骤
      MOV   P1,#0FH
K15:  MOV   A,P1
      CJNE  A,#0FH, K15     ;等释放
      ACALL DELAY           ;去抖动
      MOV   A,   R2         ;得键值
      RET
K16:  INC   R2
      DJNZ  R1,  K14
      LJMP  main            ;多键同时按下
KeyTable :
      DB   6EH,6DH,6BH,67H  ;3*4键盘键码值
      DB   5EH,5DH,5BH,57H
      DB   3EH,3DH,3BH,37H




disp:  MOV R1,#TEMP          ;将数据的数据查表得
       MOV R2,#5             ;送显示缓冲区
       MOV DPTR,#SEGTAB
DP00:  MOV A,@R0
       MOVC A,@A+DPTR
       MOV @R1,A
       INC R1
       INC R0
       DJNZ R2,DP00

DISP0: MOV R0,#TEMP          ;动态显示部分
       MOV R1,#6
       MOV R2,#1
 DP01: MOV A,@R0
       MOV P0,A
       MOV A,R2
       MOV P1,A
       ACALL DELAY
       MOV A,R2
       RL A
       MOV R2,A
       INC R0
       DJNZ R1,DP01
       SJMP DISP0
       ret
SEGTAB:DB 3FH,06H,5BH,4FH,66H,6DH      ;0,1,2,3,4,5
       DB 7DH,07H,7FH,6FH,77H,7CH      ;6,7,8,9,A,B
       DB 4H,5CH ,40H                  ;I,O ,-,

store: mov    r2, #5                   ;存储区大小为5字节
       inc    r1                       ;跳过输入输出标识
 loop: mov    b, @r1
       mov    @r1, a                   ;将新数据放存储区头部,
       inc    r1                       ;旧数据向后移动,
       djnz   r2, loop                 ;包镇保证数据区的数据为最新输入
       mov    a, b
       RET

recv:  mov    r1, #IN
       mov    a, sbuf                  ;接收数据并奇偶较验
       jnb    psw.0, recv1             ;偶则跳
       jnb    rb8, recv2               ;rb8为接收的奇偶较验位
       subb   a, #30h                  ;将0~9的ASC码转换成数字
       jc     recv2                    ;小于0
       mov    b, a                     ;判断接收的值是否在0~9之间
       subb   a, #10
       jnc    recv2                    ;大于9
       mov    a, b
       acall  store                    ;正确则存储
       ret                             ;否则存零标志“-”
recv1: jb     rb8, recv2
       subb   a, #30h                  ;将0~9的ASC码转换成数字
       jc     recv2
       mov    b, a                     ;判断接收的值是否在0~9之间
       subb   a, #10
       jnc    recv2
       mov    a, b
       acall  store
       ret
recv2: mov    a, #0eh
       acall  store
       ret


send:  MOV     r1, #OUT
       mov    r3, #5
send1: inc    R1
       mov    a, @r1                   ;发送子程序,设奇偶较验位
       add    a, #30h                  ;将0~9的数字转换成ASC码
       jnb    psw.0, send2
       setb   tb8
       mov    sbuf, a
       djnz   r3, send1
       ret
send2: clr    tb8
       mov    sbuf, a
       djnz   r3, send1
       ret


clear:  mov   r1, #40h                 ;清零子程序
        mov   r7, #14h                 ;既送零标志“-”
loopc:  mov   @r1, #0eh                ;同时设置发送和键盘输入标志位
        inc   r1                       ;"i","o"
        djnz  r7, loopc
        mov   40h,#0ch
        mov   48, #0dh
        ret

DELAY:  MOV   R4,   #02H                ;延时子程序
  AA1:  MOV   R5,   #0F8H
   AA:  NOP
        NOP
        DJNZ  R5,   AA
        DJNZ  R4,   AA1
        RET


      end

⌨️ 快捷键说明

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