这个是一个动态扫描的过程~ 4*4 就是说 当你给第一行的一个低电平其他三行是高电平的时候,可以检测4个按键,编号1.2.3.4 如果1按键按下就返回1如果2按键按下就是2 类推 3.4 当你控制给第二行一个低电平其他三行是高电平的时候 按键1按下就是5 ,按键2按下就是6, 类推7.8 同理;类推第三行 第四行 这样就是原理了~~ 代码如下: 一个简单的按下哪个键 数码管就亮几 是2*4的键盘 原理一样 再在代码中加上两个判断就好了
#include
char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, //数码管数字编码
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
char temp;
int num;
void delay(int h) //延时函数 约1ms
{
int x,y;
for(x=0;x
}
void main()
{
while(1)
{
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0) //有键按下了
{
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0) //确实有键按下了
{
temp=P3;
switch(temp)
{
case 0xeb: num=3;
break;
case 0xdb: num=2;
break;
case 0xbb: num=1;
break;
case 0x7b: num=0;
break;
}
// P0=table[num];
}
// while(temp!=0xf0) //松手检测
// {
// temp=P3;
// temp=temp&0xf0;
// }
//}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0) //只检测按下的一下
{
temp=P3;
switch(temp)
{
case 0xe7: num=7;
break;
case 0xd7: num=6;
break;
case 0xb7: num=5;
break;
case 0x77: num=4;
break;
}
// while(temp!=0xf0)
// {
//temp=P3;
//temp=temp&0xf0;
//}
// P0=table[num];
}
P0=table[num];
delay(3);
}
}
#include
#define uchar unsigned char
#define uint unsigned int
//段码
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf
0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};
sbit BEEP=P3^7;
//上次按键和当前按键的序号,该矩阵中序号范围 0~15,16表示无
uchar Pre_KeyNo=16,KeyNo=16;
//延时
void DelayMS(uint x)
{
uchar i;
while(x--) for(i=0;i<120;i++);
}
//矩阵键盘扫描
void Keys_Scan()
{
uchar Tmp;
P1=0x0f; //高4 位置0,放入 4 行
DelayMS(1);
Tmp=P1^0x0f;//按键后0f变成 0000XXXX,X中一个为 0,3 个仍为 1,通过异或把 3 个1 变为0,唯
一的 0 变为1
switch(Tmp) //判断按键发生于 0~3 列的哪一列
{
case 1: KeyNo=0;break;
case 2: KeyNo=1;break;
case 4: KeyNo=2;break;
case 8: KeyNo=3;break;
default:KeyNo=16; //无键按下
}
P1=0xf0; //低 4 位置0,放入 4 列
DelayMS(1);
Tmp=P1>>4^0x0f;//按键后 f0 变成 XXXX0000,X中有 1 个为 0,三个仍为 1;高4 位转移到低 4位并
异或得到改变的值
switch(Tmp) //对0~3 行分别附加起始值 0,4,8,12
{
case 1: KeyNo+=0;break;
case 2: KeyNo+=4;break;
case 4: KeyNo+=8;break;
case 8: KeyNo+=12;
}
}
//蜂鸣器
void Beep()
C 100 -
{
uchar i;
for(i=0;i<100;i++)
{
DelayMS(1);
BEEP=~BEEP;
}
BEEP=0;
}
//主程序
void main()
{
P0=0x00;
BEEP=0;
while(1)
{
P1=0xf0;
if(P1!=0xf0) Keys_Scan(); //获取键序号
if(Pre_KeyNo!=KeyNo)
{
P0=~DSY_CODE[KeyNo];
Beep();
Pre_KeyNo=KeyNo;
}
DelayMS(100);
}
}
??