기술나눔

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라는 두 개의 새 파일을 생성하고, c51_key.c에 include.h를 적용하고, include.h에 c51_key.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

메인 프로그램 메인에서 인용:

#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. 하드웨어 및 소프트웨어에 대한 내결함성 메커니즘: 오류나 비정상적인 상황이 발생할 때 키 입력의 신뢰성을 보호하기 위한 내결함성 메커니즘을 설계합니다. 예를 들어 중복 감지, 체크섬 감지, 오류 처리 및 복구 메커니즘 등을 사용할 수 있습니다.
    일반적으로 신뢰할 수 있는 키 감지 설계에서는 하드웨어와 소프트웨어의 다양한 요소를 종합적으로 고려하고 특정 애플리케이션 시나리오에 따라 적절한 최적화 및 조정을 수행해야 합니다. 적절한 설계와 구현을 통해 키의 안정성, 정확성 및 신뢰성을 보장할 수 있습니다.