由于8051的串行口在方式0工作状态下,可以方便地通过移位寄存器74LS164扩展并行输出口。因此,可以将这些并行口线作为列线,与P3口的行线构成行列式键盘。每占用一条P3口线可增加8个按键,用户根据需要可增减。 在8051的串行口方式0工作状态下,结合P3.4和P3.5实现2*8键盘。如图所示。 C51软件设计: #include<stdio.h> //预处理 #include<reg51.h> #include<intrins.h> unsigned char getkey(void); //键盘扫描函数 void proc1(void); //定义按键处理程序1 void proc2(void); //定义按键处理程序2 void proc3(void); //定义按键处理程序3 void proc4(void); //定义按键处理程序4 …… bit0=P3.4; bit1=P3.5; void delay(void); //定义延时函数 void main(void) //主函数 { unsigned char idata key; SCON=0x00; //串口初始化 ES=0; EA=0; //关闭中断 while(1) { key=getkey(); if(key!=0xff) switch (key) { case 0x00: proc0(); braek; case 0x01: proc1(); braek; case 0x02: proc2(); braek; case 0x03: proc3(); braek; …… …… …… default: break; } } } unsigned char getkey(void) //键盘扫描函数 { unsigned char idata key_code,col=0; mask=0x00; TI=0; SBUF=mask; while(TI==0); if((bit0&bit1)!= 0) return(0xff); delay(); if((bit0&bit1)!= 0) return(0xff); mask=0xfe; while(col!=8) { TI=0; SBUF=mask; while(TI==0); if((bit0&bit1)!= 0) { mask=mask<<1; mask=mask|0x01; col=col+1; continue; } else break; } if(col==8) return(0xff); if(bit0==1) key_code=col; else key_code=8+col; while(bit0&bit1==0); return(key_code); } void delay(void) /*延时10毫秒*/ { unsigned int i=10; while(i--); } |