提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
学了了独立键盘之后,发现使用一个按键就要浪费一个GPIO,有没有一种节约GPIO的方法,比如要用16个键盘,怎么样才能节省IO口
sbit key0= P1^0; //
if(key0==0)
{
delay(20);//按键消抖
if(key0==0)
{
led0=1; 亮
}
}
独立键盘,接一个按键,就会浪费一个IO口
独立键盘的程序非常好写,就在上面程序的基础上,添加引脚和判断
sbit key0= P1^0; //
sbit key1= P1^1; //
if(key0==0)
{
delay(20);//按键消抖
if(key0==0)
{
led0=1; 亮
}
}
if(key1==0)
{
delay(20);//按键消抖
if(key1==0)
{
led1=1; 亮
}
}
就是由独立键盘组成的?
sbit key0= P1^0; //
sbit key1= P1^1; //
sbit key2= P1^2; //
sbit key3= P1^3; //
sbit lie0=P1^4;
while(1)
{
lie0=0;
if(key0==0)
{
delay(20);//按键消抖
if(key0==0)
{
led0=1; 亮
}
}
if(key1==0)
{
delay(20);//按键消抖
if(key1==0)
{
led1=1; 亮
}
}
if(key0==0)
{
delay(20);//按键消抖
if(key2==0)
{
led0=1; 亮
}
}
if(key3==0)
{
delay(20);//按键消抖
if(key1==0)
{
led1=1; 亮
}
}
}
sbit key0= P1^0; //
sbit key1= P1^1; //
sbit key2= P1^2; //
sbit key3= P1^3; //
sbit lie0=P1^4;
sbit lie1=P1^5;
while(1)
{
lie0=0;lie1=1;// 判断第一列
if(key0==0)
{
delay(20);//按键消抖
if(key0==0)
{
led0=1; 亮 //按键0
}
}
if(key1==0)
{
delay(20);//按键消抖
if(key1==0)
{
led1=1; 亮1
}
}
if(key0==0)
{
delay(20);//按键消抖
if(key2==0)
{
led0=1; 亮2
}
}
if(key3==0)
{
delay(20);//按键消抖
if(key1==0)
{
led1=1; 亮3
}
}
}
lie0=1;lie1=0;// 判断第一列
if(key0==0)
{
delay(20);//按键消抖
if(key0==0)
{
led0=1; 亮4
}
}
if(key1==0)
{
delay(20);//按键消抖
if(key1==0)
{
led1=1; 亮5
}
}
if(key0==0)
{
delay(20);//按键消抖
if(key2==0)
{
led0=1; 亮6
}
}
if(key3==0)
{
delay(20);//按键消抖
if(key1==0)
{
led1=1; 亮7
}
}
}
sbit key0= P1^0; //
sbit key1= P1^1; //
sbit key2= P1^2; //
sbit key3= P1^3; //
sbit lie0=P1^4;
sbit lie1=P1^5;
sbit lie2=P1^6;
sbit lie3=P1^7;
while(1)
{
lie0=0;lie1=1;lie2=0;lie3=1;// 判断第1列
if(key0==0)
{
delay(20);//按键消抖
if(key0==0)
{
led0=1; 亮 //按键0
}
}
if(key1==0)
{
delay(20);//按键消抖
if(key1==0)
{
led1=1; 亮1
}
}
if(key2==0)
{
delay(20);//按键消抖
if(key2==0)
{
led0=1; 亮2
}
}
if(key3==0)
{
delay(20);//按键消抖
if(key1==0)
{
led1=1; 亮3
}
}
lie0=1;lie1=0;lie2=1;lie3=1;// 判断第2列
if(key0==0)
{
delay(20);//按键消抖
if(key0==0)
{
led0=1; 亮4
}
}
if(key1==0)
{
delay(20);//按键消抖
if(key1==0)
{
led1=1; 亮5
}
}
if(key2==0)
{
delay(20);//按键消抖
if(key2==0)
{
led0=1; 亮6
}
}
if(key3==0)
{
delay(20);//按键消抖
if(key1==0)
{
led1=1; 亮7
}
}
lie0=1;lie1=0;// 判断第一列
if(key0==0)
{
delay(20);//按键消抖
if(key0==0)
{
led0=1; 亮4
}
}
if(key1==0)
{
delay(20);//按键消抖
if(key1==0)
{
led1=1; 亮5
}
}
if(key2==0)
{
delay(20);//按键消抖
if(key2==0)
{
led0=1; 亮6
}
}
if(key3==0)
{
delay(20);//按键消抖
if(key1==0)
{
led1=1; 亮7
}
}
lie0=1;lie1=1;lie2=0;lie3=1;// 判断第3列
if(key0==0)
{
delay(20);//按键消抖
if(key0==0)
{
led0=1; 亮4
}
}
if(key1==0)
{
delay(20);//按键消抖
if(key1==0)
{
led1=1; 亮5
}
}
if(key2==0)
{
delay(20);//按键消抖
if(key2==0)
{
led0=1; 亮6
}
}
if(key3==0)
{
delay(20);//按键消抖
if(key1==0)
{
led1=1; 亮7
}
}
lie0=1;lie1=1;lie2=1;lie3=0;// 判断第3列
if(key0==0)
{
delay(20);//按键消抖
if(key0==0)
{
led0=1; 亮4
}
}
if(key1==0)
{
delay(20);//按键消抖
if(key1==0)
{
led1=1; 亮5
}
}
if(key2==0)
{
delay(20);//按键消抖
if(key2==0)
{
led0=1; 亮6
}
}
if(key3==0)
{
delay(20);//按键消抖
if(key1==0)
{
led1=1; 亮7
}
}
}
//1. 改变列 P14-P17
//2. 循环体 循环扫描对应四个引脚 P10-P13
/*
1110
1101
1011
0111
temp= ~(1<
//P1= 1110 1111 // P14=0
// keynum 1-16
unsigned char key_scan()
{
for(i=0;i<4;i++)
{
temp=(~(1<<i))<<4;
P1=temp|0x0f;
if(key0==0) // i=0,S1; i=1,S2; i=2 ,S3; i=3,S4
{
delay(20);//按键消抖
if(key0==0)
{
led0=1; 亮1
keynum=i+1; // i: 0-3 1-4
}
}
else
{
keynum=0;
}
if(key1==0) //i=0,S3
{
delay(20);//按键消抖
if(key1==0)
{
led1=1; 亮5
keynum=i+1+4; // i: 0-3 5-8
}
}
else
{
keynum=0;
}
if(key2==0)
{
delay(20);//按键消抖
if(key2==0)//i=0,S9
{
led0=1; 亮6
keynum=i+1+4+4; // i: 0-3 9-12
}
}
else
{
keynum=0;
}
if(key3==0)//i=0,S13
{
delay(20);//按键消抖
if(key1==0)
{
led1=1; 亮7
keynum=i+1+4+4+4; // i: 0-3 13-16
}
}
else
{
keynum=0;
}
}
return keynum;
}
void main()
{
unsigned char num;
while(1)
{
num=key_scan();// 1-16
if(num==1)
{
}
}
}
//1. 改变列 P14-P17
//2. 循环体 循环扫描对应四个引脚 P10-P13
/*
1110
1101
1011
0111
temp= ~(1<
//P1= 1110 1111 // P14=0
// keynum 1-16
unsigned char key_scan()
{
for(i=0;i<4;i++)
{
temp=(~(1<<i))<<4;
P1=temp|0x0f;
for(j=0;j<4;j++)
{
// 0000 1110 key0 0000 1111 & 0000 1110 == 0000 1110 无按键: 0000 1111 & 0000 1111= 0000 1111
// 0000 1101 key1 0000 1111 & 0000 1101 == 0000 1101 无按键: 0000 1111 & 0000 1111= 0000 1111
// 0000 1011 key2
// 0000 0111 key3
if(P1 & (~(1<<j))==(~(1<<j)) )
{
delay();
if(P1 & (~(1<<j))==(~(1<<j)) )
{
keynum=i+j*4+1; // 1-4
// j=0 0-3 1-4
//j=1 0-3 5-8
//j=2 9-12
//j=3 13-16
}
}
}
}
return keynum;
}
void main()
{
unsigned char num;
while(1)
{
num=key_scan();// 1-16
if(num==1)
{
}
}
}
//1. 改变列 P14-P17
//2. 循环体 循环扫描对应四个引脚 P10-P13
/*
1110
1101
1011
0111
temp= ~(1<
//P1= 1110 1111 // P14=0
// keynum 1-16
unsigned char key_scan()
{
for(i=0;i<4;i++)
{
temp=(~(1<<i))<<4;
P1=temp|0x0f;
for(j=0;j<4;j++)
{
// 0000 1110 key0
//若按键按下 0000 0001 & 0000 1110 0000 0000
//无若按键按下 0000 0001 & 0000 1111 0000 0001
// 0000 1101 key1
//若按键按下 0000 0010 & 0000 1101 0000 0000
//若无按键按下 0000 0010 & 0000 1111 0000 0010
// 0000 1011 key2
//若按键按下 0000 0100 & 0000 1101 0000 0000
//若无按键按下 0000 0100 & 0000 1111 0000 0100
// 0000 0111 key3
//若按键按下 0000 1000 & 0000 0111 0000 0000
//若无按键按下 0000 1000 & 0000 1111 0000 1000
// 为了区别四个按键,可以将 P1的状态取反
temp1=P1&0X0F; // 0000 0001 & 1111 0001 = 0000 0001
temp1 =~temp1; //
if(temp1 & (1<<j)==(1<<j) )
{
delay();
if(temp1 & (1<<j)==(1<<j) )
{
keynum=i+j*4+1; // 1-4
// j=0 0-3 1-4
//j=1 0-3 5-8
//j=2 9-12
//j=3 13-16
}
}
else
{
keynum=0;
}
}
}
return keynum;
}
void main()
{
unsigned char num;
while(1)
{
num=key_scan();// 1-16
if(num==1)
{
}
}
}
从独立键盘到矩阵键盘,由浅入深,还有很多矩阵键盘的思路,这个是从独立键盘一步步优化过来的,更加方便理解。行列扫描的方法,今后继续更新。初学者只要掌握以上方法就好。