独立按键、4×4矩阵按键
一、独立按键
(1)独立按键1.0
代码样例(分文件编程)
config.h
// 初始化灯端口和数码管端口
sbit L0 = P1^0;
sbit L1 = P1^1;
sbit L2 = P1^2;
sbit L3 = P1^3;
sbit L4 = P1^4;
sbit L5 = P1^5;
sbit L6 = P1^6;
sbit L7 = P1^7;
sbit K1 = P3^4;
sbit K2 = P3^5;
sbit K3 = P3^6;
sbit K4 = P3^7;
main.c
#include<reg52.h>
#include "config.h"
void main()
{ // 1111 1111
P1 = 0xff; // 让P1口一开始的灯全部为高电平,也就是不亮
while(1)
{
L0 = K1; //控制第一、二个灯亮
L1 = K1;
L2 = K2; //控制第三、四个灯亮
L3 = K2;
L4 = K3; //控制第五、六个灯亮
L5 = K3;
L6 = K4; //控制第七、八个灯亮
L7 = K4;
}
}
(2)独立按键2.0
消除按键抖动
config.h
// 初始化灯端口和数码管端口
sbit L0 = P1^0;
sbit L1 = P1^1;
sbit L2 = P1^2;
sbit L3 = P1^3;
sbit L4 = P1^4;
sbit L5 = P1^5;
sbit L6 = P1^6;
sbit L7 = P1^7;
sbit K1 = P3^4;
sbit K2 = P3^5;
sbit K3 = P3^6;
sbit K4 = P3^7;
main.c
#include<reg52.h>
#include "config.h"
void delay(unsigned int xms) // 延迟函数
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
void main()
{
P1 = 0xff; // 让P1口一开始的灯全部为高电平,也就是不亮
while(1)
{
if(K1 == 0) // 头一次按键,灯亮
{
delay(10); // 第一次按键后延迟10xms
if(K1 == 0) // 再一次按下
{
while(K1 == 0); // 只要按键没有松开 ,会一直卡在这里
L0 = ~L0; // 按久松开后,灯会一直亮
}
}
}
}
二、4X4矩阵按键
(1)所用到的位移概念:
位运算左移、右移、异或看这:位运算解析
(2)代码实现:
config.h
// 初始化端口
sbit L0 = P1^0;
sbit L1 = P1^1; // led灯口初始化
sbit L2 = P1^2;
sbit L3 = P1^3;
sbit L4 = P1^4;
sbit L5 = P1^5;
sbit L6 = P1^6;
sbit L7 = P1^7;
sbit K1 = P3^4; // 独立键盘口初始化
sbit K2 = P3^5;
sbit K3 = P3^6;
sbit K4 = P3^7;
sbit DUAN = P2^6; // 段选口初始化
sbit WEI = P2^7; // 位选口初始化
main.c
#include<reg52.h>
#include "config.h"
void delay(unsigned int xms) // 延迟函数
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
unsigned char code sz[17] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00 // 0-9&A-F 不显示字型码
};
void showdata(unsigned char num) // 数码管显示函数
{
P0 = sz[num]; // 开始段选
DUAN = 1; // 传信号,让它记住
DUAN = 0; // 锁死现在的状态
}
void keyhandle()
{
unsigned char t,key;
/**********************第一行矩阵*******************/
P3 = 0xfe; // 1111 1110 让P3.0口输出低
t=P3;
t=t&0xf0; // 1111 0000 屏蔽后四位
if(t != 0xf0) // 说明按键有被按住
{
delay(10);
t = P3;
t = t&0xf0;
if( t != 0xf0)
{
t = P3;
switch(t)
{
case 0xee:
key = 0; // 此时为 1110 1110 S1按键被按下
break;
case 0xde:
key = 1; // 此时为 1101 1110 S2按键被按下
break;
case 0xbe:
key = 2; // 此时为 1011 1110 S3按键被按下
break;
case 0x7e:
key = 3; // 此时为 0111 1110 S4按键被按下
break;
}
// 判断按键是否被松开
while( t != 0xf0){
t = P3;
t = t&0xf0;
}
showdata(key);
}
}
/**********************第二行矩阵*******************/
P3 = 0xfd; // 1111 1101 让P3.1口输出低
t=P3;
t=t&0xf0; // 1111 0000 屏蔽后四位
if(t != 0xf0) // 说明按键有被按住
{
delay(10);
t = P3;
t = t&0xf0;
if( t != 0xf0)
{
t = P3;
switch(t)
{
case 0xed:
key = 4; // 此时为 1110 1101 S5按键被按下
break;
case 0xdd:
key = 5; // 此时为 1101 1101 S6按键被按下
break;
case 0xbd:
key = 6; // 此时为 1011 1101 S7按键被按下
break;
case 0x7d:
key = 7; // 此时为 0111 1101 S8按键被按下
break;
}
// 判断按键是否被松开
while( t != 0xf0){
t = P3;
t = t&0xf0;
}
showdata(key);
}
}
/**********************第三行矩阵*******************/
P3 = 0xfb; // 1111 1011 让P3.2口输出低
t=P3;
t=t&0xf0; // 1111 0000 屏蔽后四位
if(t != 0xf0) // 说明按键有被按住
{
delay(10);
t = P3;
t = t&0xf0;
if( t != 0xf0)
{
t = P3;
switch(t)
{
case 0xeb:
key = 8; // 此时为 1110 1011 S9按键被按下
break;
case 0xdb:
key = 9; // 此时为 1101 1011 S10按键被按下
break;
case 0xbb:
key = 10; // 此时为 1011 1011 S11按键被按下
break;
case 0x7b:
key = 11; // 此时为 0111 1011 S12按键被按下
break;
}
// 判断按键是否被松开
while( t != 0xf0){
t = P3;
t = t&0xf0;
}
showdata(key);
}
}
/**********************第四行矩阵*******************/
P3 = 0xf7; // 1111 0111 让P3.3口输出低
t=P3;
t=t&0xf0; // 1111 0000 屏蔽后四位
if(t != 0xf0) // 说明按键有被按住
{
delay(10);
t = P3;
t = t&0xf0;
if( t != 0xf0)
{
t = P3;
switch(t)
{
case 0xe7:
key = 12; // 此时为 1110 0111 S13按键被按下
break;
case 0xd7:
key = 13; // 此时为 1101 0111 S14按键被按下
break;
case 0xb7:
key = 14; // 此时为 1011 0111 S15按键被按下
break;
case 0x77:
key = 15; // 此时为 0111 0111 S16按键被按下
break;
}
// 判断按键是否被松开
while( t != 0xf0){
t = P3;
t = t&0xf0;
}
showdata(key); // 把按键的值发给数组,让其对应的数字打印再数码管上
}
}
}
void main()
{
P0 = 0; // 让位存,8位同时全部显示
WEI = 1; // 接受信号
WEI = 0; // 让锁存器锁死信号
while(1)
{
keyhandle(); // 不断的扫描,查看按了哪个键
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/68456.html