;--------------程序信息-----------------
;文件名 : ex3-3.asm
;版本 : 1.0
;作者 :
;修改时间 :
;--------------程序说明------------------
;CHAP 3.3 扫描方式键盘输入实例
;-----------常量和变量声明---------------
KEYIN EQU P1;
;--------------预定义--------------------
ORG 0000H
LJMP START
;------------中断入口地址分配------------
;ORG 0003H
;LJMP INT0PRG
;ORG 000BH
;LJMP INT1PRG
;ORG 0013H;
;LJMP
;ORG 0030H
START:
;--------------初始化子程序--------------
MOV SP,60H;
;--------------主程序--------------------
MAIN:
LCALL KEYBOARD;
LJMP MAIN
;----------------子程序------------------
;---------------------------------
; 行列式键盘扫描方式子程序部分
;---------------------------------
KEYBOARD:
MOV R0,#00H; r0寄存器保存键值,初始化清零
MOV KEYIN,#0FH; 所有列置高电平
MOV A,KEYIN; 读取行值
MOV R0,A; 保存这次的行值
LCALL DEYLAY10MS; 延时去抖
MOV KEYIN,#0FH; 再读行值
MOV A,KEYIN;
;CJNE A,R0,KEYBOARD; 比较去抖前后,相同则认为有键按下,否则重新读键值
CJNE A,#0FH,HAVEKEY;
LJMP KEYBOARD;
HAVEKEY:
MOV KEYIN,#08H; 第一列置高电平扫描
MOV A,KEYIN; 读出扫描的行值
CJNE A,#08H,COL1; 判断按键是否在第一列
LJMP COL2; 否,则跳转扫描下一列
COL1: MOV R1,#00H; 是,则记下列数
JMP KEYBOARDEND; 跳转到键值处理部分
COL2: CJNE A,#04H,COL22; 同上,判断按键是否在第二列
LJMP COL3;
COL22: MOV R1,#01H; 是,记下列数,第二列
JMP KEYBOARDEND;
COL3: CJNE A,#02H,COL33;
LJMP COL4;
COL33: MOV R1,#02H; 记下列数,第三列
JMP KEYBOARDEND;
COL4: CJNE A,#01H,COL44;
LJMP KEYBOARD;
COL44: MOV R1,#01H ;第四列
JMP KEYBOARDEND;
KEYBOARDEND: ;键值处理程序块
MOV A,R0;
LCALL COLSCAN; 判断按键在第几行,R0返回行基数
MOV R0,A; R1保存列数,R0保存行基数
ADD A,R1; 则 键值=R1+R0
MOV R0,A;
RET;
;---------------------------------
; 行扫描方式识别子程序部分
; R0返回行增加的键值基数
; 具体是第一行R0 ;---------------------------------
COLSCAN: MOV A,R0;
JNB ACC.4,ROW2; 判断是否是第一行
MOV R0,#00H; 是,则R0=0保存行基数
JMP COLSCANEND; 否,则跳转判断下一行
ROW2: JNB ACC.5,ROW3;
MOV R0,#04H;
JMP COLSCANEND;
ROW3: JNB ACC.6,ROW4;
MOV R0,#08H;
JMP COLSCANEND;
ROW4: JNB ACC.7,COLSCANEND;
MOV R0,#0CH;
JMP COLSCANEND;
COLSCANEND:
RET;
;--------------中断子程序----------------
;---------------延时子程序---------------
DEYLAY10MS: MOV R6,#40H;
DELAY0: MOV R7,#248H;
DJNZ R7,$;
DJNZ R6,DELAY0;
RET;
END
;---------------注意事项-----------------