现象:
按键S7、S11、S15、S19数码管显示00-03
按键S6、S10、S14、S18数码管显示04-07
按键S5、S9、S13、S17数码管显示08-11
按键S4、S8、S12、S16数码管显示12-15
矩阵键盘介绍:
注意:J5接KBD矩阵键盘
矩阵键盘就是4×4,一共16个按键。其工作原理是:一个按键周围有四个引脚,其中两个短接了有着上电时的电平,这时另外两个也有着相同的电平,但是由于键帽没有按下故而没有连通,检测原理是键帽按下时该两个引脚连通电平与两外两个引脚相同,检测按下。
按键检测原理 :
如图,因为每一时刻只能检测到一个按键,且每个引脚检测着四个键帽的按下与否,所以我们可以列坐标穷举。
按键检测:
//行定义
sbit R1=P3^0;
sbit R2=P3^1;
sbit R3=P3^2;
sbit R4=P3^3;
//列定义
sbit C1=P4^4;
sbit C2=P4^2;
sbit C3=P3^5;
sbit C4=P3^4;
void key_board()
{
//第一行
R1=0;
R2=R3=R4=1;
C1=C2=C3=C4=1;
if(C1==0) //(1,1)
{
while(C1==0) //等待按键松开
key_value=0;
}
else if(C2==0) //(1,2)
{
while(C2==0);
key_value=1;
}
else if(C3==0) //(1,3)
{
while(C3==0);
key_value=2;
}
else if(C4==0) //(1,4)
{
while(C4==0);
key_value=3;
}
//第二行......依此类推
完整代码:
#include <STC15F2K60S2.H>
//行定义
sbit r1=P3^0;
sbit r2=P3^1;
sbit r3=P3^2;
sbit r4=P3^3;
//列定义
sbit c1=P4^4;
sbit c2=P4^2;
sbit c3=P3^5;
sbit c4=P3^4;
code unsigned char tab[] = { 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xFF};
unsigned char buf[8] = {10, 10, 10, 10, 10, 10, 10, 10}; //段选
unsigned char key_value=0xff; //键值
bit flag;
void key_board();
void display();
//关闭蜂鸣器
void cls_buzz()
{
P2=(P2&0x1f)|0xa0;
P0=0x00;
P2&=0x1f;
}
//关闭led
void cls_led()
{
P2=(P2&0x1f)|0x80;
P0=0xff;
P2&=0x1f;
}
//定时器初始化+开启中断
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
}
//主函数
void main()
{
Timer0Init();
cls_buzz();
cls_led();
while(1)
{
if(flag)
{
flag=0;
key_board();
if(key_value!=0xff)
{
buf[6]=key_value/10;
buf[7]=key_value%10;
}
}
}
}
//中断服务函数
void Timer0_Proc() interrupt 1
{
static unsigned char ms;
if(++ms==10)
{
flag=1;
ms=0;
}
display();
}
//另外一种方法
//矩阵键盘
//void key_board()
//{
// static unsigned char hang;
// static unsigned char key_flag=0;
// switch(key_flag)
// {
// case 0:
// {
//
// P3=0x0f;
// P42=0;
// P44=0;
// //初始状态
// if(P3!=0x0f) //有按键按下
// key_flag=1;
// }
// break;
// case 1: //1 进入行处理
// {
// P3=0x0f;
// P42=0;
// P44=0;
// if(P3!=0x0f) //有按键按下
// {
// if(P30==0){hang=1;}
// else if(P31==0){hang=2;}
// else if(P32==0){hang=3;}
// else if(P33==0){hang=4;} //检测在哪行按下
// switch(hang) //进入列处理
// {
// case 1:
// {
// P3=0xf0; //P34属于高四位了 所以是P3=0xf0;
// P42=1; //进入列处理赋值1
// P44=1;
// if(P44==0){key_value=0;key_flag=2;}
// else if(P42==0){key_value=1;key_flag=2;}
// else if(P35==0){key_value=2;key_flag=2;}
// else if(P34==0){key_value=3;key_flag=2;}
// }
// break;
// case 2:
// {
// P3=0xf0;
// P42=1;
// P44=1;
// if(P44==0){key_value=4;key_flag=2;}
// else if(P42==0){key_value=5;key_flag=2;}
// else if(P35==0){key_value=6;key_flag=2;}
// else if(P34==0){key_value=7;key_flag=2;}
// }
// break;
// case 3:
// {
// P3=0xf0;
// P42=1;
// P44=1;
// if(P44==0){key_value=8;key_flag=2;}
// else if(P42==0){key_value=9;key_flag=2;}
// else if(P35==0){key_value=10;key_flag=2;}
// else if(P34==0){key_value=11;key_flag=2;}
// }
// break;
// case 4:
// {
// P3=0xf0;
// P42=1;
// P44=1;
// if(P44==0){key_value=12;key_flag=2;}
// else if(P42==0){key_value=13;key_flag=2;}
// else if(P35==0){key_value=14;key_flag=2;}
// else if(P34==0){key_value=15;key_flag=2;}
// }
// break;
// }
// }
// }
// break;
// case 2:
// {
// P3=0x0f;
// P42=0;
// P44=0;
// if(P3==0x0f) //松开按键
// key_flag=0;
// }
// break;
// }
//
//}
//数码管显示
void display(void)
{
static unsigned char com = 0;
P0 = 0xff;
P2 = ((P2 & 0x1f) | 0xE0);
P2 &= 0x1f;
P0 = 1 << com;
P2 = ((P2 & 0x1f) | 0xC0);
P2 &= 0x1f;
P0 = tab[buf[com]];
P2 = ((P2 & 0x1f) | 0xE0);
P2 &= 0x1f;
if(++com == 8)
{
com = 0;
}
}
//矩阵键盘
void key_board()
{
//第一行
r1=0;
r2=r3=r4=1;
c1=c2=c3=c4=1;
if(c1==0)
{
while(c1==0);//等待松开
key_value=0; //s7
}
else if(c2==0)
{
while(c2==0);
key_value=1;
}
else if(c3==0)
{
while(c3==0);
key_value=2;
}
else if(c4==0)
{
while(c4==0);
key_value=3;
}
//第二行
r2=0;
r1=r3=r4=1;
c1=c2=c3=c4=1;
if(c1==0)
{
while(c1==0);//等待松开
key_value=4; //s7
}
else if(c2==0)
{
while(c2==0);
key_value=5;
}
else if(c3==0)
{
while(c3==0);
key_value=6;
}
else if(c4==0)
{
while(c4==0);
key_value=7;
}
//第三行
r3=0;
r2=r1=r4=1;
c1=c2=c3=c4=1;
if(c1==0)
{
while(c1==0);//等待松开
key_value=8; //s7
}
else if(c2==0)
{
while(c2==0);
key_value=9;
}
else if(c3==0)
{
while(c3==0);
key_value=10;
}
else if(c4==0)
{
while(c4==0);
key_value=11;
}
//第四行
r4=0;
r2=r3=r1=1;
c1=c2=c3=c4=1;
if(c1==0)
{
while(c1==0);//等待松开
key_value=12; //s7
}
else if(c2==0)
{
while(c2==0);
key_value=13;
}
else if(c3==0)
{
while(c3==0);
key_value=14;
}
else if(c4==0)
{
while(c4==0);
key_value=15;
}
}
标签:P3,value,else,蓝桥,单片机,flag,key,Day13,sbit From: https://blog.csdn.net/2302_80724534/article/details/140554239