行线PA0—PA7) 矩阵式键盘名词注释 0行1行2行3行4行5行6行7行 @行号:第0行第7行→R3 01234567) 81216202428 yyyyyyy @行首值:(R3)X4→R5 列 1317212529 (4812,16,20,24,28)线1列 6101418222630 @列值:C口低4位读进值 PC12列3 0-3 11151923263 →R4 3列 (OFOEOD,OB,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
KEY1: LCALL KS1 NZL1:有键闭合转消颤查有无键闭合的子程序KS1 LJMP LK8;无键闭合则退出 K1: LCALL DL6ms;消颤12ms KS1: MOV DPTR,#010lH;指向A口 LCALL DLGmS MOVA,#0OH;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行 CPLA;Acc取反后,高4位=0; 若有键按下,则低4位中必有“1” 0 1620242 RET →1 17212529 检查的结果(出囗) 26101418222630 线12列 11519236 若(A)≠0,则有键按下; 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
KEY1: LCALL KS1 查有无键闭合 JNz"LK1:有键闭合转消颤@行号:第0行第7行(R3) LJMP LK8;无键闭合则退出 (01234567 K1:MLDL6ms;消颤12ms@行扫描值:0FEH→(R2) LCALL DLGmS (FE, FD, FB, F7,EF,DF, BF,7F JNL2:的确有,转处理FEH=1110G首次扫 JMP LK8;确实无,退出去 描) LK2:M0VR3,#0H;(8)-行号初值FDH=1111101B(2次扫 MOVR2,#0FEH:(2+行扫描初值描) LK3: MOV DPTR#010H;指向81554口FBH 11111011B(3次扫 MOVA,R2;取行扫描值 MOx,@DPTR,A;送到行线上去描) INC DPTR F刃H=11110111B(4次扫描 INC DPTR 指向8155c日EFH=1110111B(5次扫描 MOVX A,@DPTR;读列线的电平DFH=1101111B(6次扫 ANLA,#0FH;保留C口低4位 描) MOVR4,A;列值暂存进4BFH=10111111B(7次扫 CJNE A,#OFH,LK4;列值≠全“1 表明此次送0的行有键按下,转LK4处理, 描) 若=全1,表明此次送0的行无键按下。7FH=01111111B(8次扫描) 列值:(0F0EoD,OB.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)
KEY1: LCALL KS1;查有无键闭合 MOVA,R2;取出此次行扫描值 JNZ LK1;有键闭合转消颤 JNB 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;确实无,退出去 SJMP LK3;转LK3去扫描下一行 LK2:MoVR3,#00H;(R3)←行号初值 MOVR2#0FEH:(R2)+行扫描初值@行号:第0行第7行(R3) LK3: MOV DPTR#0101H;指向8155A口 0,1234,567 M0vA,R2;取行扫描值@行扫描值:OFEH→(R2) MOVX,DPTR,A;送到行线上去( FE,FD,FB, F7, EF,DF BF7F) INC DPTR FEH=11111110B首次扫 M0W,dmFR:读列线的电平描) ANLA,#0FH;保留C口低4位! e00。00 MOVR4,A;列值暂存进R4HBFH=10111111B(7次扫 CJNE A,#0理H,LK;列值≠全“1”描) 表明此次送0的行有键按下转K4处理,ZFH=0111111B(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
KEY: LCALL KS1;査有无键闭合 MOvA,R2;取出此次行扫描值 JNZ LK1;有键闭合转消颤 JNB ACC.7,LK8;若已扫过最后 LJMP LK8;无键闭合则退出 行就退出扫描,否则扫下一行。 LK1: LCALL dLms 消颤12ms RLA;Acc中的“0”左移 LCALL DLGmS 位 LCALL KS1;再查有无键闭合MoVR2,A;新扫描值仍存进R2 JNZ LK2;的确有,转处理NCR3;行号加1指向下一行 LJMP LK8;确实无,退出去LK4: SOMPALKR3;我珎辅取行行 LK2:MoVR3,#0OH;(R3)←行号初值 ADDA,R3;行号乘4 MOVR2,#OFEH;(R2)←行扫描初值 MOVR5,A(;得行首值 LK3: MOV DPTR#0101H;指向8155A口 ADA,R5;即:0,48,12 M0VA,R2;取行扫描值 MoVR5,AJ;暂存进R5 MOVX,@DPTR,A;送到行线上去1 INC DPTR INC DPTR 指向8155C口 MOVX A,@DPTR;读列线的电平 ANLA,#0FH;保留C口低4位 Mov R4, A 列值暂存进R4 CJNE A,#OFH,LK4;列值≠全“ 表明此次送0的行有键按下,转K4处理, 若=全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