蓝桥杯单片机独立按键和矩阵按键
2018-03-10 23:54
1731 查看
首先看原理图
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/04/be2e6c7d3d35fe83048c128a8f429594)
1. 独立按键:
注意:我们使用蓝桥杯的板子时候,写代码之前一定要将在板子上将J5的2和3用跳线帽连接起来
检测原理:
51单片机上电之后P3的8个IO口全部都是高电平,按键一端连接的是GND,按键按下电路接通使得另外一端的电平变成了低电平,也就是说我们只要检测对应的IO口是不是低电平就可以检测按键是否按下。
从原理图可以看到,当J5的2和3连接的时候,如果S7被按下,则P30会变成低电平,同样的S6对应着P31,S5对应P32,S4对应P33
程序目的:将每次的键值在数码管上面显示出来
程序测试:
我们只需要看P3的低三位哪一个是低电平,就可以知道哪一个键被按下
下面程序就是用数码管将键值打印出来,当没有独立按键按下时数码管显示0,有键按下的时候显示键值.
首先我们必须非常清楚独立按键的原理,才能继续玩矩阵按键,独立按键是因为按键的一端连接GND,另一端连接IO口,当按键按下的时候电路接通,IO口为低电平判断按键被按下.
我么检测矩阵按键也可以是同样的思路,这个时候我们蓝桥杯只要将J5的1和2引脚连上就可以用矩阵按键了,当时唯一值得注意的是,如果我们用时蓝桥杯的转接板有些引脚就不一样,我们的P36被替换成了P42,P37替换成了P44.在这里我们不考虑转接板的情况.
根据原理图,我们循环给某一行或者循环给某一列低电平,加入我们循环给四列依次给其中一列低电平,其他的列给高电平,检测行变化,某个键被按下会导致相应的行产生低电平,注意单片机的电平变化是”与”的关系,只有有一方为低电平,另外一方就会为低电平,这是单片机IO口内部结构决定的.我们根据相应的行和列出现低电平的位置就可以计算出被按下的键的位置unsigned char key_code[] = {0x7f,0xbf,0xdf,0xef};
//按键扫描函数
unsigned char key_scan()
{
int i,key_value=0;
//判断按键
for(i=0;i<4;i++)
{
P3 = key_code[i];
//如果检测到按键被按下
if(P3!=key_code[i])
{
delay_ms(20);//延时消抖
if(P3!=key_code[i])//如果仍然检测到按键被按下,则按键真的被按下
{
switch(P3&0x0f)
{
//检测按键是不是松开
case(0x0e):{while(P3==(key_code[i]&0xfe));key_value=4*i+7;}break;
case(0x0d):{while(P3==(key_code[i]&0xfd));key_value=4*i+6;}break;
case(0x0b):{while(P3==(key_code[i]&0xfb));key_value=4*i+5;}break;
case(0x07):{while(P3==(key_code[i]&0xf7));key_value=4*i+4;}break;
}
}
}
}
return key_value;
}
1. 独立按键:
注意:我们使用蓝桥杯的板子时候,写代码之前一定要将在板子上将J5的2和3用跳线帽连接起来
检测原理:
51单片机上电之后P3的8个IO口全部都是高电平,按键一端连接的是GND,按键按下电路接通使得另外一端的电平变成了低电平,也就是说我们只要检测对应的IO口是不是低电平就可以检测按键是否按下。
从原理图可以看到,当J5的2和3连接的时候,如果S7被按下,则P30会变成低电平,同样的S6对应着P31,S5对应P32,S4对应P33
程序目的:将每次的键值在数码管上面显示出来
程序测试:
我们只需要看P3的低三位哪一个是低电平,就可以知道哪一个键被按下
下面程序就是用数码管将键值打印出来,当没有独立按键按下时数码管显示0,有键按下的时候显示键值.
//按键检测函数 unsigned char key_scan(){ unsigned char key_value = 0; //当独立按键按下时,会使低三位有一个不是高电平 if((P3&0x0F)!=0x0F){ delay_ms(50); //延时消抖 if((P3&0x0F)!=0x0F){ switch(P3&0x0F){ case 0x0e:key_value = 7;break; case 0x0d:key_value = 6;break; case 0x0b:key_value = 5;break; case 0x07:key_value = 4;break; } } } return key_value; } void main() { while(1){ //关于数码管的显示的函数我有篇文章已经专门写好 display_num(1,key_scan()); } }2. 矩阵按键
首先我们必须非常清楚独立按键的原理,才能继续玩矩阵按键,独立按键是因为按键的一端连接GND,另一端连接IO口,当按键按下的时候电路接通,IO口为低电平判断按键被按下.
我么检测矩阵按键也可以是同样的思路,这个时候我们蓝桥杯只要将J5的1和2引脚连上就可以用矩阵按键了,当时唯一值得注意的是,如果我们用时蓝桥杯的转接板有些引脚就不一样,我们的P36被替换成了P42,P37替换成了P44.在这里我们不考虑转接板的情况.
根据原理图,我们循环给某一行或者循环给某一列低电平,加入我们循环给四列依次给其中一列低电平,其他的列给高电平,检测行变化,某个键被按下会导致相应的行产生低电平,注意单片机的电平变化是”与”的关系,只有有一方为低电平,另外一方就会为低电平,这是单片机IO口内部结构决定的.我们根据相应的行和列出现低电平的位置就可以计算出被按下的键的位置unsigned char key_code[] = {0x7f,0xbf,0xdf,0xef};
//按键扫描函数
unsigned char key_scan()
{
int i,key_value=0;
//判断按键
for(i=0;i<4;i++)
{
P3 = key_code[i];
//如果检测到按键被按下
if(P3!=key_code[i])
{
delay_ms(20);//延时消抖
if(P3!=key_code[i])//如果仍然检测到按键被按下,则按键真的被按下
{
switch(P3&0x0f)
{
//检测按键是不是松开
case(0x0e):{while(P3==(key_code[i]&0xfe));key_value=4*i+7;}break;
case(0x0d):{while(P3==(key_code[i]&0xfd));key_value=4*i+6;}break;
case(0x0b):{while(P3==(key_code[i]&0xfb));key_value=4*i+5;}break;
case(0x07):{while(P3==(key_code[i]&0xf7));key_value=4*i+4;}break;
}
}
}
}
return key_value;
}
相关文章推荐
- 【C51】单片机独立按键与矩阵按键
- 【C51】单片机独立按键与矩阵按键
- 【蓝桥杯单片机组】| DS1302(官方驱动)+ 矩阵按键 + 数码管(改,解决数码管跳动的问题)
- 关于单片机蓝桥杯——按键与矩阵按键
- 单片机==独立按键led灯(7)
- 51单片机独立按键程序
- 51单片机:独立按键与矩阵按键控制数码管
- 独立按键和矩阵键盘
- 单片机开发——独立按键的扫描
- 单片机==独立按键+数码管计数+扫描法(8)
- 单片机开发——独立按键的扫描
- 独立按键与矩阵按键的使用
- 8.5 单片机独立按键的扫描
- 单片机独立按键
- 单片机==独立按键+蜂鸣器(10)
- 8.7 单片机矩阵按键的扫描
- 单片机(四)__矩阵按键
- 单片机==独立按键+数码管计数+中断法(9)
- 单片机==独立按键之抢答器
- 单片机中独立键盘与矩阵键盘