ORG 0000H ;伪指令,指定一下程序汇编后代码在入程序存储器0000H单元开始的连续单元中,不占有内存
AJMP MAIN ;短转移指令,转到主程序开始处
ORG 0050H ;伪指令,指定一下程序是从0050H之后连续单元存储
MAIN:
MOV P1,#0F0H ;给P1口赋值,使得低四位为低电平,所有行为低电平,全扫描 高四位列
ONE:MOV A,P1 ;将P1口值赋值给寄存器A,读取列值
XRL A,#0F0H ;将A中的值与11110000异或
JZ ONE ;判断A的值是否为0,为0则没有键按下,继续判断,有则进行下面程序
ACALL DELAY ;延时20ms去除按压时的抖动
MOV A,P1 ;再将P1口的值赋值给寄存器A
XRL A,#0F0H ;与11110000异或
JZ ONE ;判断若A=0则PC+ONE的地址跳转
MOV A,#00H ;若不为0,PC值继续向下运行,给A赋值0
JNB P1.4,TWO ;判断P1.4引脚是否为0,若不为0跳转TWO,继续下面的判断键值
INC A ;若为0,将A 值加1
JNB P1.5,TWO ;继续判断P1.5位是否为0,舨晃?跳转TWO,继续下面的判断键值
INC A ;若为0,将A 值加1
JNB P1.6,TWO ;继续判断P1.6位是否为0,舨晃?跳转TW,继续下面的判断键值
INC A ;若为0,将A 值加1
JNB P1.7,TWO ;继续判断P1.7位是否为0,舨晃?跳转TW,继续下面的判断键值
TWO:MOV R1,A ;将判断列值的A赋值与R1,暂存于此
MOV R2,#00H ;R2赋值0将作为行值
MOV R3,#0FEH ;R3赋值为11111110,作为后面提取行
FOUR:
MOV A,R3 ;将R3的值赋给寄存器A
MOV P1,A ;将A赋值给P1口,将第一行给低电平
MOV A,P1 ;再将P1口的值赋值给A
XRL A,R3 ;与R3做异或,若某一位不一样,则该位赋值于1
JNZ THREE ;判断A是否不为0,若不为0则证明该行有键按下,若为0 ,继续下一行的判断
MOV A,R3 ;将R3的值给A
RL A ;循环左移一位,将第二行赋于低电平
MOV R3,A ;将A的值给R3,暂存
MOV A,R2 ;将R2的值给R2
INC A ;由于上一行无键按下,则自加1
MOV R2,A ;再将A 的值赋值给R2暂存
AJMP FOUR ;挑战FOUR循环判断
THREE:
MOV A,R2 ;判断到具体的某行时,将暂存行数的R2值,赋值给A
MOV B,#04H ;给寄存器B赋值4
MUL AB ;A*B=A,两者相乘赋值给A
ADD A,R1 ;再将列值相加就得到了该键所对应的具体值
MOV P2,#0FEH ;将P2口赋值0FE,唤醒数码管第一位,作为显示
MOV DPTR,#TAB ;寄存器间接寻址,采用数据指针(DPTR)作为间接寻址寄存器,将表TAB赋值于DPTR,以查表方式赋值
MOVC A,@A+DPTR ;以查表的方式将DPTR中数值赋值于A
MOV P0,A ;将P0口赋值A中的所查值,P0口控制数码管段选
AJMP MAIN ;跳转至MAIN,继续下一次判断
DELAY: ;延迟程序20ms
MOV R6,#40 ;该语句占1个机器周期
D1: MOV R5,#246 ;该语句占1个机器周期
D2: DJNZ R5,D2 ;该语句占2个机器周期共执行246*40次
DJNZ R6,D1 ;该语句占2个机器周期共执行40次
RET ;该语句占2个机器周期
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH
;表,伪指令DB,通知汇编程序从当前ROM地址开始保留一字节或字节串的存储单元,并存入DB后面的数据
END ;伪指令,表示END后面所有的汇编语言指令均不予以汇编