今天逛
论坛的时候看到一篇讲4*4矩阵键盘的,提出一种矩阵键盘的新型接法,特节省
I/O口,贴子没有写程序,只提供了硬件连接,把自己写的程序贴出来供大家交流,有不当之处烦劳各位提出。
硬件连接如下图所示:
可以看到只用了4个口就完成了4*4的键盘。注明:该
电路非本人所设计。
不才写的程序如下,经过了
proteus仿真。
单片机P1口接1个共阴数码管。键盘连接如上图所示。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
/*void delay(uint x)
{
while(x--);
}*/
uchar keyscan()
{
uchar temp;
P0=0x0f;
temp=P0;
if(temp!=0x0f)
{
delay(3000);
temp=P0;
if(temp!=0x0f)
{
return(temp);
}
}
P0=0x0e;
temp=P0;
if(temp!=0x0e)
{
delay(3000);
temp=P0;
if(temp!=0x0e)
{
temp|=0xf0;
return(temp);
}
}
P0=0x0d;
temp=P0;
if(temp!=0x0d)
{
delay(3000);
temp=P0;
if(temp!=0x0d)
{
temp|=0xe0;
return(temp);
}
}
P0=0x0b;
temp=P0;
if(temp!=0x0b)
{
delay(3000);
temp=P0;
if(temp!=0x0b)
{
temp|=0xd0;
return(temp);
}
}
P0=0x07;
temp=P0;
if(temp!=0x07)
{
delay(3000);
temp=P0;
if(temp!=0x07)
{
temp|=0xc0;
return(temp);
}
}
return 0;
}
void main()
{
uchar whichkey;
P1=0;
while(1)
{
whichkey=keyscan();
switch(whichkey)
{
case 0x0e:P1=table[1];break;
case 0x0d:P1=table[2];break;
case 0x0b:P1=table[3];break;
case 0x07:P1=table[4];break;
case 0xfc:P1=table[5];break;
case 0xfa:P1=table[6];break;
case 0xf6:P1=table[7];break;
case 0xec:P1=table[8];break;
case 0xe9:P1=table[9];break;
case 0xe5:P1=table[10];break;
case 0xda:P1=table[11];break;
case 0xd9:P1=table[12];break;
case 0xd3:P1=table[13];break;
case 0xc6:P1=table[14];break;
case 0xc5:P1=table[15];break;
case 0xc3:P1=table[0];break;
}
}
}
程序比较简单,因为这些天光在论坛上瞎溜达了,没有动手写程序,算是热身了吧。仿真结果显示,按下相应的按键,数码管显示对应的数字。