🌹作者简介: @鹤辞 ,喜欢玩弄单片机,嵌入式,PCB制作,电路设计等等,希望自己的学习经历经验能够对你们有启发
🌹前期回顾:单片机之独立按键(多种按键代码编写)_@鹤辞的博客-CSDN博客
🌹努力目标:突破1000粉丝
🌹支持鹤辞:点赞👍,留言👏, 关注💖,收藏🤞
目录
1,单片机矩阵的来源
2,单片机矩阵按键扫描原理
1,方式一
逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。
2,方式二
我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。
3,单片机protues仿真
1,仿真图
2,仿真效果展示
代码编写
第一种方式:
void key_scan() ///这里只编写了一个一个按键s11,其他按键编写一样
{
P1=0x0f;
if(P1!=0x0f)
{ Delay10ms();
value0=P1;
P1=0xf0;
if(P1!=0xf0)
{Delay10ms();
value1=P1;}
}
value=value0+value1;
if(value==0xbe) num++;
}
项目:利用矩阵键盘实现数码管自加一
#include <reg52.h>
unsigned char smg[]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
unsigned char num=0,value=0,value0=0,value1=0;
void Delay10ms() //@11.0592MHz
{
unsigned char i, j;
i = 108;
j = 145;
do
{
while (--j);
} while (--i);
}
void key_scan()
{
P1=0x0f;
if(P1!=0x0f)
{ Delay10ms();
value0=P1;
P1=0xf0;
if(P1!=0xf0)
{ Delay10ms();
value1=P1;}
}
value=value0+value1;
if(value==0xbe) num++;
}
void smg_display()
{
P2=smg[num];
if(num==10)
num=0;
}
int main()
{
while(1)
{
key_scan();
smg_display();
}
}
第二种方式:
void keyvalue();
{ u8 i;
key_code=0x0f; //lie
if(key_code!=0x0f)
{
Delay10ms();
if(key_code!=0x0f)
{
key_code=0x0f;
switch(key_code)
{
case(0x07): key_val=1;break;
case(0x0b): key_val=2;break;
case(0x0d): key_val=3;break;
case(0x0e): key_val=4;break;
}
key_code=0xf0;
switch(key_code)
{
case(0x70): key_val=key_val;break;
case(0xb0): key_val=key_val+4;break;
case(0xd0): key_val=key_val+8;break;
case(0xe0): key_val=key_val+12;break;
}
while((i<50)&&(key_code!=0xf0)&&(key_code!=0x0f))
{
//Delay10ms();
i++;
}
}
}
}
第三种方式:利用定时器扫描按键
unsigned char key_scan()
{
static unsigned char col=0,keypress=0,pre=0,value=0;
P3=0xf0;P42=1;P44=1;
if((((P3&0x20)==0)||((P3&0x10)==0)||(P42==0)||(P44==0))&&!pre)keypress++;
else keypress=0;
if(keypress==3) //消抖
{
keypress=0;pre=1;
if(P44==0) col=7;
else if(P42==0) col=11;
else if((P3&0x20)==0) col=15;
else if((P3&0x10)==0) col=19;
P3=0x0f;P44=0;P42=0;
if((P3&0x01)==0) value=col+0;
else if((P3&0x02)==0) value=col-1;
else if((P3&0x04)==0) value=col-2;
else if((P3&0x08)==0) value=col-3;
return value;
}
P3=0x0f;P44=0;P42=0;
if((P3==0x0f)&&(P44==0)&&(P42==0)&&(pre==1)) {pre=0;keypress=0;}
//P3=0xf0; P44=1; P42=1;
//if((P3==0xf0)&&(P44==1)&&(P42==1)&&(pre==1)){pre=0;}
return 0;
}
❀❀❀下期:LCD1602仿真及其代码编写
文章制作不易,感谢你的喜欢!点赞👍,留言👏, 关注💖,收藏🤞
下期再见吧🐱🏍🐱🏍🐱🏍🐱🏍🐱🏍🐱🏍