MOV COUNT#5 LJMP DK
K6: CJNE A#0BHK7 MOV COUNT#9 LJMP DK
K7: CJNE A#07HK8 MOV COUNT#13 K8: NOP LJMP DK
SW2: MOV P3#0FFH CLR P3.6 MOV AP3 ANL A#0FH XRL A#0FH JZ SW3
LCALL DELAY10MS JZ SW3 MOV AP3 ANL A#0FH
CJNE A#0EHK9 MOV COUNT#2 LJMP DK
K9: CJNE A#0DHKA MOV COUNT#6 LJMP DK
KA: CJNE A#0BHKB MOV COUNT#10 LJMP DK
KB: CJNE A#07HKC MOV COUNT#14 KC: NOP LJMP DK
SW3: MOV P3#0FFH CLR P3.7 MOV AP3 ANL A#0FH XRL A#0FH JZ SW4
LCALL DELAY10MS JZ SW4 MOV AP3 ANL A#0FH
CJNE A#0EHKD MOV COUNT#3
LJMP DK
KD: CJNE A#0DHKE MOV COUNT#7 LJMP DK
KE: CJNE A#0BHKF MOV COUNT#11 LJMP DK
KF: CJNE A#07HKG MOV COUNT#15 KG: NOP LJMP DK
SW4: LJMP PANDUAN
DK: RET
;;;;;;;;;;显示程序;;;;;;;;;;
XIANSHI: MOV ACOUNT MOV DPTR#TABLE MOVC A@A+DPTR MOV P0A LCALL DELAY SK: MOV AP3 ANL A#0FH XRL A#0FH JNZ SK RET
;;;;;;;;;;10ms延时程序;;;;;;;;;; DELAY10MS: MOV R6#20 D1: MOV R7#248 DJNZ R7$ DJNZ R6D1 RET
;;;;;;;;;;200ms延时程序;;;;;;;;;; DELAY: MOV R5#20
LOOP: LCALL DELAY10MS DJNZ R5LOOP RET
;;;;;;;;;;共阴码表;;;;;;;;;;
TABLE: DB 3FH06H5BH4FH66H6DH7DH07H DB 7FH6FH77H7CH39H5EH79H71H ;;;;;;;;;;结束标志;;;;;;;;;; END
八、C语言源程序
#include
unsigned char code table[]={0x3f0x660x7f0x39
0x060x6d0x6f0x5e 0x5b0x7d0x770x79 0x4f0x070x7c0x71}; void main(void)
{ unsigned char ijkkey; while(1)
{ P3=0xff; //给P3口置1//
P3_4=0; //给P3.4这条线送入0// i=P3;
i=i&0x0f; //屏蔽低四位//
if(i!=0x0f) //看是否有按键按下// { for(j=50;j>0;j--) //延时// for(k=200;k>0;k--);
if(i!=0x0f) //再次判断按键是否按下//
{ switch(i) //看是和P3.4相连的四个按键中的哪个// { case 0x0e: key=0; break;
case 0x0d: key=1; break;
case 0x0b: key=2; break;
case 0x07: key=3; break; }
P0=table[key]; //送数到P0口显示// } }
P3=0xff;
P3_5=0; //读P3.5这条线// i=P3;
i=i&0x0f; //屏蔽P3口的低四位//
if(i!=0x0f) //读P3.5这条线上看是否有按键按下// { for(j=50;j>0;j--) //延时// for(k=200;k>0;k--);
i=P3; //再看是否有按键真的按下// i=i&0x0f; if(i!=0x0f)
{ switch(i) //如果有显示相应的按键// { case 0x0e: key=4;
break;
case 0x0d: key=5; break;
case 0x0b: key=6; break;
case 0x07: key=7; break; }
P0=table[key]; //送入P0口显示// } }
P3=0xff;
P3_6=0; //读P3.6这条线上是否有按键按下// i=P3; i=i&0x0f; if(i!=0x0f)
{ for(j=50;j>0;j--) for(k=200;k>0;k--); i=P3; i=i&0x0f; if(i!=0x0f) { switch(i) { case 0x0e: key=8; break;
case 0x0d: key=9; break;
case 0x0b: key=10; break;
case 0x07: key=11; break; }
P0=table[key]; } }
P3=0xff;
P3_7=0; //读P3.7这条线上是否有按键按下// i=P3;
i=i&0x0f; if(i!=0x0f)
{ for(j=50;j>0;j--) for(k=200;k>0;k--); i=P3; i=i&0x0f; if(i!=0x0f) { switch(i) { case 0x0e: key=12; break;
case 0x0d: key=13; break;
case 0x0b: key=14; break;
case 0x07: key=15; break; }
P0=table[key]; } } } }
九、注意事项
在硬件电路中,要把8联拨动拨码开关JP2拨下,把8联拨动拨码开关JP3拨上去
C51矩阵键盘
在一个4乘4的矩阵键盘中,本人的基本识别程序。。。(P1口低四位对应键盘行线,高四位对应键盘列线,P2口为6个动态LED数码管)
#i nclude #i nclude
const unsigned char leddigit[12]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,
0x20,0x60,0xff,0xdf}; /* 字符 0-9 编码,0xff为关显示,0xdf为小数点 */
#define disp(a,b) P2=~(1<<(a));P0=leddigit[b] #define uchar unsigned char