Compartilhamento de tecnologia

51 desenvolvimento embarcado de microcontrolador: 5. Botão, operação de botão de matriz e simulação de protues

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


提示

Introdução de 1 botão

1.1 Tipos de chave

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:

  1. Interruptor de botão: Este é um botão simples que conecta um circuito quando pressionado e interrompe o circuito quando liberado. Eles são frequentemente usados ​​para controlar o botão liga/desliga de um dispositivo ou acionar uma função específica.
  2. Chave seletora: Uma chave seletora é uma chave com uma posição fixa que pode ser trocada manualmente. Eles geralmente têm duas ou mais posições fixas (como aberto e fechado), e mudar a posição da chave conecta ou desconecta um circuito.
  3. Interruptor deslizante: Um interruptor deslizante é um interruptor que muda de estado deslizando um botão. Eles geralmente têm duas posições, e o circuito é conectado ou desconectado deslizando o controle deslizante de uma posição para outra.
  4. Chave seletora: Uma chave seletora é uma chave que muda de estado girando um botão. Geralmente possuem uma posição intermediária e duas posições extremas, sendo o circuito conectado ou desconectado girando o botão de uma posição para outra.
  5. Interruptor de botão: Um interruptor de botão é semelhante a um interruptor de pressão, mas geralmente possui um mecanismo de mola que retorna automaticamente à sua posição original quando o botão é liberado. Eles são frequentemente usados ​​em aplicações onde você precisa manter pressionado um botão para manter uma conexão e soltar o botão para interromper o circuito.
  6. Chave Eletrônica: Uma chave eletrônica é uma chave que usa componentes eletrônicos (como transistores ou relés) para controlar a conexão e desconexão de um circuito.Eles podem controlar o estado de comutação através de sinais elétricos ou outros métodos de disparo

1.2 Cenários de aplicação de botão

Alguns cenários de aplicação de botões mecânicos:

  1. Teclado de computador: Os teclados mecânicos são amplamente utilizados na área de informática. Como as teclas mecânicas proporcionam melhor sensação de toque e deslocamento das teclas, a experiência de digitação e jogo é mais confortável e precisa.
  2. Equipamento de jogo: As teclas mecânicas são amplamente utilizadas em consoles de jogos, controladores de jogos e teclados mecânicos de jogos. O feedback tátil e o rápido tempo de resposta dos botões mecânicos ajudam a melhorar o desempenho do controle do jogo.
  3. Equipamentos de controle industrial: Os botões mecânicos possuem grande durabilidade e são adequados para cenários que exigem operações frequentes em equipamentos de controle industrial, como painéis de controle mecânico, consoles de robôs, etc.
  4. Equipamento de comunicação: Botões mecânicos podem ser usados ​​em equipamentos de comunicação, como telefones celulares, telefones e walkie-talkies, para fornecer melhor toque e confiabilidade nos botões.
  5. Equipamento de áudio: As teclas mecânicas são amplamente utilizadas em equipamentos de áudio, como mixers, painéis de controle de áudio, teclados musicais, etc.
  6. Equipamento médico: Os botões mecânicos são comumente usados ​​em equipamentos médicos, como instrumentos médicos, painéis de controle de mesa cirúrgica, etc.
  7. Equipamentos automotivos e de aviação: Botões mecânicos podem ser utilizados em painéis de controle automotivo, painéis de instrumentos de aeronaves e outros cenários que exigem alta confiabilidade e durabilidade.
    A durabilidade, o toque e a confiabilidade das chaves mecânicas fazem delas a escolha preferida em muitas áreas. Seja para melhorar a eficiência do trabalho ou proporcionar uma melhor experiência ao usuário, os botões mecânicos são amplamente utilizados em muitos cenários de aplicação.

Circuito de 2 botões

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.

Insira a descrição da imagem aqui

Os botões reais da placa de desenvolvimento são mostrados na figura
Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

Design de software de 3 botões

3.1 Implementação de botão

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.

Insira a descrição da imagem aqui

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;  	//取位码
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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;
	}
	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

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());
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

3.2 Método de filtragem de botão

/********************************************************
函数名称: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;
	}
	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

3.3 Design de software do botão Matrix

//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
  • 1
  • 2
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);     //返回该值
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

3.4 Simulação de botões Protues

Botão independente para exibir o resultado, interruptor DIP, conecte uma extremidade do botão ao terra

Insira a descrição da imagem aqui

Simulação de teclas do teclado matricial:Insira a descrição da imagem aqui

4 Resumo das principais operações

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:

  1. Elimine o jitter da tecla: O jitter da tecla refere-se ao breve sinal instável gerado quando um botão é pressionado ou liberado. Para eliminar o jitter, métodos de eliminação de jitter por hardware ou software podem ser usados. Do lado do hardware, capacitores externos ou redes RC podem ser usados ​​para filtrar o jitter. Em termos de software, atrasos de software ou máquinas de estado podem ser usados ​​para estabilizar sinais principais.
  2. Use resistores pull-up/pull-down externos: Ao usar um resistor pull-up ou pull-down externo conectado ao pino da chave, você pode garantir que a tecla permaneça estável quando não for pressionada. Isso evita sinais flutuantes quando as teclas não são pressionadas.
  3. Algoritmos de atraso e debounce: A implementação de algoritmos de atraso e debounce apropriados no software pode melhorar a confiabilidade da detecção de pressionamentos de tecla. O atraso pode garantir o status estável da chave e evitar falsos disparos. O algoritmo de debounce pode filtrar o jitter de pressionamento de tecla para garantir que apenas operações válidas de pressionamento de tecla sejam detectadas.
  4. Detecção e confirmação múltipla: Para melhorar a confiabilidade, vários mecanismos de detecção e confirmação de chave podem ser usados. Por exemplo, um temporizador ou interrupção de software pode ser usado para detectar periodicamente o status da chave, e múltiplas confirmações podem ser usadas para garantir o acionamento efetivo da chave.
  5. Buffers de entrada e máquinas de estado: use buffers de entrada para armazenar a entrada de pressionamento de tecla e, em seguida, use uma máquina de estado para processar a entrada. A máquina de estado pode rastrear o status principal e lidar com eventos importantes para garantir a correção e estabilidade das operações principais.
  6. Isolamento de interferência da fonte de alimentação e do fio terra: Para evitar a influência da interferência da fonte de alimentação e do retorno do fio terra no sinal principal, medidas de isolamento apropriadas podem ser tomadas. Por exemplo, use planos de alimentação e de aterramento separados ou use filtros para reduzir a interferência.
  7. Mecanismos de tolerância a falhas para hardware e software: Projete mecanismos de tolerância a falhas para proteger a confiabilidade da entrada de chaves quando ocorrerem erros ou condições anormais. Por exemplo, detecção de redundância, detecção de soma de verificação, tratamento de erros e mecanismos de recuperação, etc.
    Em geral, o projeto confiável de detecção de chaves precisa considerar de forma abrangente vários fatores de hardware e software e fazer otimizações e ajustes apropriados de acordo com cenários de aplicação específicos. Através de projeto e implementação adequados, a estabilidade, precisão e confiabilidade das chaves podem ser garantidas.