文档详情

单片机矩阵键盘设计方案

王****
实名认证
店铺
DOC
24.54KB
约14页
文档ID:310301745
单片机矩阵键盘设计方案_第1页
1/14

1、设计原理  (1)如图142所示,用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P30—P3.3各管脚作输入线,以单片机的P34—P3.7各管脚作输出线,在数码管上显示每个按键 “0-F”的序号.  (2)键盘中对应按键的序号排列如图14.1所示.  2、参考电路  图14.2 4×4矩阵式键盘识别电路原理图  3、电路硬件说明  (1)在“单片机系统"区域中,把单片机的P30-P3.7端口通过8联拨动拨码开关JP3连接到“4×4行列式键盘”区域中的M1—M4,N1-N4端口上  (2)在“单片机系统"区域中,把单片机的P0.0—P07端口连接到“静态数码显示模块”区域中的任何一个a-h端口上;要求:P00对应着a,P0.1对应着b,……,P0.7对应着h  4、程序设计内容  (1)4×4矩阵键盘识别处理   (2)每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码矩阵的行线和列线分别通过两并行接口和CPU通信.键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。

两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能  5、程序流程图(如图143所示)6、汇编源程序  ;;;;;;;;;;定义单元;;;;;;;;;;  COUNT EQU 30H  ;;;;;;;;;;入口地址;;;;;;;;;;  ORG 0000H  LJMP START  ORG 0003H  RETI  ORG 000BH  RETI  ORG 0013H  RETI  ORG 001BH  RETI  ORG 0023H  RETI  ORG 002BH  RETI  ;;;;;;;;;;主程序入口;;;;;;;;;;  ORG 0100H  START: LCALL CHUSHIHUA  LCALL PANDUAN  LCALL XIANSHI  LJMP START  ;;;;;;;;;;初始化程序;;;;;;;;;;  CHUSHIHUA: MOV COUNT,#00H  RET  ;;;;;;;;;;判断哪个按键按下程序;;;;;;;;;;  PANDUAN: MOV P3,#0FFH  CLR P3。

4  MOV A,P3  ANL A,#0FH  XRL A,#0FH  JZ SW1  LCALL DELAY10MS  JZ SW1  MOV A,P3  ANL A,#0FH  CJNE A,#0EH,K1  MOV COUNT,#0  LJMP DK  K1: CJNE A,#0DH,K2  MOV COUNT,#4  LJMP DK  K2: CJNE A,#0BH,K3  MOV COUNT,#8  LJMP DK  K3: CJNE A,#07H,K4  MOV COUNT,#12  K4: NOP  LJMP DK  SW1: MOV P3,#0FFH  CLR P3.5  MOV A,P3  ANL A,#0FH  XRL A,#0FH  JZ SW2  LCALL DELAY10MS  JZ SW2  MOV A,P3  ANL A,#0FH  CJNE A,#0EH,K5  MOV COUNT,#1  LJMP DK  K5: CJNE A,#0DH,K6  MOV COUNT,#5  LJMP DK  K6: CJNE A,#0BH,K7  MOV COUNT,#9  LJMP DK  K7: CJNE A,#07H,K8  MOV COUNT,#13  K8: NOP  LJMP DK  SW2: MOV P3,#0FFH  CLR P3.6  MOV A,P3  ANL A,#0FH  XRL A,#0FH  JZ SW3  LCALL DELAY10MS  JZ SW3  MOV A,P3  ANL A,#0FH  CJNE A,#0EH,K9  MOV COUNT,#2  LJMP DK  K9: CJNE A,#0DH,KA  MOV COUNT,#6  LJMP DK  KA: CJNE A,#0BH,KB  MOV COUNT,#10  LJMP DK  KB: CJNE A,#07H,KC  MOV COUNT,#14  KC: NOP  LJMP DK  SW3: MOV P3,#0FFH  CLR P3。

7  MOV A,P3  ANL A,#0FH  XRL A,#0FH  JZ SW4  LCALL DELAY10MS  JZ SW4  MOV A,P3  ANL A,#0FH  CJNE A,#0EH,KD  MOV COUNT,#3  LJMP DK  KD: CJNE A,#0DH,KE  MOV COUNT,#7  LJMP DK  KE: CJNE A,#0BH,KF  MOV COUNT,#11  LJMP DK  KF: CJNE A,#07H,KG  MOV COUNT,#15  KG: NOP  LJMP DK  SW4: LJMP PANDUAN  DK: RET  ;;;;;;;;;;显示程序;;;;;;;;;;  XIANSHI: MOV A,COUNT  MOV DPTR,#TABLE  MOVC A,@A+DPTR  MOV P0,A  LCALL DELAY  SK: MOV A,P3  ANL A,#0FH  XRL A,#0FH  JNZ SK  RET  ;;;;;;;;;;10ms延时程序;;;;;;;;;;  DELAY10MS: MOV R6,#20  D1: MOV R7,#248  DJNZ R7,$  DJNZ R6,D1  RET  ;;;;;;;;;;200ms延时程序;;;;;;;;;;  DELAY: MOV R5,#20  LOOP: LCALL DELAY10MS  DJNZ R5,LOOP  RET  ;;;;;;;;;;共阴码表;;;;;;;;;;  TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H  DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H  ;;;;;;;;;;结束标志;;;;;;;;;;  END7、C语言源程序  #include  unsigned char code table[]={0x3f,0x66,0x7f,0x39,  0x06,0x6d,0x6f,0x5e,  0x5b,0x7d,0x77,0x79,  0x4f,0x07,0x7c,0x71};  void main(void)  { unsigned char i,j,k,key;  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、注意事项  在硬件电路中,要把8联拨动拨码开关JP2拨下,把8联拨动拨码开关JP3拨上去.。

下载提示
相似文档
正为您匹配相似的精品文档
相关文档