내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
提示
키는 전자 장치나 회로의 연결 및 연결 해제를 제어하는 데 사용되는 버튼 또는 스위치입니다. 일반적으로 열림과 닫힘의 두 가지 상태가 있습니다. 다음은 몇 가지 일반적인 스위치 버튼에 대한 소개입니다.
기계식 버튼의 일부 적용 시나리오:
개발 보드의 키 회로 회로도는 다음과 같습니다. J11은 0/4/8/버튼이 매트릭스 키보드에 있는지 또는 독립 키에 있는지 제어하는 데 사용됩니다. 16개의 키는 P3X 포트 세트에 의해 제어됩니다.
개발 보드의 실제 버튼은 그림과 같습니다.
먼저 독립 버튼을 구현하여 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; //取位码
}
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;
}
}
메인 프로그램 메인에서 인용:
#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;
}
}
//개략도에 따라 볼 수 있는 세그먼트 코드 값 01234567을 표시하고 다른 그래픽에 해당하는 핀 하이 포인트 레벨 구성 상태를 표시합니다.
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); //返回该值
}
결과를 표시하는 독립 버튼, DIP 스위치, 버튼 한쪽 끝을 접지에 연결
매트릭스 키보드 키 시뮬레이션:
마이크로 컨트롤러 애플리케이션에서 키 감지의 신뢰성 설계는 올바른 입력과 안정적인 시스템 작동을 보장하는 데 중요합니다. 주요 감지 신뢰성을 향상시키기 위한 몇 가지 설계 원칙은 다음과 같습니다.