最近写一个项目时,遇到了一个有点”奇怪“(我太菜了)的矩阵键盘,思索加搜索过后,总结一下驱动方法。先上电路图:
在仿真Proteus种叫做KEYPAD-PHONE
以下是项目程序片段(不包含main.c)
#include "all.h" //自定义的头文件
int keyvalue;
int reserve_1[2],reserve_2[2]; //1是温度,2是湿度
void delay(int i)
{
int j=110;
for( ;i>0;i--)
for( ;j>0;j--);
}
void keydown_reserve() //10-->* 11-->0 12-->#
{
int reserve[3];
uchar temp;
temp=keydown();
if(temp!=13)
{
switch(p)
{
case(0): reserve[0]=temp;p++;break;
case(1): reserve[1]=temp;p++;break;
case(2): reserve[2]=temp;p++;break;
default: break;
}
if(p==3)
{
if(reserve[2]==10) //*设湿度
{
real_temp2[8]=table[reserve[0]];
real_temp2[9]=table[reserve[1]];
reserve_2[0]=table[reserve[0]]-48; //将这个值保存在一个数组中,字符串类型和int类型的值差了48
reserve_2[1]=table[reserve[1]]-48;
}
else if(reserve[2]==12) //#设置温度
{
real_temp1[14]=table[reserve[0]];
real_temp1[15]=table[reserve[1]];
reserve_1[0]=table[reserve[0]]-48;
reserve_1[1]=table[reserve[1]]-48;
}
p=0;
}
}
}
int keydown()
{
int k;
keyvalue=13;
all_key=0x7e; //第三列
k=all_key;
if(k!=0x7e)
{
delay(10);
k=all_key;
if(k!=0x7e)
{
k=all_key;
switch(k)
{
case(0x76):keyvalue=3;break;
case(0x6e):keyvalue=6;break;
case(0x5e):keyvalue=9;break;
case(0x3e):keyvalue=12;break;
}
}
while(all_key!=0x7e); //松手检测
}
all_key=0x7d; //第二列
k=all_key;
if(k!=0x7d)
{
delay(10);
k=all_key;
if(k!=0x7d)
{
k=all_key;
switch(k)
{
case(0x75):keyvalue=2;break;
case(0x6d):keyvalue=5;break;
case(0x5d):keyvalue=8;break;
case(0x3d):keyvalue=11;break;
}
}
while(all_key!=0x7d); //松手检测
}
all_key=0x7b; //第一列
k=all_key;
if(k!=0x7b)
{
delay(10);
k=all_key;
if(k!=0x7b)
{
k=all_key;
switch(k)
{
case(0x73):keyvalue=1;break;
case(0x6b):keyvalue=4;break;
case(0x5b):keyvalue=7;break;
case(0x3b):keyvalue=10;break;
}
}
while(all_key!=0x7b); //松手检测
}
return keyvalue;
}
实现功能:
1、按下按键时,返回按键的值。
2、按连续按下两个数字,后面再按#或*;按#表示设置湿度,按星号表示设置温度。
在此做个总结。如果有哪位大佬愿意给出更好的意见,不胜感激!