求助单片机大神!!求一个汇编程序每句意思作用详解,今晚11点前有答案感激不尽!!!!

2025-01-02 23:30:28
推荐回答(1个)
回答1:

ORG 0000H
MOV P2,#0FFH ; 先将P2口初始化为FFh,也就是全输出高电平
LJMP MAIN ; 跳转至主程序入口

ORG 0100H
MAIN:ACALL KEYSCAN ; 调用KeyScan()子程序
MOV A,30H ; 将扫描结果放入累加器
MOV DPTR,#TABLE ; 加载输出表格
MOVC A,@A+DPTR ; 读取输出表格
MOV P2,A ; 按照表格内容输出到P2口
ACALL DELAY ; 调用延时子程序
SJMP MAIN ; 跳回到主程序入口,实现主循环

KEYSCAN:MOV P3,#0FH ; P3口低四位置读状态,高四位至写状态
MOV A,P3 ; 读取P3口状态
ANL A,#0FH ; 掩码屏蔽掉高四位
MOV B,A ; 第一次结果暂时放在B寄存器中
MOV P3,#0F0H ; P3口低四位置写状态,高四位置读状态
MOV A,P3 ; 读取P3口状态
ANL A,#0F0H ; 掩码屏蔽掉高四位
ORL A,B ; 将两次结果按位或
CJNE A,#0FFH,KEYPRO ; 若有按键按下,则后续进入KeyPro()处理,否则返回
RET

KEYPRO:MOV B,A ; 前次结果暂存在B寄存器中
MOV DPTR,#KEYVALUE ; 加载键值表
MOV R3,#0FFH ; 初始下标置为-1
KEY1:INC R3 ; 累加数组下标
MOV A,R3 ; 数组下标移入累加器
MOVC A,@A+DPTR ; 按照数组下标读取键值表
CJNE A,B,KEY2 ; 当前键值与键值表逐项比对
MOV A,R3 ; 若比对相等,则将键编号存入累加器
MOV 30H,A ; 通过30h单元返回键编号
RET
KEY2:CJNE A,#00H,KEY1 ; 键值表是否全比完,比完则直接返回
RET

DELAY:MOV R0,#20 ; 延时子程序,无需赘述
NEXT1:MOV R1,#20
NEXT2:MOV R2,#248
DJNZ R2,$
DJNZ R1,NEXT2
DJNZ R0,NEXT1
RET

KEYVALUE:DB 77H,7BH,7DH,7EH ; 键值表
DB 0B7H,0BBH,0BDH,0BEH
DB 0D7H,0DBH,0DDH,0DEH
DB 0E7H,0EBH,0EDH,0EEH
DB 00H

TABLE:DB 0C0H,0F9H,0A4H,0B0H ; 输出的,疑似是个数码管显示表
DB 99H,92H,82H,0F8H
DB 80H,90H,88H,83H
DB 0C6H,0A1H,86H,8EH
END