Xiaocodenong учит вас кнопкам микроконтроллера (чтобы позже научить вас энкодеру)

искусственный интеллект задняя часть
Xiaocodenong учит вас кнопкам микроконтроллера (чтобы позже научить вас энкодеру)

«Это 17-й день моего участия в ноябрьском испытании обновлений. Подробную информацию об этом событии см.:Вызов последнего обновления 2021 г."

Мелкие кодовые фермеры для президента, кхм, смеете говорить, что ключи нельзя делать ради знаний?

Независимые клавиши и матричные клавиши

Независимые ключи

шаблон

image-20211003103823595

image-20211003103840293

После нажатия кнопки часто возникает проблема дрожания.Эластичность самой кнопки, нажатие или отпускание кнопки сформирует нестабильный процесс воздействия.Этот процесс занимает определенное время, поэтому микроконтроллер не может считать Статус ввода-вывода во время этого процесса. , который может быть задержан программно или аппаратно.

image-20211003104559765

Схема

image-20211007190350080

image-20211007201116318

Простая функция кнопок (для умных машин можно наклониться)

image-20211007223125755

процесс показан

Причина того, что GIF не сделан, заключается в том, что после завершения прошло не менее 1M, из-за чего моя опечатка была вставлена, и я не стал бы ее отображать, поэтому я отправил ее на станцию ​​B, а станция B будет моей видеотекой. в будущем.

Функции

Кнопки сверху - это всего лишь один клик и один клик.Ничего привлекательного, нет яркого пятна, поэтому мы нажимаем его и начинаем сначала.

image-20211008103752881

Демонстрация полуфабриката

Добавлено отображение долгого нажатия

нищий дисплей

//按键扫描
void Key_Scan_Drive()
{
	static bit flag = 0;//长短按标志
	static bit key_down = 0;//按下标志,由于双击也用这个,所以标记范围得扩大
	
	static u8 count1 = 0;//计数器1,因为100以内,所以u8足够了
	static u16 count2 = 0;//计数器2,大于255就用u16
	
	if(key_down)//检测按键是否被按下过
	{
		count2++;
		if(count2>250)
		{
			count2 = 0;		
			flag = 1;	
			//长按程序
			LCD12864_Write_Cmd(0x8c);
			LCD12864_Write_Data(0x30);
			LCD12864_Write_Data(0x30+LCD12864_Num_Buffer[1]);
		}
		if(KEY1)
		{
			key_down = 0;//松开就把标志清零
			count2 = 0;
			if(flag)
			{
				flag = 0;
			}
			else
			{
				//短按程序
				LCD12864_Write_Cmd(0x8c);
				LCD12864_Write_Data(0x30);
				LCD12864_Write_Data(0x30+LCD12864_Num_Buffer[3]);
			}
		}
	}
	else
	{
		if(!KEY1)
		{
			count1++;
			if(count1>20)
			{
				count1 = 0;
				if(!KEY1)
				{
					key_down = 1;
				}
			}				
		}
	}	
}

Так же есть функция всегда добавлять и добавлять, но код в принципе аналогичен, заново писать не надо, это все повторная аналогичная работа

оргазм

Матричная клавиатура

P6^0 P6^1 P6^2 P6^3 четыре строки — сканирование строк, P6^4 P6^5 P6^6 P6^7 четыре строки — сканирование столбцов. 4 строки и 4 столбца используют в общей сложности 8 портов ввода-вывода, которые могут сканировать состояние переключателя 16 клавиш, что является преимуществом матричной клавиатуры.(резистор должен быть подключен последовательно между портами ввода-вывода).

Схема

image-20211008151721195

анализировать

image-20211008230455357

#include "all.h"

u8 code KEY4x4_Buffer[4] = {0xef,0xdf,0xbf,0x7f};//列输入 /列控制数组
u8 xdata KEY4x4_Read_Byte = 0;   //读到/检测到的字节


void KEY4x4_Drive_Init()
{
	P6M1 = 0;
	P6M0 = 0; 
}

void KEY4x4_Scan_Drive()
{
	static xdata u16 count = 0;
	u8 i = 0;
	u8 j = 0;//循环扫描变量
	u8 Value = 0;//检测行变量
	count++;
	if(count>10)//通过计数的方式来减少循环次数,还消抖
	{
		count = 0;
		for(i = 0;i<4;i++)//列输入 /列控制 
		{
			P6 = KEY4x4_Buffer[i];
			Value = 0x08;
			for(j = 0;j<4;j++)
			{
				if(!(Value&P6))//哪个位被拉成0了就会被检测到
				{
					KEY4x4_Read_Byte = j*4+i+1;
				}
				Value >>= 1;//右移一位
			}		
		}	
		P6 = 0xff;//P6口用完拉高,因为以后会用到他
	}
	
}

Матричная клавиатура