技術共有

51 マイコン組み込み開発: 5. ボタン、マトリックス ボタン操作および突起シミュレーション

2024-07-12

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


提示

1 ボタンの紹介

1.1 キーの種類

キーは、電子デバイスまたは回路の接続と切断を制御するために使用されるボタンまたはスイッチです。通常、開いている状態と閉じている状態の 2 つの状態があります。以下は、いくつかの一般的なスイッチ ボタンの紹介です。

  1. 押しボタンスイッチ: これは、押すと回路が接続され、放されると回路が切断されるシンプルなボタンです。これらは、デバイスのオン/オフ スイッチを制御したり、特定の機能をトリガーしたりするためによく使用されます。
  2. トグルスイッチ: トグルスイッチは、手動で切り替えることができる固定位置のスイッチです。通常、2 つ以上の固定位置 (開と閉など) があり、スイッチの位置を切り替えることで回路を接続または切断します。
  3. スライドスイッチ: スライドスイッチは、ボタンをスライドさせることで状態が変化するスイッチです。通常、これらには 2 つの位置があり、スライダーを一方の位置からもう一方の位置にスライドさせることで回路を接続または切断します。
  4. トグルスイッチ: トグルスイッチは、ボタンを回すことによって状態を変更するスイッチです。通常、中間の位置と 2 つの極端な位置があり、ボタンを 1 つの位置から別の位置に切り替えることで回路が接続または切断されます。
  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 という 2 つの新しいファイルを作成し、c51_key.c に include.h を適用し、includes.h に c51_key.h をインクルードし、図に示すように 2 つのファイルをプロジェクトに追加します。

ここに画像の説明を挿入します

ボタンの値を表示したいので、前面のデジタル管を使用してデータを表示します。
表示機能を以下に示します。

/********************************************************
函数名称: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. ハードウェアおよびソフトウェアのフォールト トレランス メカニズム: エラーや異常な状態が発生した場合にキー入力の信頼性を保護するフォールト トレランス メカニズムを設計します。たとえば、冗長性の検出、チェックサムの検出、エラー処理および回復メカニズムなどを使用できます。
    一般に、信頼性の高いキー検出の設計には、ハードウェアとソフトウェアのさまざまな要素を包括的に考慮し、特定のアプリケーション シナリオに応じて適切な最適化と調整を行う必要があります。適切な設計と実装を通じて、キーの安定性、精度、信頼性を確保できます。