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

📄 jian pan 1.asm

📁 这是一个4*4键盘的程序,经过调试后很好用,使用时只需结合相应口修改即可.
💻 ASM
字号:
;###----1.2.3.4 #----------软底-------------
;###----5.6.7.8 #
;###----9.0.A.B #
;###----C.D.E.F #
	ORG 0000H
	AJMP 0050H
	ORG 0050H
MAIN:	LCALL KEY
    	LCALL DISP
        AJMP MAIN

;#####################################################################
;执行完一遍此程序后若无按键按下R0值不改变   若有按键按下R0的返回值为按下的键的数值0-F(0-15)
;执行此程序的期间 用到R0 R1 R2 和 C  和延时时的R6 R7    被中断打断时应入栈保护
;######################################################################3

KEY:    MOV  P1,#0F0H           ;列线置低电平 , 行线输入状态
        MOV  A,P1               ;读行线数据
        CPL  A
        ANL  A,#0F0H            ;屏蔽列线
        MOV  R1,A               ;存行线数据
        JZ   GRET               ;全0,无健按下,返回
KEY1:   MOV  P1,#0FH            ;列线置输入状态,行线置低电平
        MOV  A,P1               ;读列线数据
        CPL  A
        ANL  A,#0FH             ;屏蔽行线
        MOV  R2,A               ;存列线数据
        JZ   GRET               ;全0,无键按下 ,返回
        LCALL  DELAY            ;调延时程序,消除斗动
WAIT:   MOV  A,P1               ;等待按键释放
        CPL  A
        ANL  A,#0FH
        JNZ  WAIT
        MOV  A,R1               ;取行线数据  数据在高四位中 低四位为零
        MOV  R1,#0              ;置行线编号初值
        MOV  R3,#4              ;置循环次数
        CLR  C
KEY2:   RLC  A                  ;依次左移入C中
        JC   KEY3               ;C=1,该行有键按下,(行号存在R1中)
        INC  R1                 ;C=0,无键按下,修正行编号
        DJNZ  R3,KEY2           ;判断循环结束否?未结束继续寻找有键按下的行
        MOV A,#0FFH
        RET                     ;出错 无效 退出
KEY3:   MOV  A,R2               ;取列线数据
        MOV  R2,#1              ;取列线编号处置
        MOV  R3,#4              ;置循环次数
        CLR  C
KEY4:   RRC  A                  ;依次右移入C中
        JC   KEY5               ;C=1,该 行有键按下,(列号存在R2中)
        INC  R2                 ;C=0,无键按下,修正列编号
        DJNZ  R3,KEY4           ;判断循环结束否?未结束继续寻找有键按下的行
        MOV A,#0FFH
        RET                     ;出错 无效 退出
KEY5:   MOV  A,R1               ;取行线编号
        RL  A                   ;行号乘4
        RL  A
        ADD  A,R2               ;行号 X 4 + 列号 = 按键编号
        CJNE A,#10,GRET1
        MOV A,#0
        AJMP GRET2
GRET1:  JC GRET2                ;键盘上的数字顺序和我们习惯上的不一样(0在中间) 需作相应整
        DEC A
GRET2:  MOV R0,A
GRET:   RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;P0口输出段码数据,P2.0-P2.3口作扫描控制
;R0中存放查表初始值(指针)
DISP:MOV DPTR,#7FFFH ;74LS377 地址 7FFFH
     MOV DPTR,#TABLE
     MOV A,R0
     MOVC A,@A+DPTR  ;查表
     MOVX @DPTR,A    ;产生/WR信号
     CLR P2.0
     LCALL DELAY2MS  ;2ms延时
     SETB P2.0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;             延时10ms程序            ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY: MOV R6,#20
D1:    MOV R7,#248
       DJNZ R7,$
       DJNZ R6,D1
       RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;           延时子程序2ms             ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY2MS:MOV R6,#4
D2:   MOV R7,#248
      DJNZ R7,$
      DJNZ R6,D2
      RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;           延时程序1S                ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELY1S: MOV R5,#100
Dd2:     MOV R6,#20
Dd1:     MOV R7,#248
        DJNZ R7,$
        DJNZ R6,Dd1
        DJNZ R5,Dd2
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;           共阳极数码管编码表0~F      ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TABLE:  DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H
        DB 90H,88H,83H,0C6H,0A1H,86H,8EH
        ;共阳段码表  "0""1""2" "3""4""5""6""7" "8""9""
        ;            "A""B""C" "D""E""F"
END

⌨️ 快捷键说明

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