带注释的c51汇编语言,51单片机矩阵键盘控制程序 汇编语言 带详细注释

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后面所有的汇编语言指令均不予以汇编

你可能感兴趣的:(带注释的c51汇编语言)