行线(PA0—PA7) 矩阵盘名调滩隆 0行1行2行3行4行5行6行7行 行号:第0行—第7行→R3 0123,45,67) 0481216202428 行首值:(R3)X4→R5 0列← 列 1591317212529 04,8,12,16,20,24,28) 线1列 6101418222630 列值:C口低4位读进值 PC\2列3711151928263 0-3 R4 3列 (0F0E0D0B,07) 0F:表示此行无键按下。矩阵式键盘工作原理: 0E07:表示此行的03列先由行线送出数据,送全“0” 有键按下。 或每次只送一位“0”;然后 键值:查得最后结果R5读进列线,判有无键按下或 等于已知技键所在的行首值,按键的位置并算出键值。顺 生列 同一行中,键值等于行首值序扫描 连续依次加1
矩阵式键盘名词注释 0行 1行 2行 3行 4行 5行 6行 7行 行线(PA0-PA7) 列 线 PC 0-3 0列 3列 0 4 8 12 16 20 24 28 1 5 9 13 17 21 25 29 2 6 10 14 18 22 26 30 3 7 11 15 19 23 26 31 矩阵式键盘工作原理: 先由行线送出数据,送全“0” 或每次只送一位“0”;然后 读进列线,判有无键按下或 按键的位置并算出键值。顺 序扫描。 1列 2列 @ 行号:第0行—第7行→R3 (0,1,2,3,4,5,6,7) @ 行首值:(R3) X 4→ R5 (0,4,8,12,16,20,24,28) @ 列值:C口低4位读进值 →R4 (0F,0E,0D,0B,07) 0F:表示此行无键按下。 0E—07:表示此行的0—3列 有键按下。 @ 键值:查得最后结果→ R5 等于已知按键所在的行首值, 再加上所在列的序号。 同一行中,键值等于行首值 连续依次加 1
L:有键闭合转消颤查有无键闭合的子程序K51 LJMP LK8;无键闭合则退出 LK1: LCALL DL6ms;消颤12ms KS1: MOV DPTR,#010lH;指向A口 LCALL DL6mS MOVA,#00H;8条行线都送0 LCALL KS1;再查有无键闭合 MOVX,@DPTR,A;送到行线上去 JNZ LK2;的确有,转处理 INC DPTR LJMP LK8;确实无,退出去 INC DPTR 指向C口 MOVX A,@DPTR;读列线的电平 ANLA,#0FH;保留C口低4位 行线 若确有键按下,则Acc中必有“0 ORLA,#0FOH;将Acc高4位赋1 0行1行2行3行4行5行6行7行 CPL A Acc 取反后,高4位=0; 若有键按下,则低4位中必有“1” 0481216202428 RET 1591317212529 列J1列 检查的结果(出囗) 26101418222630 线 2列 若(A)≠0,则有键按下; 232631 3列+ 若(A)=0,则无键按下
KEY1:LCALL KS1 ;查有无键闭合 JNZ LK1 ;有键闭合转消颤 LJMP LK8 ;无键闭合则退出 LK1:LCALL DL6ms ;消颤12ms LCALL DL6ms LCALL KS1 ;再查有无键闭合 JNZ LK2 ;的确有,转处理 LJMP LK8 ;确实无,退出去 查有无键闭合的子程序KS1: KS1:MOV DPTR,#0101H ;指向 A口 MOV A, #00H ;8条行线都送0 MOVX,@DPTR,A;送到行线上去 INC DPTR INC DPTR ;指向 C口 MOVX A,@DPTR ;读列线的电平 ANL A,#0FH ;保留C口低4位 若确有键按下,则Acc中必有“0” ORL A,#0F0H ;将Acc高4位赋1 CPL A ;Acc取反后,高4位=0; 若有键按下,则低4位中必有“1” RET 检查的结果(出口): 若(A)≠0,则有键按下; 若(A)=0,则无键按下。 行线 列 线 0列 3列 1列 2列 0行 1行 2行 3行 4行 5行 6行 7行 0 4 8 12 16 20 24 28 1 5 9 13 17 21 25 29 2 6 10 14 18 22 26 30 3 7 11 15 19 23 26 31
KEY: LCALL KS1;查有无键闭合 JNz"LK1:有键闭合转消颤@行号:第行第7行(R3) LJMP LK8;无键闭合则退出 01234567) LK1: LCALL DL6ms;消颤2ms@行扫描值:OFEH→(R2) LCALL DL6mS LCALL KS1;再查有无键闭合 (FE, FD, FB, F7,EF,DF, BF,7F JNZ LK2;的确有,转处理FEH=11110首次扫 JMP LKS8;确实无,退出去描) LK2:MOR3,#00:(R3)行号初值FDH=1111101B(2次扫 MOvR2,#0FEH:(2+行扫描初值描) LK3: MOV DPTR#0101H;指向815A口FBH=11101B(3次扫 MOVA,R2;取行扫描值 MOVX,@DPTR,A;送到行线上去 描) INC DPTR FH=11110111B(4次扫描) INC DPTR 指向8155c口EH=1110111B(5次扫描 MOVA,DPTR;读列线的电平DFH=11011111B(6次扫 ANLA,#OFH;保留C口低4位 描) MOVR4,A:列值暂存进BFH=1011111B(7次扫 CJNE A,#0FH,LK4;列值≠全“1” 表明此次送0的行有键按下,转IK4处理, 描) 若=全1,表明此次送的行无键按下。FH=011111(8次扫描 列值:(0F0E0D.0B.07
KEY1:LCALL KS1 ;查有无键闭合 JNZ LK1 ;有键闭合转消颤 LJMP LK8 ;无键闭合则退出 LK1:LCALL DL6ms ;消颤12ms LCALL DL6ms LCALL KS1 ;再查有无键闭合 JNZ LK2 ;的确有,转处理 LJMP LK8 ;确实无,退出去 LK2:MOV R3,#00H ;(R3)←行号初值 MOV R2,#0FEH;(R2)←行扫描初值 LK3:MOV DPTR #0101H;指向8155 A口 MOV A, R2 ;取行扫描值 MOVX,@DPTR,A ;送到行线上去 INC DPTR INC DPTR ;指向8155 C口 MOVX A,@DPTR ;读列线的电平 ANL A,#0FH ;保留C口低4位 MOV R4,A ;列值暂存进R4 CJNE A,#0FH,LK4;列值≠全“1” 表明此次送0的行有键按下,转LK4处理, 若=全1,表明此次送0的行无键按下。 @ 行号:第0行—第7行→(R3) (0,1,2,3,4,5,6,7) @ 行扫描值: 0FEH →(R2) (FE,FD,FB,F7,EF,DF,BF,7F) FEH = 1111 1110 B(首次扫 描) FDH = 1111 1101 B (2次扫 描) FBH = 1111 1011 B (3次扫 描) F7H = 1111 0111 B (4次扫描) EFH = 1110 1111 B (5次扫描) DFH = 1101 1111 B (6次扫 描) BFH = 1011 1111 B (7次扫 描) 7FH = 0111 1111 B (8次扫描) @ 列值: (0F,0E,0D,0B,07) 从C口低4位读进 → (R4)
KEY: LCALL KS1;查有无键闭合 MOVA,R2;取出此次行扫描值 JNZ LK1;有键闭合转消颤 JNB ACC.7,LK8;若已扫过最后 LJMP LK8;无键闭合则退出1 行就退出扫描,否则扫下一行。 LK1: LCALL DL6ms;消颤12ms RLA;Acc中的“0”左移 LCALL DL6mS 位 LCALL KS1;再查有无键闭合 MOVR2,A;新扫描值仍存进R2 JNZ LK2;的确有,转处理1 INCR3;行号加1指向下一行 LJMP LK8;确实无,退出去 SJMP LK3;转LK3去扫描下一行 LK2:MOVR3,#0OH;(R3)←行号初值 MOVR2,#OFEH;(R2)←行扫描初值 行号:第0行第7行→(R3) LK3: MOV DPTR#010H;指向8155A口 0,1,2,34.5,6,7) MOA,R2:取行扫描值扫描值:OFEH→(R2) MOVX,, @DPTR,A;送到行线上去( FE FD.F7 EE DE BE7F) INC DPTR FEH=11111110B(首次扫 INC DPTR 指向8155C口 MOVX A,@DPTR;读列线的电平 描) ANLA,#OFH;保留C口低4位 MOYR,A:列值暂存进R4BFH1011111(7次扫 CJNE A,#0mH,LK4;列值≠全“1”描 表明此次送0的行有键按下转K4处理7H011111(8次扫描 若=全1,表明此次送0的行无键按下
KEY1:LCALL KS1 ;查有无键闭合 JNZ LK1 ;有键闭合转消颤 LJMP LK8 ;无键闭合则退出 LK1:LCALL DL6ms ;消颤12ms LCALL DL6ms LCALL KS1 ;再查有无键闭合 JNZ LK2 ;的确有,转处理 LJMP LK8 ;确实无,退出去 LK2:MOV R3,#00H ;(R3)←行号初值 MOV R2,#0FEH;(R2)←行扫描初值 LK3:MOV DPTR #0101H;指向8155 A口 MOV A, R2 ;取行扫描值 MOVX,@DPTR,A ;送到行线上去 INC DPTR INC DPTR ;指向8155 C口 MOVX A,@DPTR ;读列线的电平 ANL A,#0FH ;保留C口低4位 MOV R4,A ;列值暂存进R4 CJNE A,#0FH,LK4;列值≠全“1” 表明此次送0的行有键按下,转LK4处理, 若=全1,表明此次送0的行无键按下。 MOV A,R2 ;取出此次行扫描值 JNB ACC.7,LK8 ;若已扫过最后 一行就退出扫描,否则扫下一行。 RL A ;Acc中的“0”左移一 位 MOV R2,A ;新扫描值仍存进R2 INC R3 ;行号加1指向下一行 SJMP LK3 ;转LK3去扫描下一行 @ 行号:第0行—第7行→(R3) (0,1,2,3,4,5,6,7) @ 行扫描值: 0FEH→ (R2) (FE,FD,FB,F7,EF,DF,BF,7F) FEH = 1111 1110 B(首次扫 描) …………… BFH = 1011 1111 B (7次扫 描) 7FH = 0111 1111 B (8次扫描) 注意: 只有第8次扫描值最高位= 0
KEY1: LCALL KS1;查有无键闭合 MOVA,R2;取出此次行扫描值 JNZ LK1;有键闭合转消颤 JⅠ NB ACC.7,LK8;若已扫过最后 LJMP LK8;无键闭合则退出 行就退出扫描,否则扫下一行。 LK1: LCALL DL6ms;消颤12ms RLA;Acc中的“0”左移 LCALL DL6MS 位 LCALL KS1;再查有无键闭合 MoVR2,A;新扫描值仍存进R2 JNZ LK2;的确有,转处理 INCR3;行号加1指向下一行 LJMP LK8;确实无,退出去K4:0MPA:3;:酥有取行符 LK2:MOVR3,#00H;(R3)←行号初值 ADDA,R3;行号乘4 MOVR2,#OFEH;(R2)←行扫描初值 MOVR5,A;得行首值 LK3: MOV DPTR#0101H;指向8155A口 ADDA,R5;即:0,4,8,12 M0VA,R2;取行扫描值 M0VR5,A;暂存进R5 MOVX,@DPTR,A;送到行线上去 INC DPTR INC DPTR 指向8155C口 MOVX A,@DPTR;读列线的电平 ANLA,#0FH;保留C口低4位 Mov R4, A 列值暂存进R4 CJNE A,#OFH,LK4;列值≠全“1 表明此次送0的行有键按下,转LK4处理, 若=全1,表明此次送0的行无键按下
KEY1:LCALL KS1 ;查有无键闭合 JNZ LK1 ;有键闭合转消颤 LJMP LK8 ;无键闭合则退出 LK1:LCALL DL6ms ;消颤12ms LCALL DL6ms LCALL KS1 ;再查有无键闭合 JNZ LK2 ;的确有,转处理 LJMP LK8 ;确实无,退出去 LK2:MOV R3,#00H ;(R3)←行号初值 MOV R2,#0FEH;(R2)←行扫描初值 LK3:MOV DPTR #0101H;指向8155 A口 MOV A, R2 ;取行扫描值 MOVX,@DPTR,A ;送到行线上去 INC DPTR INC DPTR ;指向8155 C口 MOVX A,@DPTR ;读列线的电平 ANL A,#0FH ;保留C口低4位 MOV R4,A ;列值暂存进R4 CJNE A,#0FH,LK4;列值≠全“1” 表明此次送0的行有键按下,转LK4处理, 若=全1,表明此次送0的行无键按下。 MOV A,R2 ;取出此次行扫描值 JNB ACC.7,LK8 ;若已扫过最后 一行就退出扫描,否则扫下一行。 RL A ;Acc中的“0”左移一 位 MOV R2,A ;新扫描值仍存进R2 INC R3 ;行号加1指向下一行 LK4:SJMP MOV A, R3 LK3 ;;转此行有按键 LK3去扫描下一行 ,取行号 ADD A, R3 ;行号乘 4 MOV R5, A ;得行首值 ADD A, R5 ;即:0,4,8,12… MOV R5, A ;暂存进 R5