Обмен технологиями

Разработка встроенного микроконтроллера 51: 5. Кнопка, работа матричной кнопки и моделирование функций.

2024-07-12

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


提示

1 введение кнопки

1.1 Типы ключей

Ключ — это кнопка или переключатель, используемый для управления подключением и отключением электронного устройства или цепи. Обычно они имеют два состояния: открытое и закрытое. Ниже приводится введение в некоторые распространенные кнопки переключения:

  1. Кнопочный переключатель: это простая кнопка, которая замыкает цепь при нажатии и размыкает цепь при отпускании. Они часто используются для управления включением/выключением устройства или запуска определенной функции.
  2. Тумблер: Тумблер — это переключатель с фиксированным положением, который можно переключать вручную. Обычно они имеют два или более фиксированных положения (например, открытое и закрытое), а переключение положения переключателя подключает или отключает цепь.
  3. Ползунковый переключатель: Ползунковый переключатель — это переключатель, который меняет состояние при перемещении кнопки. Обычно они имеют два положения, а подключение или отключение цепи осуществляется перемещением ползунка из одного положения в другое.
  4. Тумблер: Тумблер — это переключатель, который меняет состояние при повороте кнопки. Обычно они имеют среднее положение и два крайних положения, при этом подключение или отключение цепи осуществляется переключением кнопки из одного положения в другое.
  5. Кнопочный переключатель: кнопочный переключатель похож на нажимной переключатель, но обычно имеет пружинный механизм, который автоматически возвращается в исходное положение при отпускании кнопки. Их часто используют в приложениях, где нужно зажать кнопку, чтобы сохранить соединение, и отпустить кнопку, чтобы разорвать цепь.
  6. Электронный переключатель: Электронный переключатель — это переключатель, в котором используются электронные компоненты (такие как транзисторы или реле) для управления подключением и отключением цепи.Они могут контролировать состояние переключения с помощью электрических сигналов или других методов запуска.

1.2 Сценарии применения кнопок

Некоторые сценарии применения механических кнопок:

  1. Компьютерная клавиатура: Механические клавиатуры широко используются в компьютерной сфере. Поскольку механические клавиши обеспечивают лучшее ощущение прикосновения и ход клавиш, набор текста и игры становятся более удобными и точными.
  2. Игровое оборудование: Механические клавиши широко используются в игровых консолях, игровых контроллерах и игровых механических клавиатурах. Тактильная обратная связь и быстрое время отклика механических кнопок помогают повысить эффективность управления игрой.
  3. Промышленное оборудование управления: Механические кнопки обладают высокой прочностью и подходят для сценариев, требующих частых операций с промышленным оборудованием управления, таким как механические панели управления, консоли роботов и т. д.
  4. Коммуникационное оборудование. Механические кнопки можно использовать в коммуникационном оборудовании, таком как мобильные телефоны, телефоны и рации, чтобы обеспечить лучшее нажатие кнопок и надежность.
  5. Аудиооборудование: Механические клавиши широко используются в аудиооборудовании, таком как микшеры, панели управления звуком, музыкальные клавиатуры и т. д.
  6. Медицинское оборудование. Механические кнопки обычно используются в медицинском оборудовании, например, в медицинских инструментах, панелях управления операционным столом и т. д. Стабильность и надежность механических кнопок имеют решающее значение для нормальной работы медицинского оборудования.
  7. Автомобильное и авиационное оборудование. Механические кнопки можно использовать в автомобильных панелях управления, приборных панелях самолетов и в других случаях, требующих высокой надежности и долговечности.
    Прочность, удобство и надежность механических ключей делают их предпочтительным выбором во многих областях. Механические кнопки широко используются во многих сценариях применения как для повышения эффективности работы, так и для улучшения пользовательского опыта.

2-кнопочная схема

Принципиальная схема схемы клавиш на плате разработки следующая: J11 используется для управления кнопками 0/4/8/ на матричной клавиатуре или независимыми клавишами. 16 клавиш управляются набором портов P3X.

Вставьте сюда описание изображения

Фактические кнопки макетной платы показаны на рисунке.
Вставьте сюда описание изображения

Вставьте сюда описание изображения

Дизайн программного обеспечения с 3 кнопками

3.1 Реализация кнопки

Сначала мы реализуем независимые кнопки. Используйте перемычку для замыкания J11 и 2.3, чтобы кнопки 0/4/8/C можно было использовать независимо.
1. Разработка программного обеспечения: мы создаем два новых файла, c51_key.c и c51_key.h, применяем include.h в c51_key.c, включаем c51_key.h в include.h и добавляем два файла в проект, как показано на рисунке.

Вставьте сюда описание изображения

Поскольку мы хотим отображать значение кнопки, мы используем переднюю цифровую трубку для отображения данных.
Функция дисплея показана ниже.

/********************************************************
函数名称: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

В c51_key.c реализуйте обнаружение ключей.

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

Цитируется в основной программе main:

#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 Метод фильтрации кнопок

/********************************************************
函数名称: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 Разработка программного обеспечения матричной кнопки

//Отображение значения кода сегмента 01234567, которое можно просмотреть в соответствии со схематической схемой, и отображение состояния конфигурации уровня верхней точки контакта, соответствующего различным графикам.

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 Имитация функций кнопок

Независимая кнопка для отображения результата, DIP-переключатель, подключите один конец кнопки к земле.

Вставьте сюда описание изображения

Имитация клавиш матричной клавиатуры:Вставьте сюда описание изображения

4 Краткое описание ключевых операций

В приложениях с микроконтроллерами надежность обнаружения ключей имеет решающее значение для обеспечения правильного ввода и стабильной работы системы. Вот некоторые принципы проектирования, позволяющие повысить надежность обнаружения ключей:

  1. Устранение дрожания клавиш. Дрожанием клавиш называют кратковременный нестабильный сигнал, генерируемый при нажатии или отпускании кнопки. Для устранения джиттера можно использовать аппаратные или программные методы устранения джиттера. Что касается аппаратного обеспечения, для фильтрации джиттера можно использовать внешние конденсаторы или RC-цепи. Что касается программного обеспечения, для стабилизации ключевых сигналов можно использовать программные задержки или конечные автоматы.
  2. Используйте внешние повышающие/понижающие резисторы. Используя внешний повышающий или понижающий резистор, подключенный к контакту клавиши, вы можете гарантировать, что клавиша остается стабильной, когда она не нажата. Это предотвратит появление плавающих сигналов, когда клавиши не нажаты.
  3. Алгоритмы задержки и устранения дребезга. Реализация соответствующих алгоритмов задержки и устранения дребезга в программном обеспечении может повысить надежность обнаружения нажатия клавиш. Задержка может обеспечить стабильное состояние ключа и избежать ложного срабатывания. Алгоритм устранения дребезга может фильтровать дрожание нажатия клавиш, чтобы гарантировать обнаружение только действительных операций нажатия клавиш.
  4. Множественное обнаружение и подтверждение. Для повышения надежности можно использовать несколько механизмов обнаружения и подтверждения ключей. Например, для периодического определения состояния ключа можно использовать программный таймер или прерывание, а для обеспечения эффективного срабатывания ключа можно использовать несколько подтверждений.
  5. Буферы ввода и конечные автоматы. Используйте входные буферы для хранения ввода, введенного с помощью клавиш, а затем используйте конечный автомат для обработки ввода. Конечный автомат может отслеживать состояние ключей и обрабатывать ключевые события, чтобы обеспечить правильность и стабильность ключевых операций.
  6. Помехоизоляция источника питания и заземляющего провода: Чтобы предотвратить влияние помех источника питания и возврата заземляющего провода на ключевой сигнал, можно принять соответствующие меры по изоляции. Например, используйте отдельные слои питания и заземления или используйте фильтры для уменьшения помех.
  7. Механизмы отказоустойчивости для аппаратного и программного обеспечения. Разработайте механизмы отказоустойчивости для защиты надежности ввода с клавиатуры при возникновении ошибок или ненормальных условий. Например, можно использовать обнаружение избыточности, обнаружение контрольной суммы, механизмы обработки ошибок и восстановления и т. д.
    В целом, надежная конструкция обнаружения ключей должна всесторонне учитывать различные факторы аппаратного и программного обеспечения, а также выполнять соответствующую оптимизацию и настройку в соответствии с конкретными сценариями применения. Благодаря правильному проектированию и реализации можно обеспечить стабильность, точность и надежность ключей.