这几天写个矩阵按键和独立按键共同使用的功能,找了好久都没有找到代码,后来在一些启发下自己写了个,其实对单片机不熟,只是用来记录下。
以下只是独立按键和矩阵按键的代码,其中sqrkeyscan函数是检测矩阵按键,其基本的架构和书本是一样的,只是里面实现的功能是不一样的(根据自己的需要)。keyscan函数中也是如此,最里面的那层括号内容根据自己的需要修改。
unsigned char sqrflag=0;//用于矩阵键盘的检测
sbit k1=P3^4;//定义一个独立按键
sbit k2=P3^5;//定义一个独立按键
sbit k3=P3^6;//定义一个独立按键
sbit k4=P3^7;//定义一个独立按键
//独立按键和矩阵按键的检测
void keyscan()
{
UART_init();
if(k1==0)//说明按下去了
{
delay(50);//消抖
if(k1==0)
{UART_init();
sqrflag=1;
ES=1;
EA=1;
UART_send_byte('0'); //单片机发送数据到电脑
ES=0;
EA=0;
SCON = 0;
TMOD = 0;
TH1 = 0;
TL1 = 0;
TR1 = 0;
}
while(!k1);//按键松开
}
if(k2==0)//说明按下去了
{
delay(50);//消抖
if(k2==0)
{UART_init();
sqrflag=1;
ES=1;
EA=1;
UART_send_byte('.');
ES=0;
EA=0;
SCON = 0;
TMOD = 0;
TH1 = 0;
TL1 = 0;
TR1 = 0;
}
while(!k2);//按键松开
}
if(k3==0)//说明按下去了
{
delay(50);//消抖
if(k3==0)
{UART_init();
sqrflag=1;
ES=1;
EA=1;
flag=1;
UART_send_byte('=');
ES=0;
EA=0;
SCON = 0;
TMOD = 0;
TH1 = 0;
TL1 = 0;
TR1 = 0;
}
while(!k3);//按键松开
}
if(k4==0)//说明按下去了
{
delay(50);//消抖
if(k4==0)
{UART_init();
sqrflag=1;
ES=1;
EA=1;
UART_send_byte('/');
ES=0;
EA=0;
SCON = 0;
TMOD = 0;
TH1 = 0;
TL1 = 0;
TR1 = 0;
}
while(!k4);//按键松开
}
if(sqrflag==0)
sqrkeyscan();
sqrflag=0;//必须要有,不然到时候用过独立按键后就不能用矩阵按键了
}
//矩阵按键按键检测
void sqrkeyscan(){
UART_init();
P3= 0xfe; //高4位是f 等于写了1 1 1 1 也满足了先写1的要求
temp =P3;//读回来了
temp &= 0xf0;//因为我们只是读回来高4位
while (temp != 0xf0){ //下面的几个while循环判断可以用if好理解。只看到第一行就行了。
//这几个while 都是做判断用的
delay(10);//消除抖动的
temp=P3;
temp &= 0xf0;
while(temp != 0xf0){ //确实不等于0xf0有按键按下
temp = P3;//我们这个时候只是把P3口的值赋给了temp
switch (temp){ //检测P3口。
case 0xee:
ES=1;
EA=1;
UART_send_byte('1');
*(ptr++)='1';
ES=0;
EA=0;
SCON = 0;
TMOD = 0;
TH1 = 0;
TL1 = 0;
TR1 = 0;
break;
case 0xde:
ES=1;
EA=1;
UART_send_byte('2');
*(ptr++)='2';
ES=0;
EA=0;
SCON = 0;
TMOD = 0;
TH1 = 0;
TL1 = 0;
TR1 = 0;
break;
case 0xbe:
ES=1;
EA=1;
UART_send_byte('3');
*(ptr++)='3';
ES=0;
EA=0;
SCON = 0;
TMOD = 0;
TH1 = 0;
TL1 = 0;
TR1 = 0;
break;
case 0x7e:
ES=1;
EA=1;
UART_send_byte('+');
*(ptr++)='+';
ES=0;
EA=0;
SCON = 0;
TMOD = 0;
TH1 = 0;
TL1 = 0;
TR1 = 0;
break;
default: sqrflag=0; break;
}
while(temp != 0xf0)//有按键按下可能是不等于的 循环在这里面 松手检测
{
temp = P3;
temp = temp & 0xf0; //这个是松手检测 松手这里就等于了0xf0
}//下面就显示一下 退出整个一行的循环,不加松手检测会退不出去循环
//到这里是把第一行检测了。
}
}
//以下下是其他几行检测的代码
P3= 0xfd; //高4位是f 等于写了1 1 1 1 也满足了先写1的要求
temp =P3;//读回来了
temp &= 0xf0;//因为我们只是读回来高4位
while (temp != 0xf0){
delay(10);//消除抖动的
temp=P3;
temp &= 0xf0;
while(temp != 0xf0){ //确实不等于0xf0有按键按下
temp = P3;//我们这个时候只是把P3口的值赋给了temp
switch (temp){ //检测P3口。
case 0xed:
ES=1;
EA=1;
UART_send_byte('4');
*(ptr++)='4';
ES=0;
EA=0;
SCON = 0;
TMOD = 0;
TH1 = 0;
TL1 = 0;
TR1 = 0;
break;
case 0xdd:
ES=1;
EA=1;
UART_send_byte('5');
*(ptr++)='5';
ES=0;
EA=0;
SCON = 0;
TMOD = 0;
TH1 = 0;
TL1 = 0;
TR1 = 0;
break;
case 0xbd:
ES=1;
EA=1;
UART_send_byte('6');
*(ptr++)='6';
ES=0;
EA=0;
SCON = 0;
TMOD = 0;
TH1 = 0;
TL1 = 0;
TR1 = 0;
break;
case 0x7d:
ES=1;
EA=1;
UART_send_byte('-');
*(ptr++)='-';
ES=0;
EA=0;
SCON = 0;
TMOD = 0;
TH1 = 0;
TL1 = 0;
TR1 = 0;
break;
default: sqrflag=0; break;
}
while(temp != 0xf0)//有按键按下可能是不等于的 循环在这里面 松手检测
{
temp = P3;
temp = temp & 0xf0; //这个是松手检测 松手这里就等于了0xf0
}//下面就显示一下 退出整个2行的循环。不加松手检测会退不出去循环
//到这里是把第2行检测了。
}
}
P3= 0xfb; //高4位是f 等于写了1 1 1 1 也满足了先写1的要求
temp =P3;//读回来了
temp &= 0xf0;//因为我们只是读回来高4位
while (temp != 0xf0){
delay(10);//消除抖动的
temp=P3;
temp &= 0xf0;
while(temp != 0xf0){ //确实不等于0xf0有按键按下
temp = P3;//我们这个时候只是把P3口的值赋给了temp
switch (temp){ //检测P3口。
case 0xeb:
ES=1;
EA=1;
UART_send_byte('4');
*(ptr++)='4';
ES=0;
EA=0;
SCON = 0;
TMOD = 0;
TH1 = 0;
TL1 = 0;
TR1 = 0;
break;
case 0xdb:
ES=1;
EA=1;
UART_send_byte('5');
*(ptr++)='5';
ES=0;
EA=0;
SCON = 0;
TMOD = 0;
TH1 = 0;
TL1 = 0;
TR1 = 0;
break;
case 0xbb:
ES=1;
EA=1;
UART_send_byte('6');
*(ptr++)='6';
ES=0;
EA=0;
SCON = 0;
TMOD = 0;
TH1 = 0;
TL1 = 0;
TR1 = 0;
break;
case 0x7b:
ES=1;
EA=1;
UART_send_byte('-');
*(ptr++)='-';
ES=0;
EA=0;
SCON = 0;
TMOD = 0;
TH1 = 0;
TL1 = 0;
TR1 = 0;
break;
default: sqrflag=0; break;
}
while(temp != 0xf0)//有按键按下可能是不等于的 循环在这里面 松手检测
{
temp = P3;
temp = temp & 0xf0; //这个是松手检测 松手这里就等于了0xf0
}//下面就显示一下 退出整个3行的循环。 不加松手检测会退不出去循环
//到这里是把第3行检测了。
}
}
P3= 0xf7; //高4位是f 等于写了1 1 1 1 也满足了先写1的要求
temp =P3;//读回来了
temp &= 0xf0;//因为我们只是读回来高4位
while (temp != 0xf0){
delay(10);//消除抖动的
temp=P3;
temp &= 0xf0;
while(temp != 0xf0){ //确实不等于0xf0有按键按下
temp = P3;//我们这个时候只是把P3口的值赋给了temp
switch (temp){ //检测P3口。
case 0xe7:
ES=1;
EA=1;
UART_send_byte('7');
*(ptr++)='7';
ES=0;
EA=0;
SCON = 0;
TMOD = 0;
TH1 = 0;
TL1 = 0;
TR1 = 0;
break;
case 0xd7:
ES=1;
EA=1;
UART_send_byte('8');
*(ptr++)='8';
ES=0;
EA=0;
SCON = 0;
TMOD = 0;
TH1 = 0;
TL1 = 0;
TR1 = 0;
break;
case 0xb7:
ES=1;
EA=1;
flag=1;
UART_send_byte('9');
*(ptr++)='9';
ES=0;
EA=0;
SCON = 0;
TMOD = 0;
TH1 = 0;
TL1 = 0;
TR1 = 0;
break;
case 0x77:
ES=1;
EA=1;
UART_send_byte('*');
*(ptr++)='*';
ES=0;
EA=0;
SCON = 0;
TMOD = 0;
TH1 = 0;
TL1 = 0;
TR1 = 0;
break;
default: sqrflag=0; break;
}
while(temp != 0xf0)//有按键按下可能是不等于的 循环在这里面 松手检测
{
temp = P3;
temp = temp & 0xf0; //这个是松手检测 松手这里就等于了0xf0
}//下面就显示一下 退出整个4行循环。不加松手检测会退不出去循环
//到这里是把第4行检测了。
}
}
}