使用矩阵键盘做小键盘输入法的例程—代码开源—简单易懂超详细

CSDN也不支持上传视频,也没法更好的演示,

这玩意儿乍一看挺nb,但其实也就一堆ifelse套出来的,而且非常的长,大概800多行

800多行,先放出来了(代码后面有详细的解释说明,建议慢慢看)

//基于OLED和矩阵按键写的,尽量让我这个代码配套
#include "oled.h"
#include "Key.h"

/*========================================================
*功能描述:	矩阵按键 - 九宫格按键输入功能封装
*						实现对指定数组的大小写字母/数字/符号的输入
*参数说明:	IN[] -> 改变的数组	len -> 数组长度(需要与数组定义个数一致)
*						row -> 显示的行数
*						Key_Mode -> 按键的默认模式(依旧可以通过矩阵键盘更改)
*							0:小写字母	1:大写字母	
*							2:数字模式	3:符号模式
*						on0 -> 是否显示当前输入模式
*							0:显示		1:不显示
*						on1 -> 在输入前是否清屏
*							0:显示		1:不显示
*========================================================*/
//unsigned char arry[10];
//Key_Sudoku(&arry,10,0,0,0,0);
//这样就会在事先定义好的数组里用这套小型输入法把输入的内容写入数组里
//注意;显示数组里的内容是这样写的 -> OLED_ShowString(0,0,DeBug,6);
void Key_Sudoku(unsigned char IN[],unsigned char len,unsigned char row,unsigned char Key_Mode,
								unsigned char on0,unsigned char on1)
{
	char Key_Flag_x = 0;																			//这个变量作为显示位置以及数组定位使用
	unsigned char Key_Value,i;																//前者临时保存输入键值,后者作为临时变量使用
	unsigned char Key_234568 = 0,Key_79 = 0,Key_signed = 0;		//前者作为3字母的变量,后者是4字母
	unsigned char Key_Flag = Key_Mode;												//切换输入模式的标志变量
	unsigned char Key_True = 0;																//作为是否确认当前值的标志位
	for(i=0;i= 4)
			{
				Key_Flag = 0;
			}
		}
		if(Key_Flag == 0)	//小写模式
		{
			if(Key() == 2)				//控制abc的输入
			{
				delay_ms(100);
				if(Key_234568 == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"a_",6);
					Key_Value = 'a';
				}else if(Key_234568 == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"b_",6);
					Key_Value = 'b';
				}else if(Key_234568 == 2)
				{
					OLED_ShowString(6*Key_Flag_x,row,"c_",6);
					Key_Value = 'c';
				}else if(Key_234568 >= 3)
				{
					Key_234568 = 0;
					OLED_ShowString(6*Key_Flag_x,row,"a_",6);
					Key_Value = 'a';
				}
				Key_234568++;
				Key_True = 1;
			}else if(Key() == 3)	//控制def的输入
			{
				delay_ms(100);
				if(Key_234568 == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"d_",6);
					Key_Value = 'd';
				}else if(Key_234568 == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"e_",6);
					Key_Value = 'e';
				}else if(Key_234568 == 2)
				{
					OLED_ShowString(6*Key_Flag_x,row,"f_",6);
					Key_Value = 'f';
				}else if(Key_234568 >= 3)
				{
					Key_234568 = 0;
					OLED_ShowString(6*Key_Flag_x,row,"d_",6);
					Key_Value = 'd';
				}
				Key_234568++;
				Key_True = 1;
			}else if(Key() == 5)	//控制ghi的输入
			{
				delay_ms(100);
				if(Key_234568 == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"g_",6);
					Key_Value = 'g';
				}else if(Key_234568 == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"h_",6);
					Key_Value = 'h';
				}else if(Key_234568 == 2)
				{
					OLED_ShowString(6*Key_Flag_x,row,"i_",6);
					Key_Value = 'i';
				}else if(Key_234568 >= 3)
				{
					Key_234568 = 0;
					OLED_ShowString(6*Key_Flag_x,row,"g_",6);
					Key_Value = 'g';
				}
				Key_234568++;
				Key_True = 1;
			}else if(Key() == 6)	//控制jkl的输入
			{
				delay_ms(100);
				if(Key_234568 == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"j_",6);
					Key_Value = 'j';
				}else if(Key_234568 == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"k_",6);
					Key_Value = 'k';
				}else if(Key_234568 == 2)
				{
					OLED_ShowString(6*Key_Flag_x,row,"l_",6);
					Key_Value = 'l';
				}else if(Key_234568 >= 3)
				{
					Key_234568 = 0;
					OLED_ShowString(6*Key_Flag_x,row,"j_",6);
					Key_Value = 'j';
				}
				Key_234568++;
				Key_True = 1;
			}else if(Key() == 7)	//控制mno的输入
			{
				delay_ms(100);
				if(Key_234568 == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"m_",6);
					Key_Value = 'm';
				}else if(Key_234568 == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"n_",6);
					Key_Value = 'n';
				}else if(Key_234568 == 2)
				{
					OLED_ShowString(6*Key_Flag_x,row,"o_",6);
					Key_Value = 'o';
				}else if(Key_234568 >= 3)
				{
					Key_234568 = 0;
					OLED_ShowString(6*Key_Flag_x,row,"m_",6);
					Key_Value = 'm';
				}
				Key_234568++;
				Key_True = 1;
			}else if(Key() == 9)	//控制pqrs的输入
			{
				delay_ms(100);
				if(Key_234568 == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"p_",6);
					Key_Value = 'p';
				}else if(Key_234568 == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"q_",6);
					Key_Value = 'q';
				}else if(Key_234568 == 2)
				{
					OLED_ShowString(6*Key_Flag_x,row,"r_",6);
					Key_Value = 'r';
				}else if(Key_234568 == 3)
				{
					OLED_ShowString(6*Key_Flag_x,row,"s_",6);
					Key_Value = 's';
				}else if(Key_234568 == 4)
				{
					Key_234568 = 0;
					OLED_ShowString(6*Key_Flag_x,row,"p_",6);
					Key_Value = 'p';
				}
				Key_234568++;
				Key_True = 1;
			}else if(Key() == 10)	//控制tuv的输入
			{
				delay_ms(100);
				if(Key_234568 == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"t_",6);
					Key_Value = 't';
				}else if(Key_234568 == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"u_",6);
					Key_Value = 'u';
				}else if(Key_234568 == 2)
				{
					OLED_ShowString(6*Key_Flag_x,row,"v_",6);
					Key_Value = 'v';
				}else if(Key_234568 >= 3)
				{
					Key_234568 = 0;
					OLED_ShowString(6*Key_Flag_x,row,"t_",6);
					Key_Value = 't';
				}
				Key_234568++;
				Key_True = 1;
			}else if(Key() == 11)	//控制wxyz的输入
			{
				delay_ms(100);
				if(Key_234568 == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"w_",6);
					Key_Value = 'w';
				}else if(Key_234568 == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"x_",6);
					Key_Value = 'x';
				}else if(Key_234568 == 2)
				{
					OLED_ShowString(6*Key_Flag_x,row,"y_",6);
					Key_Value = 'y';
				}else if(Key_234568 == 3)
				{
					OLED_ShowString(6*Key_Flag_x,row,"z_",6);
					Key_Value = 'z';
				}else if(Key_234568 == 4)
				{
					Key_234568 = 0;
					OLED_ShowString(6*Key_Flag_x,row,"w_",6);
					Key_Value = 'w';
				}
				Key_234568++;
				Key_True = 1;
			}else if(Key() == 14)	//输入一个空格
			{
				delay_ms(100);
				OLED_ShowString(6*Key_Flag_x,row," _",6);
				Key_Value = ' ';
				Key_True = 1;
			}
		}else if(Key_Flag == 1)	//大写模式
		{
			if(Key() == 2)				//控制ABC的输入
			{
				delay_ms(100);
				if(Key_234568 == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"A_",6);
					Key_Value = 'A';
				}else if(Key_234568 == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"B_",6);
					Key_Value = 'B';
				}else if(Key_234568 == 2)
				{
					OLED_ShowString(6*Key_Flag_x,row,"C_",6);
					Key_Value = 'C';
				}else if(Key_234568 >= 3)
				{
					Key_234568 = 0;
					OLED_ShowString(6*Key_Flag_x,row,"A_",6);
					Key_Value = 'A';
				}
				Key_234568++;
				Key_True = 1;
			}else if(Key() == 3)	//控制DEF的输入
			{
				delay_ms(100);
				if(Key_234568 == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"D_",6);
					Key_Value = 'D';
				}else if(Key_234568 == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"E_",6);
					Key_Value = 'E';
				}else if(Key_234568 == 2)
				{
					OLED_ShowString(6*Key_Flag_x,row,"F_",6);
					Key_Value = 'F';
				}else if(Key_234568 >= 3)
				{
					Key_234568 = 0;
					OLED_ShowString(6*Key_Flag_x,row,"D_",6);
					Key_Value = 'D';
				}
				Key_234568++;
				Key_True = 1;
			}else if(Key() == 5)	//控制GHI的输入
			{
				delay_ms(100);
				if(Key_234568 == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"G_",6);
					Key_Value = 'G';
				}else if(Key_234568 == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"H_",6);
					Key_Value = 'H';
				}else if(Key_234568 == 2)
				{
					OLED_ShowString(6*Key_Flag_x,0,"I_",6);
					Key_Value = 'I';
				}else if(Key_234568 >= 3)
				{
					Key_234568 = 0;
					OLED_ShowString(6*Key_Flag_x,row,"G_",6);
					Key_Value = 'G';
				}
				Key_234568++;
				Key_True = 1;
			}else if(Key() == 6)	//控制JKL的输入
			{
				delay_ms(100);
				if(Key_234568 == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"J_",6);
					Key_Value = 'J';
				}else if(Key_234568 == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"K_",6);
					Key_Value = 'K';
				}else if(Key_234568 == 2)
				{
					OLED_ShowString(6*Key_Flag_x,row,"L_",6);
					Key_Value = 'L';
				}else if(Key_234568 >= 3)
				{
					Key_234568 = 0;
					OLED_ShowString(6*Key_Flag_x,row,"J_",6);
					Key_Value = 'J';
				}
				Key_234568++;
				Key_True = 1;
			}else if(Key() == 7)	//控制MNO的输入
			{
				delay_ms(100);
				if(Key_234568 == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"M_",6);
					Key_Value = 'M';
				}else if(Key_234568 == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"N_",6);
					Key_Value = 'N';
				}else if(Key_234568 == 2)
				{
					OLED_ShowString(6*Key_Flag_x,row,"O_",6);
					Key_Value = 'O';
				}else if(Key_234568 >= 3)
				{
					Key_234568 = 0;
					OLED_ShowString(6*Key_Flag_x,row,"M_",6);
					Key_Value = 'M';
				}
				Key_234568++;
				Key_True = 1;
			}else if(Key() == 9)	//控制PQRS的输入
			{
				delay_ms(100);
				if(Key_234568 == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"P_",6);
					Key_Value = 'P';
				}else if(Key_234568 == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"Q_",6);
					Key_Value = 'Q';
				}else if(Key_234568 == 2)
				{
					OLED_ShowString(6*Key_Flag_x,row,"R_",6);
					Key_Value = 'R';
				}else if(Key_234568 == 3)
				{
					OLED_ShowString(6*Key_Flag_x,row,"S_",6);
					Key_Value = 'S';
				}else if(Key_234568 == 4)
				{
					Key_234568 = 0;
					OLED_ShowString(6*Key_Flag_x,row,"P_",6);
					Key_Value = 'P';
				}
				Key_234568++;
				Key_True = 1;
			}else if(Key() == 10)	//控制TUV的输入
			{
				delay_ms(100);
				if(Key_234568 == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"T_",6);
					Key_Value = 'T';
				}else if(Key_234568 == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"U_",6);
					Key_Value = 'U';
				}else if(Key_234568 == 2)
				{
					OLED_ShowString(6*Key_Flag_x,row,"V_",6);
					Key_Value = 'V';
				}else if(Key_234568 >= 3)
				{
					Key_234568 = 0;
					OLED_ShowString(6*Key_Flag_x,row,"T_",6);
					Key_Value = 'T';
				}
				Key_234568++;
				Key_True = 1;
			}else if(Key() == 11)	//控制WXYZ的输入
			{
				delay_ms(100);
				if(Key_234568 == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"W_",6);
					Key_Value = 'W';
				}else if(Key_234568 == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"X_",6);
					Key_Value = 'X';
				}else if(Key_234568 == 2)
				{
					OLED_ShowString(6*Key_Flag_x,row,"Y_",6);
					Key_Value = 'Y';
				}else if(Key_234568 == 3)
				{
					OLED_ShowString(6*Key_Flag_x,row,"Z_",6);
					Key_Value = 'Z';
				}else if(Key_234568 == 4)
				{
					Key_234568 = 0;
					OLED_ShowString(6*Key_Flag_x,row,"W_",6);
					Key_Value = 'W';
				}
				Key_234568++;
				Key_True = 1;
			}else if(Key() == 14)	//输入一个空格
			{
				delay_ms(100);
				OLED_ShowString(6*Key_Flag_x,row," _",6);
				Key_Value = ' ';
				Key_True = 1;
			}
		}else if(Key_Flag == 2)	//数字模式
		{
			if(Key() == 1)
			{
				delay_ms(100);
				OLED_ShowString(6*Key_Flag_x,row,"1_",6);
				Key_Value = '1';
				Key_True = 1;
			}else if(Key() == 2)
			{
				delay_ms(100);
				OLED_ShowString(6*Key_Flag_x,row,"2_",6);
				Key_Value = '2';
				Key_True = 1;
			}else if(Key() == 3)
			{
				delay_ms(100);
				OLED_ShowString(6*Key_Flag_x,row,"3_",6);
				Key_Value = '3';
				Key_True = 1;
			}else if(Key() == 5)
			{
				delay_ms(100);
				OLED_ShowString(6*Key_Flag_x,row,"4_",6);
				Key_Value = '4';
				Key_True = 1;
			}else if(Key() == 6)
			{
				delay_ms(100);
				OLED_ShowString(6*Key_Flag_x,row,"5_",6);
				Key_Value = '5';
				Key_True = 1;
			}else if(Key() == 7)
			{
				delay_ms(100);
				OLED_ShowString(6*Key_Flag_x,row,"6_",6);
				Key_Value = '6';
				Key_True = 1;
			}else if(Key() == 9)
			{
				delay_ms(100);
				OLED_ShowString(6*Key_Flag_x,row,"7_",6);
				Key_Value = '7';
				Key_True = 1;
			}else if(Key() == 10)
			{
				delay_ms(100);
				OLED_ShowString(6*Key_Flag_x,row,"8_",6);
				Key_Value = '8';
				Key_True = 1;
			}else if(Key() == 11)
			{
				delay_ms(100);
				OLED_ShowString(6*Key_Flag_x,row,"9_",6);
				Key_Value = '9';
				Key_True = 1;
			}else if(Key() == 14)
			{
				delay_ms(100);
				OLED_ShowString(6*Key_Flag_x,row,"0_",6);
				Key_Value = '0';
				Key_True = 1;
			}
		}else if(Key_Flag == 3)	//符号模式
		{
			if(Key() == 1)	//控制!?的输入
			{
				delay_ms(100);
				if(Key_signed == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"!_",6);
					Key_Value = '!';
				}else if(Key_signed == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"?_",6);
					Key_Value = '?';
				}
				else if(Key_signed >= 2)
				{
					Key_signed = 0;
					OLED_ShowString(6*Key_Flag_x,row,"!_",6);
					Key_Value = '!';
				}
				Key_True = 1;
				Key_signed++;
			}else if(Key() == 2)	//控制#%的输入
			{
				delay_ms(100);
				if(Key_signed == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"#_",6);
					Key_Value = '#';
				}else if(Key_signed == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"%_",6);
					Key_Value = '%';
				}
				else if(Key_signed >= 2)
				{
					Key_signed = 0;
					OLED_ShowString(6*Key_Flag_x,row,"#_",6);
					Key_Value = '#';
				}
				Key_True = 1;
				Key_signed++;
			}else if(Key() == 3)	//控制&@的输入
			{
				delay_ms(100);
				if(Key_signed == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"&_",6);
					Key_Value = '&';
				}else if(Key_signed == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"@_",6);
					Key_Value = '@';
				}
				else if(Key_signed >= 2)
				{
					Key_signed = 0;
					OLED_ShowString(6*Key_Flag_x,row,"&_",6);
					Key_Value = '&';
				}
				Key_True = 1;
				Key_signed++;
			}else if(Key() == 5)	//控制:;的输入
			{
				delay_ms(100);
				if(Key_signed == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,":_",6);
					Key_Value = ':';
				}else if(Key_signed == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,";_",6);
					Key_Value = ';';
				}
				else if(Key_signed >= 2)
				{
					Key_signed = 0;
					OLED_ShowString(6*Key_Flag_x,row,":_",6);
					Key_Value = ':';
				}
				Key_True = 1;
				Key_signed++;
			}else if(Key() == 6)	//控制.,的输入
			{
				delay_ms(100);
				if(Key_signed == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,",_",6);
					Key_Value = ',';
				}else if(Key_signed == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"._",6);
					Key_Value = '.';
				}
				else if(Key_signed >= 2)
				{
					Key_signed = 0;
					OLED_ShowString(6*Key_Flag_x,row,",_",6);
					Key_Value = ',';
				}
				Key_True = 1;
				Key_signed++;
			}else if(Key() == 7)	//控制^_的输入
			{
				delay_ms(100);
				if(Key_signed == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"^_",6);
					Key_Value = '^';
				}else if(Key_signed == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"__",6);
					Key_Value = '_';
				}
				else if(Key_signed >= 2)
				{
					Key_signed = 0;
					OLED_ShowString(6*Key_Flag_x,row,"^_",6);
					Key_Value = '^';
				}
				Key_True = 1;
				Key_signed++;
			}else if(Key() == 9)	//控制+-的输入
			{
				delay_ms(100);
				if(Key_signed == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"+_",6);
					Key_Value = '+';
				}else if(Key_signed == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"-_",6);
					Key_Value = '-';
				}
				else if(Key_signed >= 2)
				{
					Key_signed = 0;
					OLED_ShowString(6*Key_Flag_x,row,"+_",6);
					Key_Value = '+';
				}
				Key_True = 1;
				Key_signed++;
			}else if(Key() == 10)	//控制*/的输入
			{
				delay_ms(100);
				if(Key_signed == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"*_",6);
					Key_Value = '*';
				}else if(Key_signed == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"/_",6);
					Key_Value = '/';
				}
				else if(Key_signed >= 2)
				{
					Key_signed = 0;
					OLED_ShowString(6*Key_Flag_x,row,"*_",6);
					Key_Value = '*';
				}
				Key_True = 1;
				Key_signed++;
			}else if(Key() == 11)	//控制\=的输入
			{
				delay_ms(100);
				if(Key_signed == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"=_",6);
					Key_Value = '=';
				}else if(Key_signed == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"'_",6);
					Key_Value = '\'';
				}
				else if(Key_signed >= 2)
				{
					Key_signed = 0;
					OLED_ShowString(6*Key_Flag_x,row,"=_",6);
					Key_Value = '=';
				}
				Key_True = 1;
				Key_signed++;
			}else if(Key() == 13)	//控制()的输入
			{
				delay_ms(100);
				if(Key_signed == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"(_",6);
					Key_Value = '(';
				}else if(Key_signed == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,")_",6);
					Key_Value = ')';
				}
				else if(Key_signed >= 2)
				{
					Key_signed = 0;
					OLED_ShowString(6*Key_Flag_x,row,"(_",6);
					Key_Value = '(';
				}
				Key_True = 1;
				Key_signed++;
			}else if(Key() == 14)	//控制<>的输入
			{
				delay_ms(100);
				if(Key_signed == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"<_",6);
					Key_Value = '<';
				}else if(Key_signed == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,">_",6);
					Key_Value = '>';
				}
				else if(Key_signed >= 2)
				{
					Key_signed = 0;
					OLED_ShowString(6*Key_Flag_x,row,"<_",6);
					Key_Value = '<';
				}
				Key_True = 1;
				Key_signed++;
			}else if(Key() == 15)	//控制[]的输入
			{
				delay_ms(100);
				if(Key_signed == 0)
				{
					OLED_ShowString(6*Key_Flag_x,row,"[_",6);
					Key_Value = '[';
				}else if(Key_signed == 1)
				{
					OLED_ShowString(6*Key_Flag_x,row,"]_",6);
					Key_Value = ']';
				}
				else if(Key_signed >= 2)
				{
					Key_signed = 0;
					OLED_ShowString(6*Key_Flag_x,row,"[_",6);
					Key_Value = '[';
				}
				Key_True = 1;
				Key_signed++;
			}
		}
			//	!? #% &@
			//	:; ., ^_
			//	+- */ '=
			//	() <> []
		if(Key() == 4)	//撤回一个值
		{
			delay_ms(100);
			Key_Flag_x--;
			if(Key_Flag_x < 0)
			{
				Key_Flag_x = 0;
			}
			OLED_ShowString(6*(Key_Flag_x),row,"-  ",6);
			IN[Key_Flag_x] = 0x00;
			Key_234568 = 0;
			Key_True = 0;
			Key_signed = 0;
			Key_79 = 0;		
		}
		if(Key_True == 1)		//只有输入值后才能确定
		{
			if(Key() == 8)	//确认当前值
			{
				delay_ms(100);
				OLED_ShowString(6*(Key_Flag_x + 1),row,"-",6);
				IN[Key_Flag_x] = Key_Value;
				Key_signed = 0;
				Key_True = 0;
				Key_234568 = 0;
				Key_79 = 0;
				Key_Flag_x++;
			}
		}
		if(Key_True == 0)		//只有当前输入的值被确认之后才能确认
		{
			if(Key() == 12)	//确认整个字符
			{
				delay_ms(100);
				Key_Flag_x = 0;
				Key_True = 0;
				OLED_Clear();
				break;
			}
		}else
		{
			if(Key() == 12)
			{
				delay_ms(100);
				OLED_ShowString(6*(Key_Flag_x + 1),row,"?",6);	//没确定还想确认的输入者是屑
			}
		}
	}
}

确实很长,我这稿子瞬间就将近两万个字了

一、使用的头文件

首先我先来说一下依赖的两个头文件,分别是oled.h(oeld的显示封装)和key.h(矩阵按键的驱动封装)。

前者作为显示使用,主要用到了两个函数,显示字符串函数清屏函数,如果函数不配套可以用别的来替换,理论方法存在的话,显示方式就是一个载体,这套功能理论上在任何显示设备上都是通用的(比如12864);

后者就是基本的一个带返回值的矩阵按键驱动了,我打包的资料是有的。

现在来让我简单的解释一下这些魔法if的嵌套过程

二、外层while

首先最开始进入这个函数之后,完成各方面的初始化之后就会进入一个while死循环,不慌,其实是假死状态,后面会有一个按键来跳出while。那么在这while下就嵌套着第一层if判断,把代码翻上去你会看到下面这些

if(on0 == 0)
{
	if(Key_Flag == 0)	//做显示判断,显示当前键盘模式
	{
		OLED_ShowString(0,7,"abc",6);	//小写模式
	}else if(Key_Flag == 1)
	{
		OLED_ShowString(0,7,"ABC",6);	//大写模式
	}else if(Key_Flag == 2)
    {
	    OLED_ShowString(0,7,"123",6);	//数字模式
    }else if(Key_Flag == 3)
    {
	    OLED_ShowString(0,7,"!/@",6);	//符号模式
    }
}
if(Key() == 16)		//在字母和数字之间切换
{
	delay_ms(100);
	Key_Flag++;
	if(Key_Flag >= 4)
	{
		Key_Flag = 0;
	}
}

首先先解释一下这个if里面的Key()函数是什么,这个主要就是一个带返回值的矩阵键盘,从上到下,从左到右的返回值就是1-16,所以会有一个if(Key() == 16)这个判断语句,就是看第16个按键是否按下的判断,这个按键控制的主要是输入模式的切换,从上面代码来看能看出,我写的这个功能能输入四种模式,分别是大写字母、小写字母、数字、部分符号。上面的哪个on0是作为函数参数传进来的,用来控制是否显示输入模式。

这是上面,也就是靠近头部的一级if,尾部还有几个一级if

if(Key() == 4)	//撤回一个值
{
	delay_ms(100);
	Key_Flag_x--;
	if(Key_Flag_x < 0)
	{
		Key_Flag_x = 0;
	}
	OLED_ShowString(6*(Key_Flag_x),row,"-  ",6);
	IN[Key_Flag_x] = 0x00;
	Key_234568 = 0;
	Key_True = 0;
	Key_signed = 0;
	Key_79 = 0;		
}
if(Key_True == 1)		//只有输入值后才能确定
{
	if(Key() == 8)	//确认当前值
	{
		delay_ms(100);
		OLED_ShowString(6*(Key_Flag_x + 1),row,"-",6);
		IN[Key_Flag_x] = Key_Value;
		Key_signed = 0;
		Key_True = 0;
		Key_234568 = 0;
		Key_79 = 0;
		Key_Flag_x++;
	}
}
if(Key_True == 0)		//只有当前输入的值被确认之后才能确认
{
	if(Key() == 12)	//确认整个字符
	{
		delay_ms(100);
		Key_Flag_x = 0;
		Key_True = 0;
		OLED_Clear();
		break;
	}
}else
{
	if(Key() == 12)
	{
		delay_ms(100);
		OLED_ShowString(6*(Key_Flag_x + 1),row,"?",6);	//没确定还想确认的输入者是屑
	}
}

 嗯?有个Key_True的标志位,为了防止输入数据后没有确定当前值却想确认整个内容而产生的迷惑行为的。这三个Key值(4、8、12)分别是撤回一位、确定一位、确认整个内容

整个的输入逻辑大概是这样来表示

输入内容 -> 确定一位 -> 继续输入内容 -> 确认一位 ->  ...... -> 确认整段输入内容

之后就是中间那些根据输入模式来改变的输入区了,这边只截取部分代码来看,还是先看一级if

if(Key_Flag == 0) //小写字母模式
{
    ...........
}else if(Key_Flag == 1)	//大写字母模式
{
    ...........
}else if(Key_Flag == 2) //数字模式
{
    ...........
}else if(Key_Flag == 3) //符号模式
{
    ...........
}

这些大体框架就是看输入模式的标志位来判断执行哪部分的代码,毕竟4*4矩阵键盘控件有限,想输入更多东西,就得分类扩展出来

关于每个模式里面的操作逻辑就不解释了,大致就是也用到了一个标志位,输入的时候+1,到达一个值后就清零这样的

三、输入模式和按键之间的对应关系

使用矩阵键盘做小键盘输入法的例程—代码开源—简单易懂超详细_第1张图片

 我觉得还是比较完美的吧。。。

四、小测试一下代码

测试用的代码

void main()
{
	unsigned char DeBug[20];  //先定义一个数组用来存输入的内容
	OLED_Init();              //OLED初始化函数
	P45 = 0;                  //我外部的独立按键,用作触发
	while(1)
	{
		if(P45 == 1)    //按下外部独立按键
		{
			Key_Sudoku(&DeBug,20,0,0,0,0); //调用我上面的小键盘函数
		}
		OLED_ShowString(0,0,DeBug,6);  //上面跳出函数后在把数组里的内容显示出来
	}
}

测试结果:

1.按下右上角独立按键后按了第二个按键一次使用矩阵键盘做小键盘输入法的例程—代码开源—简单易懂超详细_第2张图片

 2.按了一次确定一位按键使用矩阵键盘做小键盘输入法的例程—代码开源—简单易懂超详细_第3张图片

 3.切换输入模式后循环上面操作后输入的内容使用矩阵键盘做小键盘输入法的例程—代码开源—简单易懂超详细_第4张图片

 4.按下”确认整段内容“按键后使用矩阵键盘做小键盘输入法的例程—代码开源—简单易懂超详细_第5张图片

 测试完毕,可以说是非常完美✓

代码下载在下面的链接,里面还有我自己写的一份帮助手册

链接:https://pan.baidu.com/s/1n27RyiwXaT5CbVK-v0rgkA 
提取码:k985

如果可以的话,还是想要一点积分的

https://download.csdn.net/download/qq_28145393/21117221

源码公开,仅供学习

你可能感兴趣的:(单片机,C语言,c语言,单片机)