Berbagi teknologi

51 mikrokontroler tertanam pengembangan: 5. Tombol, operasi tombol matriks dan simulasi protues

2024-07-12

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


提示

1 Pengenalan tombol

1.1 Jenis kunci

Kunci adalah tombol atau sakelar yang digunakan untuk mengontrol penyambungan dan pemutusan suatu perangkat atau sirkuit elektronik. Mereka biasanya memiliki dua keadaan: terbuka dan tertutup. Berikut ini adalah pengenalan beberapa tombol saklar umum:

  1. Sakelar Tombol Tekan: Ini adalah tombol sederhana yang menghubungkan rangkaian saat ditekan dan memutus rangkaian saat dilepaskan. Mereka sering digunakan untuk mengontrol tombol on/off perangkat atau memicu fungsi tertentu.
  2. Sakelar Toggle: Sakelar sakelar adalah sakelar dengan posisi tetap yang dapat dialihkan secara manual. Mereka biasanya memiliki dua atau lebih posisi tetap (seperti terbuka dan tertutup), dan peralihan posisi sakelar menghubungkan atau memutus suatu rangkaian.
  3. Sakelar Geser: Sakelar geser adalah sakelar yang mengubah keadaan dengan menggeser sebuah tombol. Mereka biasanya memiliki dua posisi, dan rangkaian dihubungkan atau diputuskan dengan menggeser penggeser dari satu posisi ke posisi lainnya.
  4. Sakelar Toggle: Sakelar sakelar adalah sakelar yang mengubah keadaan dengan memutar sebuah tombol. Mereka biasanya memiliki posisi tengah dan dua posisi ekstrim, dengan rangkaian dihubungkan atau diputuskan dengan membalik tombol dari satu posisi ke posisi lainnya.
  5. Sakelar Tombol: Sakelar tombol tekan mirip dengan sakelar tekan, tetapi biasanya memiliki mekanisme pegas yang secara otomatis kembali ke posisi semula ketika tombol dilepaskan. Mereka sering digunakan dalam aplikasi di mana Anda perlu menahan tombol untuk mempertahankan koneksi, dan melepaskan tombol untuk memutus sirkuit.
  6. Sakelar Elektronik: Sakelar elektronik adalah sakelar yang menggunakan komponen elektronik (seperti transistor atau relay) untuk mengontrol penyambungan dan pemutusan suatu rangkaian.Mereka dapat mengontrol keadaan peralihan melalui sinyal listrik atau metode pemicu lainnya

1.2 Skenario penerapan tombol

Beberapa skenario penerapan tombol mekanis:

  1. Keyboard komputer: Keyboard mekanis banyak digunakan di bidang komputer. Karena tombol mekanis memberikan nuansa sentuhan dan pergerakan tombol yang lebih baik, pengalaman mengetik dan bermain game menjadi lebih nyaman dan presisi.
  2. Peralatan game: Kunci mekanis banyak digunakan di konsol game, pengontrol game, dan keyboard mekanis game. Umpan balik sentuhan dan waktu respons cepat dari tombol mekanis membantu meningkatkan kinerja kontrol game.
  3. Peralatan kontrol industri: Tombol mekanis memiliki daya tahan yang kuat dan cocok untuk skenario yang memerlukan pengoperasian sering pada peralatan kontrol industri, seperti panel kontrol mekanis, konsol robot, dll.
  4. Peralatan komunikasi: Tombol mekanis dapat digunakan pada peralatan komunikasi seperti ponsel, telepon, dan walkie-talkie untuk memberikan sentuhan dan keandalan tombol yang lebih baik.
  5. Peralatan audio: Tombol mekanis banyak digunakan pada peralatan audio, seperti mixer, panel kontrol audio, keyboard musik, dll.
  6. Peralatan medis: Tombol mekanis biasanya digunakan pada peralatan medis, seperti instrumen medis, panel kontrol meja operasi, dll. Stabilitas dan keandalan tombol mekanis sangat penting untuk pengoperasian normal peralatan medis.
  7. Peralatan otomotif dan penerbangan: Tombol mekanis dapat digunakan di panel kontrol otomotif, panel instrumen pesawat terbang, dan skenario lain yang memerlukan keandalan dan daya tahan tinggi.
    Daya tahan, rasa, dan keandalan kunci mekanis menjadikannya pilihan utama di banyak bidang. Baik untuk meningkatkan efisiensi kerja atau memberikan pengalaman pengguna yang lebih baik, tombol mekanis banyak digunakan dalam banyak skenario aplikasi.

rangkaian 2 tombol

Diagram skema rangkaian kunci pada papan pengembangan adalah sebagai berikut. J11 digunakan untuk mengontrol apakah tombol 0/4/8/ ada di keyboard matriks atau tombol independen.

Masukkan deskripsi gambar di sini

Tombol sebenarnya dari papan pengembangan seperti yang ditunjukkan pada gambar
Masukkan deskripsi gambar di sini

Masukkan deskripsi gambar di sini

Desain perangkat lunak 3 tombol

3.1 Implementasi tombol

Pertama, kami menerapkan tombol independen. Gunakan tutup jumper untuk melakukan hubungan pendek J11 dan 2.3, sehingga tombol 0/4/8/C dapat digunakan secara independen.
1. Rekayasa perangkat lunak, kita membuat dua file baru, c51_key.c dan c51_key.h, menerapkan include.h di c51_key.c, menyertakan c51_key.h di include.h, dan menambahkan kedua file tersebut ke proyek seperti yang ditunjukkan gambar.

Masukkan deskripsi gambar di sini

Karena kami ingin menampilkan nilai tombol, kami menggunakan tabung digital depan untuk menampilkan datanya.
Fungsi tampilan ditunjukkan di bawah ini.

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

Di c51_key.c, terapkan deteksi kunci

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

Dikutip dalam program utama utama:

#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 Metode pemfilteran tombol

/********************************************************
函数名称: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 Desain perangkat lunak tombol matriks

//Menampilkan nilai kode segmen 01234567, yang dapat dilihat sesuai dengan diagram skematik dan menampilkan status konfigurasi tingkat titik tinggi pin sesuai dengan grafik yang berbeda.

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 Simulasi Tombol Protues

Tombol independen untuk menampilkan hasilnya, saklar DIP, sambungkan salah satu ujung tombol ke ground

Masukkan deskripsi gambar di sini

Simulasi tombol keyboard matriks:Masukkan deskripsi gambar di sini

4 Ringkasan operasi utama

Dalam aplikasi mikrokontroler, desain keandalan deteksi kunci sangat penting untuk memastikan input yang benar dan pengoperasian sistem yang stabil. Berikut beberapa prinsip desain untuk meningkatkan keandalan deteksi kunci:

  1. Hilangkan jitter tombol: Jitter tombol mengacu pada sinyal tidak stabil singkat yang dihasilkan saat tombol ditekan atau dilepaskan. Untuk menghilangkan jitter, metode penghapusan jitter perangkat keras atau perangkat lunak dapat digunakan. Di sisi perangkat keras, kapasitor eksternal atau jaringan RC dapat digunakan untuk menyaring jitter. Dalam hal perangkat lunak, penundaan perangkat lunak atau mesin negara dapat digunakan untuk menstabilkan sinyal-sinyal utama.
  2. Gunakan resistor pull-up/pull-down eksternal: Dengan menggunakan resistor pull-up atau pull-down eksternal yang dihubungkan ke pin kunci, Anda dapat memastikan bahwa kunci tetap stabil saat tidak ditekan. Melakukan hal ini mencegah sinyal mengambang ketika tombol tidak ditekan.
  3. Algoritme penundaan dan debounce: Menerapkan algoritma penundaan dan debounce yang tepat dalam perangkat lunak dapat meningkatkan keandalan deteksi penekanan tombol. Penundaan dapat memastikan status kunci stabil dan menghindari pemicuan yang salah. Algoritme debounce dapat menyaring jitter penekanan tombol untuk memastikan bahwa hanya operasi penekanan tombol yang valid yang terdeteksi.
  4. Deteksi dan konfirmasi ganda: Untuk meningkatkan keandalan, mekanisme deteksi dan konfirmasi beberapa kunci dapat digunakan. Misalnya, pengatur waktu atau interupsi perangkat lunak dapat digunakan untuk mendeteksi status kunci secara berkala, dan beberapa konfirmasi dapat digunakan untuk memastikan pemicuan kunci yang efektif.
  5. Buffer input dan mesin status: Gunakan buffer input untuk menyimpan input penekanan tombol, lalu gunakan mesin status untuk memproses input. Mesin negara dapat melacak status kunci dan menangani peristiwa penting untuk memastikan kebenaran dan stabilitas operasi utama.
  6. Isolasi interferensi catu daya dan kabel ground: Untuk mencegah pengaruh interferensi catu daya dan pengembalian kabel ground pada sinyal kunci, tindakan isolasi yang tepat dapat diambil. Misalnya, gunakan power plane dan ground plane secara terpisah, atau gunakan filter untuk mengurangi interferensi.
  7. Mekanisme toleransi kesalahan untuk perangkat keras dan perangkat lunak: Rancang mekanisme toleransi kesalahan untuk melindungi keandalan input kunci ketika terjadi kesalahan atau kondisi abnormal. Misalnya, deteksi redundansi, deteksi checksum, mekanisme penanganan kesalahan dan pemulihan, dll.
    Secara umum, desain deteksi kunci yang andal perlu mempertimbangkan secara komprehensif berbagai faktor dalam perangkat keras dan perangkat lunak, serta melakukan pengoptimalan dan penyesuaian yang tepat sesuai dengan skenario aplikasi tertentu. Melalui desain dan implementasi yang tepat, stabilitas, keakuratan, dan keandalan kunci dapat dipastikan.