minhas informações de contato
Correspondência[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
提示
Uma chave é um botão ou interruptor usado para controlar a conexão e desconexão de um dispositivo ou circuito eletrônico. Eles geralmente têm dois estados: aberto e fechado. A seguir está uma introdução a alguns botões de comutação comuns:
Alguns cenários de aplicação de botões mecânicos:
O diagrama esquemático do circuito de teclas na placa de desenvolvimento é o seguinte: J11 é usado para controlar se os botões 0/4/8/estão no teclado matricial ou teclas independentes. As 16 teclas são controladas por um conjunto de portas P3X.
Os botões reais da placa de desenvolvimento são mostrados na figura
Primeiro, implementamos botões independentes. Use um jumper para curto-circuitar J11 e 2.3, para que os botões 0/4/8/C possam ser usados de forma independente.
1. Engenharia de software, criamos dois novos arquivos, c51_key.c e c51_key.h, aplicamos include.h em c51_key.c, incluímos c51_key.h em include.h e adicionamos os dois arquivos ao projeto como mostra a imagem.
Como queremos exibir o valor do botão, usamos o tubo digital frontal para exibir os dados.
A função de exibição é mostrada abaixo.
/********************************************************
函数名称:sys_keynum_ledon
函数功能:显示按键数值
入口参数:按键数值
出口参数:
修 改:
内 容:
********************************************************/
void sys_keynum_ledon(unsigned char num)
{
//根据原理图,将P0口全部输出高电平,P2选择0号数码管
P0=EL[num];//取显示数据,段码
P2=0; //取位码
}
Em c51_key.c, implemente a detecção de chave
bit key1=0; //定义按键位置
bit key2=0;
bit key3=0;
bit key4=0;
/********************************************************
函数名称:sys_key_single
函数功能:按键检测
入口参数:
出口参数:按键数值
修 改:
内 容:
********************************************************/
static unsigned char key1_history = 0;//缓存上一次按键的结果
unsigned char sys_key_single(void)
{
key1=P30; //定义按键位置
key2=P31;
key3=P32;
key4=P33;
if(!key1) //按下相应的按键,数码管显示相应的码值
{
key1_history = 1;
return 1;
}
else if(!key2)
{
key1_history = 2;
return 2;
}
else if(!key3)
{
key1_history = 3;
return 3;
}
else if(!key4)
{
key1_history = 4;
return 4;
}
else
{
return key1_history;
}
}
Citado no programa principal principal:
#include "includes.h"
/*------------------------------------------------
延时子程序
------------------------------------------------*/
void delay(unsigned int cnt)
{
while(--cnt);
}
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
//8个指示灯的操作
sys_led();
sys_led_test();
sys_led_test1();
sys_ledtube_on1();
sys_ledtube_on2();
//主循环中添加其他需要一直工作的程序
while (1)
{
sys_keynum_ledon(sys_key_single());
}
}
/********************************************************
函数名称:sys_key_single
函数功能:按键检测,带有消抖策略
入口参数:
出口参数:按键数值
修 改:
内 容:
********************************************************/
static unsigned char key1_history = 0;//缓存上一次按键的结果
unsigned char sys_key_single(void)
{
key1=P30; //定义按键位置
key2=P31;
key3=P32;
key4=P33;
if(!key1) //按下相应的按键,数码管显示相应的码值
{
delay(1000);
if(!key1)
{
key1_history = 1;
return 1;
}
else
{
return key1_history;
}
}
else if(!key2)
{
delay(1000);
if(!key2)
{
key1_history = 2;
return 2;
}
else
{
return key1_history;
}
}
else if(!key3)
{
delay(1000);
if(!key3)
{
key1_history = 3;
return 3;
}
else
{
return key1_history;
}
}
else if(!key4)
{
delay(1000);
if(!key4)
{
key1_history = 4;
return 4;
}
else
{
return key1_history;
}
}
else
{
return key1_history;
}
}
//Exibir o valor do código de segmento 01234567, que pode ser visualizado correspondente ao diagrama esquemático e exibir o status de configuração de nível alto do pino correspondente a diferentes gráficos.
unsigned char const EL[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
unsigned char sys_key_board(void)
{
unsigned char key = 0x00;
unsigned char num = 0x00;
key=keyscan(); //调用键盘扫描
if(key == 0xFF)
{
num = key1_history;
}
else
{
switch(key)
{
case 0xee:num = 0x0;break;//0按下相应的键显示相对应的码值
case 0xde:num = 0x1;break;//1 按下相应的键显示相对应的码值
case 0xbe:num = 0x2;break;//2
case 0x7e:num = 0x3;break;//3
case 0xed:num = 0x4;break;//4
case 0xdd:num = 0x5;break;//5
case 0xbd:num = 0x6;break;//6
case 0x7d:num = 0x7;break;//7
case 0xeb:num = 0x8;break;//8
case 0xdb:num = 0x9;break;//9
case 0xbb:num = 0xA;break;//a
case 0x7b:num = 0xB;break;//b
case 0xe7:num = 0xC;break;//c
case 0xd7:num = 0xD;break;//d
case 0xb7:num = 0xE;break;//e
case 0x77:num = 0xF;break;//f
default:num = key1_history; break;
}
key1_history = num;
}
return num;
}
/*------------------------------------------------
键盘扫描程序
------------------------------------------------*/
unsigned char keyscan(void) //键盘扫描函数,使用行列反转扫描法
{
unsigned char cord_h,cord_l;//行列值中间变量
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}
return(0xff); //返回该值
}
Botão independente para exibir o resultado, interruptor DIP, conecte uma extremidade do botão ao terra
Simulação de teclas do teclado matricial:
Em aplicações de microcontroladores, o projeto de confiabilidade da detecção de chaves é crucial para garantir a entrada correta e a operação estável do sistema. Aqui estão alguns princípios de design para melhorar a confiabilidade da detecção de chaves: