STM32 4x4矩阵键盘
4×4矩阵键盘控制实验
![4×4矩阵键盘控制实验](https://img.taocdn.com/s3/m/46716334580216fc700afdfa.png)
4×4矩阵键盘控制实验一、实验内容摘要设计一个4×4键盘接口控制器,在QuartusII软件上实现基设计,将其与开发板连接,实现电路功能。
当按下某一键时,4位LED上显示对应的键值,以二进制代码形式从0至F显示。
二、实验源代码LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.ALL;ENTITY DEBOUNCING ISPORT(clk, key:IN STD_LOGIC ;clr: IN STD_LOGIC;dly_out, dif_out: OUT STD_LOGIC);END DEBOUNCING;ARCHITECTURE a OF DEBOUNCING ISSIGNAL sample,dly,diff: STD_LOGIC;BEGINfree_counter:blocksignal QQ:std_logic_vector(4 downto 0);signal d0:std_logic;beginprocess (CLR,clk)beginif clr='0' thend0<='0';QQ<=(OTHERS=>'0');ELSif clk'event and clk='1' thend0<=QQ(4); --QQ的最高位同时作为d0信号,即d0的周期为2的5次方个clk.QQ<=QQ+1;end if;end process;sample<=not(QQ(4) and (not d0));--当d0为0,QQ(4)为1时,sample产生采样脉冲,低电平时间为1个clkend block free_counter;debunce:blocksignal d0,d1,s,r:std_logic;beginprocess(clk,clr)beginif clr='0' thendly<='0';elsif rising_edge(clk) thenif sample='1' thend1<=d0;d0<=key;s<=d0 and d1;r<=not d0 and not d1;if s<='0' and r<='0' thendly<=dly;elsif s<='0' and r<='1' thendly<='0';elsif s<='1' and r<='0' thendly<='1';elsedly<='0';end if;end if;end if;end process;dly_out<=dly;end block debunce;differential:blocksignal d1,d0:std_logic;beginprocess(clk,clr)beginif clr='0' thend0<='0';d1<='0';elsif rising_edge(clk) thend1<=d0;d0<=dly;end if;diff<=d0 and not d1;end process;dif_out<=diff;end block differential;END a;--****************************************************************** --* 4x4标准键盘板读取并点亮实验箱底板上的L1-L4--* Filename: keyboard4_4--* 扫描键盘,译码并点亮实验箱底板上的L1-L4--* 已加入去抖程序--****************************************************************** library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity keyboard4_4 isport(rst : in std_logic;clk_in : in std_logic;keyin : in std_logic_vector(3 downto 0);scan : out std_logic_vector(3 downto 0);leds : out std_logic_vector(3 downto 0);state : out std_logic;M : out std_logic_vector(3 downto 0));end keyboard4_4;architecture keyboard4_4_arch of keyboard4_4 is----********************************************* component debouncingport( key : IN STD_LOGIC ;clk,clr : IN STD_LOGIC ;dly_out : OUT STD_LOGIC ) ;end component ;--*********************************************--signal clkfrq : std_logic;signal cntscn : std_logic_vector(1 downto 0);signal scnlin : std_logic_vector(3 downto 0);signal cntfrq : std_logic_vector(14 downto 0);signal lednum : std_logic_vector(7 downto 0);signal key_tmp : std_logic_vector(3 downto 0);signal clk : std_logic;signal cntfrq1 : std_logic_vector(5 downto 0); beginM <= "0101"; --键盘功能选择scan <= not scnlin;lednum <= scnlin & (not key_tmp);-- key_tmp <= keyin;--debounuing cktdebounuing : blockbeginU1: debouncing PORT MAP (KEY => keyin(0) ,DLY_OUT => key_tmp(0) ,clr=>rst,clk => CLK);U2: debouncing PORT MAP (KEY => keyin(1) ,dly_out => key_tmp(1) ,clr=>rst,clk => CLK);U3: debouncing PORT MAP (key => keyin(2) ,dly_out => key_tmp(2) ,clr=>rst,clk => CLK);U4: debouncing PORT MAP (key => keyin(3) ,dly_out => key_tmp(3) ,clr=>rst,clk => CLK);END block debounuing ;--******************************************************--process(rst,clk_in) -- 晶振为40MHz,进行40000分频产生去抖时钟(1000Hz)beginif rst = '0' thencntfrq <= (others => '0');elsif rising_edge(clk_in) thenif (cntfrq = "100111000011111" or not (key_tmp="1110" or key_tmp="1101" or key_tmp="1011" or key_tmp="0111") ) then--if (cntfrq = "100111000011111" or key_tmp="1111" ) then--if cntfrq = "1111" thencntfrq <= (others => '0');clk <= not clk;--去抖时钟elsecntfrq <= cntfrq + 1;end if;end if;end process;process(rst,clk) --去抖时钟,50分频,形成扫描时钟beginif rst = '0' thenclkfrq <= '0';cntfrq1 <= (others => '0');elsif rising_edge(clk) thenif cntfrq1 = "11000" thencntfrq1 <= (others => '0');clkfrq <= not clkfrq;elsecntfrq1 <= cntfrq1 + 1;end if;end if;end process;process(rst,clkfrq) -- 根据扫描时钟产生扫描线beginif rst = '0' thencntscn <= "00";elsif rising_edge(clkfrq) thenif cntscn = "11" thencntscn <= "00";elsecntscn <= cntscn+1;end if;case cntscn iswhen "00" => scnlin <= "0001";when "01" => scnlin <= "0010";when "10" => scnlin <= "0100";when "11" => scnlin <= "1000";when others => null;end case;end if;end process;process(rst, clkfrq) -- 根据按键点亮相应的ledsbeginif(rst = '0' ) thenleds <= "0000";elsif clkfrq'event and clkfrq = '0' thencase lednum iswhen "10001000" =>leds <= "0001"; --1when "01001000" =>leds <= "0010"; --2when "00101000" =>leds <= "0011"; --3when "00011000" =>leds <= "1010"; --Awhen "10000100" =>leds <= "0100"; --4when "01000100" =>leds <= "0101"; --5when "00100100" =>leds <= "0110"; --6when "00010100" =>leds <= "1011"; --Bwhen "10000010" =>leds <= "0111"; --7when "01000010" =>leds <= "1000"; --8when "00100010" =>leds <= "1001"; --9when "00010010" =>leds <= "1100"; --Cwhen "10000001" =>leds <= "1110"; --*when "01000001" =>leds <= "0000"; --0when "00100001" =>leds <= "1111"; --#when "00010001" =>leds <= "1101"; --Dwhen others =>null;end case;end if;end process;process(rst,key_tmp)beginif(rst = '0' ) thenstate <= '1';elsif (key_tmp="1110" or key_tmp="1101" or key_tmp="1011" or key_tmp="0111") thenstate <= '0';elsif (key_tmp="1111") thenstate <= '1';end if;end process;end keyboard4_4_arch;三、实验工具软件的选用以及实验过程1、打开QuartusII软件。
4x4矩阵键盘设计报告
![4x4矩阵键盘设计报告](https://img.taocdn.com/s3/m/db4c862424c52cc58bd63186bceb19e8b8f6ec2f.png)
4x4矩阵键盘设计报告1.引言1.1 概述概述:4x4矩阵键盘是一种常用的输入设备,广泛应用于各种电子产品中。
本报告旨在介绍4x4矩阵键盘的设计理念、技术实现以及使用体验,并对其设计优势进行分析。
同时,将收集用户反馈,展望未来对4x4矩阵键盘的发展趋势进行探讨。
通过本报告的阐述,读者可以更加全面地了解4x4矩阵键盘的设计与应用,为相关产品的设计与开发提供参考和借鉴。
1.2 文章结构本报告将分为引言、正文和结论三个部分。
引言部分将概述本设计报告的目的和重要性,介绍文章结构和各部分内容的主要内容。
正文部分将详细介绍设计理念、技术实现和使用体验,通过分析和阐述设计的过程和特点,展现4x4矩阵键盘设计的全面性和独特性。
结论部分将对设计的优势进行总结,考虑用户反馈和展望未来的发展方向,以期为4x4矩阵键盘的设计提供参考和启示。
文章1.3 目的:本报告的目的是介绍我们设计的4x4矩阵键盘,并分析其设计理念、技术实现和使用体验。
通过本报告,读者可以了解我们的设计思路和创新之处,以及用户在使用过程中的反馈和建议。
同时,我们还会对该键盘的设计优势进行评估,并展望未来可能的发展方向。
通过本报告的阐述,我们希望能够为相关领域的学习和研究提供有益的参考和启发。
2.正文2.1 设计理念设计理念部分的内容:在设计4x4矩阵键盘时,我们以用户体验和便捷性为设计理念的核心。
我们希望设计一款符合人体工程学的键盘,使用户在使用过程中能够感受到舒适和便捷。
同时,我们也注重键盘的美学设计,希望能够设计出外观时尚,符合当代审美的产品。
此外,我们也考虑了键盘的功能多样性,希望能够满足不同用户的需求,提供更好的用户体验。
因此,在设计理念上,我们以用户体验和功能多样性为重点,致力于设计出一款符合人体工程学、外观时尚、功能多样的4x4矩阵键盘。
2.2 技术实现在本节中,我们将讨论4x4矩阵键盘的技术实现。
我们首先考虑到了键盘的布局和排列,通过设计合理的矩阵布局,我们可以实现较小尺寸的键盘同时保证较高的按键准确性。
基于STM32控制的智能键盘+程序
![基于STM32控制的智能键盘+程序](https://img.taocdn.com/s3/m/9b64de66561252d380eb6e9c.png)
基于STM32控制的智能键盘摘要:本设计选择STM32为核心控制元件,设计了用4个IO 口实现4*4矩阵键盘,使用C 语言进行编程。
矩阵式键盘提高效率进行按键操作管理有效方法,它可以提高系统准确性,有利于资源的节约,降低对操作者本身素质的要求。
关键词:STM32 矩阵键盘 ARM 显示电路1 引言随着21世纪的到来,以前的单个端口连接的按键已经不能满足人们在大型或公共场合的需求。
电子信息行业将是人类社会的高科技行业之一,4*4矩阵键盘设计师当今社会中使用的最广的技术之一。
4*4矩阵式键盘采用STM32为核心,主要由矩阵式键盘电路、显示电路等组成,软件选用C 语言编程。
STM32将检测到的按键信号转换成数字量,显示于数码管上。
该系统灵活性强,易于操作,可靠性高,将会有更广阔的开发前景。
2 总体设计方案该智能键盘电路由ARM 最小系统,矩阵键盘电路和显示电路组成,在常规的4*4矩阵键盘的基础上,通过改进实现了用4个IO 口完成4*4矩阵键盘。
2.1 总体设计框图本电路主要由3大部分电路组成:矩阵键盘电路、ARM 最小系统电路、按键显示电路。
其中ATM 最小系统主要由复位电路和时钟电路组成。
电路复位后数码管显示字符“—” 表示没有按键,显示电路由STM32的PD0—PD7来控制数码管显示是哪个按键按下。
总体设计方框图,如图1所示。
图1总体设计方框图STM32矩阵键盘电路时钟电路复位电路按键显示电路3 智能键盘设计原理分析3.1 STM32复位和时钟电路设计此电路主要是复位电路和时钟电路两部分,其中复位电路采用按键手动复位和上电自动复位组合,电路如图2(右)所示:其中14脚为STM32的复位端。
时钟电路如图2(左)所示:晶振采用的是8MHz和32.786KHz,8MKz分别接STM32的12脚和13脚,32.786KHz分别接STM32的8脚和9脚。
图2STM复位和时钟电路设计3.2 矩阵键盘电路的设计该电路的四个端子分别接STM32的PB12—PB15,电路如图3所示。
stm32矩阵键盘原理
![stm32矩阵键盘原理](https://img.taocdn.com/s3/m/1c2fc25f0a1c59eef8c75fbfc77da26925c5966f.png)
STM32矩阵键盘原理详解引言矩阵键盘是一种常见的输入设备,广泛应用于电子产品中。
在STM32微控制器中,利用GPIO引脚实现矩阵键盘控制相对简单,本文将详细介绍STM32矩阵键盘的基本原理。
基本原理矩阵键盘由多个按键组成,通常采用行列式排列。
每个按键都由一个触点和一个按键外壳组成,触点一般为弹簧式结构,按下按键时触点接通,释放按键时触点断开。
矩阵键盘的连接方式矩阵键盘的每个按键都被分配一个行号和列号,通过行线和列线来连接按键和控制芯片。
STM32通过GPIO来控制行线和列线的电平,实现按键的扫描和检测。
在STM32中,行线和列线可以连接到不同的GPIO引脚上。
行线连接到输出引脚,列线连接到输入引脚。
这样,通过对行线的输出和对列线的输入,可以实现对矩阵键盘的扫描和检测。
矩阵键盘的扫描原理矩阵键盘的扫描原理可以简单描述为以下几个步骤:1.将所有行线设置为高电平,所有列线设置为输入模式。
2.逐个将行线设置为低电平,并同时检测列线引脚的电平状态。
3.如果某一列的输入引脚检测到低电平,表示该列对应的按键被按下。
4.通过行线和列线的对应关系,确定被按下的按键的行号和列号。
矩阵键盘的按键映射通过扫描后,可以得到被按下的按键的行号和列号,STM32可以根据行列号的映射关系将按键信息转化为相应的按键值。
通常,矩阵键盘的按键映射是通过二维数组来实现的。
数组的行号对应行线,列号对应列线。
数组中的元素对应按键的键值。
例如,要实现一个4x4的矩阵键盘,可以通过以下数组表示按键的映射关系:uint8_t keyMap[4][4] = {{ '1', '2', '3', 'A' },{ '4', '5', '6', 'B' },{ '7', '8', '9', 'C' },{ '*', '0', '#', 'D' }};通过行列号可以确定数组中的元素,从而得到按键的键值。
stm32控制4乘4矩阵键盘程序带松手检测
![stm32控制4乘4矩阵键盘程序带松手检测](https://img.taocdn.com/s3/m/c40f048101f69e31433294fc.png)
stm32控制4乘4矩阵键盘程序带松手检测#include "stm32f10x.h"#include "delay.h"/*本文件的函数,主要实现矩阵键盘的功能。
矩阵键盘使用PA0到PA7引脚,其中,PA0到PA3固定为推挽输出,PA4到PA7固定为下拉输入。
即,无键按下时,对应PA4到PA7为0,有键按下时,PA4到PA7中,对应的引脚为高。
此程序有一点要注意:要用到的IO口,必须是PX0-PX7,,不能是其他连续的数字。
如果非要改。
如:已经没有连续的0-7的IO口,需要在几个地方修改,请注意~~此程序带有松手检测。
*/void InitKey(void) //初始化矩阵键盘要使用的GPIO口。
{GPIO_InitTypeDef GPIOStru;GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP; //定义PA0到PA3为推挽输出。
GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;GPIOStru.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_Init(GPIOA,&GPIOStru);GPIOStru.GPIO_Mode = GPIO_Mode_IPD; //定义PA4到PA7为下拉输入。
GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;GPIOStru.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//因为上面定义引脚为输出时,已经打开整个GPIOA的时钟了,所以此处不再需要函数RCC_APB2PeriphClockCmd()来打开时钟了。
单片机实现4X4矩阵键盘控制项目PPT课件
![单片机实现4X4矩阵键盘控制项目PPT课件](https://img.taocdn.com/s3/m/a21729d9bb68a98270fefaba.png)
-
5
• 在矩阵按键处理过程中,一旦检测到有按 键闭合与确认按键已经稳定闭合期间,通 过调用10-20ms延时子程序避开按键抖动问 题。由于按键是机械器件,按下或者松开 时有固定的机械抖动,抖动图如图所示。
-
6
• 按键去抖分为硬件去抖和软件去抖,硬件去抖最简单的是 按键两端并联电容,容量根据实验而定。软件去抖使用方 便不增加硬件成本,容易调试,所以现在处理按键抖动问 题大部分选择软件去抖。软件去抖操作步骤如下:
-
10
13.4 项目软件程序设计
• 矩阵键盘行线P20~P23为输出线,列线 P24~P27为输入线。单片机将行线(P20~P23) 全部输出低电平,此时读入列线数据,若列线 全为高电平则没有键按下,当列线有出现低电 平时调用延时程序以此来去除按键抖动。延时 完成后再判断是否有低电平,如果此时读入列 线数据还是有低电平,则说明确实有键按下, 再来进一步确定键值。
51单片机
VC C P0. 0 P0. 1 P0. 2 P0. 3 P0. 4 P0. 5 P0. 6 P0. 7 EA/VPP PROG/ ALE PSEN A15/P2. 7 A14/P2. 6 A13/P2. 5 A12/P2. 4 A11/P2. 3 A10/P2. 2 A9/P2. 1 A8/P2. 0
•
case 0xdd:P0=table[5];break; //显示按键码“5”
•
case 0xbd:P0=table[6];break; //显示按键码“6”
•
case 0x7d:P0=table[7];break; //显示按键码“7”
•
case 0xeb:P0=table[8];break; //显示按键码“8”
4x4矩阵键盘电路连接图和快速扫描完整程序
![4x4矩阵键盘电路连接图和快速扫描完整程序](https://img.taocdn.com/s3/m/350d9cdeb9f3f90f76c61b1d.png)
else
{
temp=_crol_(temp,1);
}
beis++;
if(beis==4)beis=0;
}
}
////////////////////////////////////////////////////////////////////
//主函数
void main()
{
while(1)
{
key_4x4();
xianshi(key);
}
}
//4*4矩阵扫描,键值保存在key中
void key_4x4()
{
P1=temp;//初值uchar temp=0xfe;
sm=P1;
sm=sm&0xf0;//取P1口高四位的值,如果为0就表示无键按下
if(sm!=0xf0)
{
switch(sm)
{
case 0x70:{key=0+4*beis;break;}
uchar temp=0xfe;//键盘扫描前赋给P1口的试探值
uchar beis=0x00;//键盘扫描的识别倍率
sbit LE1=P2^0;
sbit LE2=P2^1;
uchar key,sm;//key是扫描得到的键值;
////////////////////////////////////////////////////////////////////
case 0xb0:{key=1+4*beis;break;}
case 0xd0:{key=2+4*beis;break;}
case 0xe0:{key=3+4*beis;break;}
STM32_实用矩阵键盘
![STM32_实用矩阵键盘](https://img.taocdn.com/s3/m/98b069e7e009581b6ad9eb01.png)
实用矩阵键盘程序// PA0~PA3行控制线// PA4~PA7列控制线#include <stm32f10x_lib.h>#include "Delay.h"#include "key_4x4.h"#define KEY_X (0X0F << 0)#define KEY_Y (0XF0 << 0)unsigned char const Key_Tab[4][4]=//键盘编码表{{'D','C','B','A'},{'#','9','6','3'},{'0','8','5','2'},{'*','7','4','1'}};//没有得到键值返回0,否则返回相应的键值unsigned char Get_KeyValue(void){//使用线反转法u8 i=5,j=5;u16 temp1,temp2;RCC->APB2ENR|=1<<2; //使能PORTA时钟RCC->APB2ENR|=1<<0; //开启辅助时钟AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]AFIO->MAPR|=0X04000000; //关闭JTAGGPIOA->CRL&=0XFFFF0000;GPIOA->CRL|=0X00003333; //PA0~PA3 推挽输出GPIOA->CRL&=0X0000FFFF; //PA4~PA7 输入GPIOA->CRL|=0X44440000; //PA4~PA7默认上拉GPIOA->ODR&=~KEY_X ; //PA0~PA3置0if(((GPIOA->IDR >> 4) & 0X0F)<0x0f) // 读取PA12~PA15的值{delay_ms(70); //按键消抖if((GPIOA->IDR >>4 & 0x0f)<0x0f)temp1=(GPIOA->IDR >>4 & 0x0f);switch(temp1){case 0x0e:j=0;break;case 0x0d:j=1;break;case 0x0b:j=2;break;case 0x07:j=3;break;default:break;}}GPIOA->CRL&=0X0000FFFF;GPIOA->CRL|=0X33330000; //PA4~PA7 推挽输出GPIOA->CRL&=0XFFFF0000; //PA0~PA3 输入GPIOA->CRL|=0X00004444; //PA0~PA4 默认下拉GPIOA->ODR&=~KEY_Y; //PA4~PA7置0if((GPIOA->IDR & 0x0f)<0x0f){temp2=(GPIOA->IDR & 0x0f);switch(temp2){case 0x0e:i=0;break;case 0x0d:i=1;break;case 0x0b:i=2;break;case 0x07:i=3;break;default:break;}}if((i==5)||(j==5))return 0;elsereturn (Key_Tab[i][j]);}。
实验四4X4矩阵键盘实验
![实验四4X4矩阵键盘实验](https://img.taocdn.com/s3/m/8dcdd93b581b6bd97f19ea5f.png)
狀態S_2: 發出掃瞄column 1即col=4’b1101的狀態並讀回row值作比 較:
如果讀到row不等於f (4’b1111)就代表在column 1上的4個按鍵(3, 7, b, f)有其中一個被按下,於是跳至S_5做等待使用者放開按鍵的處 理。 如果讀到row等於f (4’b1111)就代表在column 1上的4個按鍵(3, 7, b, f)沒有被按下,於是跳至S_3做掃瞄column 2的按鍵。
按鍵掃瞄之狀態
狀態S_3: 發出掃瞄column 2即col=4’b1011的狀態並讀回
row值作比較:
如果讀到row不等於f (4’b1111)就代表在column 2上的4個按鍵(2, 6, a, e)有其中一個被按下,於是跳至S_5做等待使用者放開按 鍵的處理。 如果讀到row等於f (4’b1111)就代表在column 2上的4個按鍵(2, 6, a, e)沒有被按下,於是跳至S_4做掃瞄column 2的按鍵。 狀態S_4: 發出掃瞄column 3即col=4’b0111的狀態並讀回row值作比較: 如果讀到row不等於f (4’b1111)就代表在column 3上的4個按鍵(1, 5, g, d)有其中一個被按下,於是跳至S_5做等待使用者放開按 鍵的處理。 如果讀到row等於f (4’b1111)就代表在column 3上的4個按鍵(1, 5, g, d)沒有被按下,於是跳回至S_0,因此FSM跳回Idle state即掃 描完4個column 都沒有發現任何按鍵被按下。 狀態S_5: 等待使用者放開按鍵的狀態,如果使用者沒放開按鍵就一直停
實驗四 4X4矩陣鍵盤實驗
4X4矩陣鍵盤輸入並輸出至七段式顯示器
底板子4x4矩陣按鍵
STM32-矩阵键盘程序4×4课件.doc
![STM32-矩阵键盘程序4×4课件.doc](https://img.taocdn.com/s3/m/b8c40b4d52d380eb63946d08.png)
/*--------------------------------------------------------------------------------------* 矩阵键盘驱动* 文件: keyboard.c* 编写人:LiuHui* 描述:扫描4x4 矩阵键盘输入,并返回键值* 适用范围:驱动采用ST3.5 库编写,适用于STM32F10x 系列单片机* 所用引脚:PA0-PA7* 编写时间:2014 年5 月20 日--------------------------------------------------------------------------------------*/#include "stm32f10x.h"#include "keyboard.h"#include "dealy.h"/*-------------------------------- 矩阵键盘初始化----------------------------------------* 功能:初始化stm32 单片机GPIO //PA0-PA7* 参数传递:* 输入:无* 返回值:无--------------------------------------------------------------------------------------*/void KeyBoard_Init(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);}/*------------------------------ 矩阵键盘扫描--------------------------------------------* 功能:扫描矩阵键盘,并返回键值* 参数:* 输入:无* 返回:有键按下返回该键值* 无键按下时则返回0--------------------------------------------------------------------------------------*/u8 Read_KeyValue(void){u8 KeyValue=0;if((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f){Delay_ms(10);if((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f){GPIO_SetBits(GPIOA, GPIO_Pin_0);GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);switch(GPIO_ReadInputData(GPIOA)&0xff){case 0x11: KeyValue = 1; break;case 0x21: KeyValue = 5; break;case 0x41: KeyValue = 9; break;case 0x81: KeyValue = 13;break;}GPIO_SetBits(GPIOA, GPIO_Pin_1);GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_3);switch(GPIO_ReadInputData(GPIOA)&0xff){case 0x12: KeyValue = 2; break;case 0x22: KeyValue = 6; break;case 0x42: KeyValue = 10;break;case 0x82: KeyValue = 14;break;}GPIO_SetBits(GPIOA, GPIO_Pin_2);GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3);switch(GPIO_ReadInputData(GPIOA)&0xff){case 0x14: KeyValue = 3; break;case 0x24: KeyValue = 7; break;case 0x44: KeyValue = 11;break;case 0x84: KeyValue = 15;break;}GPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);switch(GPIO_ReadInputData(GPIOA)&0xff){case 0x18: KeyValue = 4; break;case 0x28: KeyValue = 8; break;case 0x48: KeyValue = 12;break;case 0x88: KeyValue = 16;break;}GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3); GPIO_ResetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 |GPIO_Pin_7);while((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f);return KeyValue;}}return 0;}/*--------------------------------THE END--------------------------------------------*//*--------------------------------------------------------------------------------------* 矩阵键盘驱动* 文件: keyboard.h* 编写人:LiuHui* 描述:扫描4x4 矩阵键盘输入,并返回键值* 适用范围:驱动为ST3.5 库编写,适用于STM32F10x 系列单片机* 所用引脚:PA0-PA7* 编写时间:2013 年11 月22 日* 版本: 1.0--------------------------------------------------------------------------------------*/#ifndef __KEYBOARD_H#define __KEYBOARD_Hvoid KeyBoard_Init(void);u8 Read_KeyValue(void);#endif/*----------------------------------THE END------------------------------------------*#include "stm32f10x.h"void KeyBoard_Init(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB, GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6);GPIO_ResetBits(GPIOB, GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);}//3?ê?? ˉPA,PBvoid Delay_ms(int time){int i=0;while(time--){i=12000;while(i--);}}u8 Read_KeyValue(void){u8 KeyValue=1;if((GPIO_ReadInputData(GPIOB)&0xff)!=0x0f){Delay_ms(10);if((GPIO_ReadInputData(GPIOB)&0xff)!=0x0f){GPIO_SetBits(GPIOB, GPIO_Pin_3);GPIO_ResetBits(GPIOB, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6); switch(GPIO_ReadInputData(GPIOB)&0xff){case 0x11: KeyValue = 7; break;case 0x21: KeyValue = 4; break;case 0x41: KeyValue = 1; break;case 0x81: KeyValue = 0; break;}GPIO_SetBits(GPIOB, GPIO_Pin_4);GPIO_ResetBits(GPIOB, GPIO_Pin_3 | GPIO_Pin_5 | GPIO_Pin_6); switch(GPIO_ReadInputData(GPIOB)&0xff){case 0x12: KeyValue = 8; break;case 0x22: KeyValue = 5; break;case 0x42: KeyValue = 2; break;case 0x82: KeyValue = 0; break;}GPIO_SetBits(GPIOB, GPIO_Pin_5);GPIO_ResetBits(GPIOB, GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_6);switch(GPIO_ReadInputData(GPIOB)&0xff){case 0x14: KeyValue = 9; break;case 0x24: KeyValue = 6; break;case 0x44: KeyValue = 3; break;case 0x84: KeyValue = 0; break;}GPIO_SetBits(GPIOB, GPIO_Pin_6);GPIO_ResetBits(GPIOB, GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5);switch(GPIO_ReadInputData(GPIOB)&0xff){case 0x18: KeyValue = 0; break;case 0x28: KeyValue = 0; break;case 0x48: KeyValue = 0;break;case 0x88: KeyValue = 0;break;}GPIO_SetBits(GPIOB, GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6); GPIO_ResetBits(GPIOB, GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);//while((GPIO_ReadInputData(GPIOB)&0xff)!=0x0f);return KeyValue;}}return 0;}uint16_t table[]={0xEB,0x28,0xB3,0xBA,0x78,0xDA,0xDB,0xA8,0xFB,0xFA};int main(){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);KeyBoard_Init();int keyvalue=Read_KeyValue();GPIO_Write(GPIOA, table[keyvalue]);/*while(1){int i;for(i=0;i<10;i++){GPIO_Write(GPIOA, table[i]);Delay_ms(500);}}*//*u8 keyvalue;for(int i=0;;i++){KeyBoard_Init();keyvalue=Read_KeyValue();GPIO_Write(GPIOA,table[keyvalue]);Delay_ms(500);}*/}#include "stm32f10x.h"void KeyBoard_Init(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB, GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6);GPIO_ResetBits(GPIOB, GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);}void Delay_ms(int time){int i=0;while(time--){i=12000;while(i--);}}u8 Read_KeyValue(void){if((GPIO_ReadInputData(GPIOB)&0xff)!=0x73)// 在这个程序下为什么无论是GPIO_ReadInputData(GPIOB)&0xff)!=0x73 还是GPIO_ReadInputData(GPIOB)&0xff)==0x73 都能往下运行,而在屏蔽Delay_ms(10) 后则只能运行一种,是因为这个Delay_ms(10) 对if 里的判断有影响吗?{Delay_ms(10);GPIO_Write(GPIOA,0x33);}return 0;}int main(){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);KeyBoard_Init();Read_KeyValue();}。
单片机-数码管显示4X4矩阵键盘按键号
![单片机-数码管显示4X4矩阵键盘按键号](https://img.taocdn.com/s3/m/1b699bb1dc88d0d233d4b14e852458fb770b38f9.png)
单片机-数码管显示4X4矩阵键盘按键号#include<>#define uchar unsigned char#define uint unsigned int//段码uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};sbit BEEP=P3^7;//上次按键和当前按键的序号,该矩阵中序号范围0~15,16表示无按键uchar Pre_KeyNo=16,KeyNo=16;//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}//矩阵键盘扫描void Keys_Scan(){uchar Tmp;P1=0x0f; //高4 位置0,放入 4 行DelayMS(1);Tmp=P1^0x0f;//按键后0f变成0000XXXX,X中一个为0,3 个仍为 1,通过异或把 3 个1 变为0,唯一的0变为1;switch(Tmp) //判断按键发生于 0~3 列的哪一列{case 1: KeyNo=0;break;case 2: KeyNo=1;break;case 4: KeyNo=2;break;case 8: KeyNo=3;break;default:KeyNo=16; //无键按下}P1=0xf0; //低 4 位置0,放入 4 列DelayMS(1);Tmp=P1>>4^0x0f;//按键后 f0 变成 XXXX0000,X中有 1 个为0,三个仍为 1;高4 位转移到低 4位并异或得到改变的值switch(Tmp) //对0~3 行分别附加起始值 0,4,8,12{case 1: KeyNo+=0;break;case 2: KeyNo+=4;break;case 4: KeyNo+=8;break;case 8: KeyNo+=12;}}//蜂鸣器void Beep(){uchar i;for(i=0;i<100;i++){DelayMS(1);BEEP=~BEEP;}BEEP=0;}//主程序void main(){P0=0x00;BEEP=0;while(1){P1=0xf0;if(P1!=0xf0) Keys_Scan(); //获取键序号 if(Pre_KeyNo!=KeyNo) {P0=~DSY_CODE[KeyNo];Beep();Pre_KeyNo=KeyNo;}DelayMS(100);}}。
独立4X4矩阵两用键盘制作方法
![独立4X4矩阵两用键盘制作方法](https://img.taocdn.com/s3/m/60e61e31eff9aef8951e060d.png)
线有点乱、、、、、 基本竣工啦、、、、 具体电路图如下:
拨码开关下方的杜邦针是用来独立键盘插接,当拨码开关处于断开状 态时,将电路板右上角的杜邦针的 1、2、3 端子分别用杜邦线接与开发板负 极,此时拨码开关下的杜邦针均为连接单片机 IO 口的端子,此时为 3X4 的 独立键盘。 拨码开关处于接通状态时,电路板右上角的杜邦针直接按序插接于单 片机 IO 口,此时为 4X4 矩阵键盘;
独立 4X4 矩阵两用键盘制作方法
看到买的开发板上面用的键盘有两种,一种是独立键盘,一种是矩阵 键盘,我在制作最小系统时发现最两个键盘很麻烦,而且都不常用,虽然可 以制作 4 个独立键,但有时不够用,更何况矩阵键盘编程也麻烦,何不多做 几个独立键呢,但要飞那幺多按键而且还占地,我就想做一个键盘,代替了 两个键盘,于是乎今天就做了一个两用的、、、可以当 4X4 矩阵键盘用,也可 以当 3X4 独立键盘用、、、、、、、、 来工、、、、、
找来 16 个按键、、、、 点焊各个按键、、、、 按键焊接 OK、、、、、、 布线、、、
继续焊接、、、 焊接八位拨码开关、、、、
课程设计制作单片机的4X4矩阵键盘
![课程设计制作单片机的4X4矩阵键盘](https://img.taocdn.com/s3/m/b83d66a74028915f804dc268.png)
目录摘要 (2)第一章硬件部分 (3)第一节AT89C51 (3)第二节4*4矩阵式键盘 (6)第三节LED数码管 (8)第四节硬件电路连接 (10)第二章软件部分 (12)第一节所用软件简介 (12)第二节程序流程图 (14)第三节程序 (17)第三章仿真结果 (19)心得体会 (21)参考文献 (22)摘要电子信息行业将是人类社会的高科技行业之一,是设施现代化的基础,也是人类通往科技巅峰的直通车。
电子行业的发展很重要,而计算机技术是现代科技发展的重要组成部分。
矩阵式键盘控制系统可以提高效率,是进行按键操作管理的有效方法,它可以提高系统准确性,有利于资源的节约,降低对操作者本身的要求。
并能正确、实时、高效地显示按键信息,以提高工作效率和资源利用率。
矩阵式键盘是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N个按键,并通过单片机,显示在LED数码管上。
单片机控制键盘显示系统,可以对不同的按键进行实时显示,其核心是单片机、键盘矩阵电路和数码管显示电路。
4*4矩阵式键盘以AT89C51单片机为核心,主要由矩阵式键盘电路、显示电路等组成,软件选用C语言编程。
单片机将检测到的按键信号转换成数字量,显示于LED显示器上。
该系统灵活性强,易于操作,可靠性高,广泛应用于各种场合。
第一章硬件部分第一节AT89C51AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
引脚如图所示AT89C51图1 AT89C51管脚图AT89C51其具有以下特性:与MCS-51 兼容4K字节可编程FLASH存储器寿命:1000写/擦循环数据保留时间:10年全静态工作:0Hz-24MHz三级程序存储器锁定128×8位内部RAM32可编程I/O线两个16位定时器/计数器5个中断源可编程串行通道低功耗的闲置和掉电模式片内振荡器和时钟电路特性概述:AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 接口,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
4x4矩阵键盘扫描原理
![4x4矩阵键盘扫描原理](https://img.taocdn.com/s3/m/ea4b5baa6394dd88d0d233d4b14e852458fb398b.png)
4x4矩阵键盘扫描原理
4x4矩阵键盘扫描原理是一种常用的键盘扫描方法,也称为矩阵键盘扫描。
它可以将多个按键连接在一起并使用较少的引脚来检测按键的状态。
4x4矩阵键盘由4行和4列组成,共有16个按键。
通常使用单片机或电路来进行扫描,以下是简要的原理:
1. 行扫描:首先,将行引脚设置为输出,同时将列引脚设置为输入,并将其上拉或下拉。
所有行引脚中只有一个为低电平,其余为高电平。
然后逐行检测按键状态。
2. 列检测:对于每一行,将对应的行引脚置为低电平后,检测列引脚的电平状态。
如果有按键按下,则相应的列引脚会变为低电平。
通过读取列引脚的状态,可以确定按键的位置。
3. 组合键:由于只能一次检测一行,因此当同时按下多个按键时,可能会导致误检。
为了解决这个问题,可以在检测到按键按下时,延迟一段时间,并再次检测按键的状态。
如果在第二次检测时仍然检测到按键按下,则确认按键有效。
4. 反向扫描:为了检测按键的释放状态,可以将行引脚设置为输入,列引脚设置为输出,并将其置为低电平。
然后逐列检测行引脚的电平状态,如果有按键释放,则相应的行引脚会变为高电平。
通过不断地循环扫描所有的行和列,可以实时检测按键的状态,并根据需要进行相应的处理。
STM32_矩阵键盘
![STM32_矩阵键盘](https://img.taocdn.com/s3/m/cabcadb51a37f111f1855bd8.png)
STM32 4*4矩阵键盘程序main.c#include "led.h"#include "delay.h"#include "sys.h"#include "key.h"#include "usart.h"#include "stdio.h"int main(void){int x;SystemInit();delay_init(72); //延时初始化NVIC_Configuration();uart_init(9600);LED_Init();KEY_Init(); //初始化与按键连接的硬件接口while(1){x=KEY_Scan(); //得到键值switch(x){case 0:// LED0=0;printf("D\n");break;case 1:printf("C\n");break;case 2:printf("B\n");break;case 3:printf("A\n");break;case 4:printf("#\n");break;case 5:printf("9\n");break;case 6:printf("6\n");break;case 7:printf("3\n");break;case 8:printf("0\n");break;case 9:printf("8\n");break;case 10:printf("5\n");break;case 11:printf("2\n");break;case 12:printf("*\n");break;case 13:printf("7\n");break;case 14:printf("4\n");break;case 15:printf("1\n");break;}}}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////key.c //按键扫描#include "stm32f10x.h"#include "delay.h"#include "key.h"/*本文件的函数,主要实现矩阵键盘的功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void KeyBoard_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure);
case 0x11: KeyValue = 1; break; case 0x21: KeyValue = 5; break; case 0x41: KeyValue = 9; break; case 0x81: KeyValue = 13;break; } GPIO_SetBits(GPIOA, GPIO_Pin_1); GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_3); switch(GPIO_ReadInputData(GPIOA)&0xff) { case 0x12: KeyValue = 2; break; case 0x22: KeyValue = 6; break; case 0x42: KeyValue = 10;break; case 0x82: KeyValue = 14;break; } GPIO_SetBits(GPIOA, GPIO_Pin_2); GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3); switch(GPIO_ReadInputData(GPIOA)&0xff) { case 0x14: KeyValue = 3; break; case 0x24: KeyValue = 7; break; case 0x44: KeyValue = 11;break; case 0x84: KeyValue = 15;break; } GPIO_SetBits(GPIOA, GPIO_Pin_3); GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2); switch(GPIO_ReadInputData(GPIOA)&0xff)
/*------------------------------矩阵键盘扫描--------------------------------------------
* 功能:
扫描矩阵键盘,并返回键值
* 参数:
*
输入: 无
*
--------------------------------------------------------------------------------------*/
* 所用引脚: PA0-PA7
* 编写时间: 2013 年 11 月 22 日
* 版本:
1.0
--------------------------------------------------------------------------------------*/
#include "stm32f10x.h" #include "keyboard.h" #include "dealy.h"
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3); GPIO_ResetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7); }
/*--------------------------------矩阵键盘初始化----------------------------------------
* 功能:
初始化 stm32 单片机 GPIO
//PA0-PA7
* 参数传递:
*
输入: 无
*
返回值:无
--------------------------------------------------------------------------------------*/
u8 Read_KeyValue(void) {
u8 KeyValue=0; if((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f) {
Delay_ms(10); if((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f) {
GPIO_SetBits(GPIOA, GPIO_Pin_0); GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3); switch(GPIO_ReadInputData(GPIOA)&0xff) {
{ case 0x18: KeyValue = 4; break; case 0x28: KeyValue = 8; break; case 0x48: KeyValue = 12;break; case 0x88: KeyValue = 16;break;
} GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3); GPIO_ResetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7); while((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f); return KeyValue; } } return 0; }
#ifndef __KEYBOARD_H #define __KEYBOARD_H void KeyBoard_Init(void); u8 Read_KeyValue(void); #endif
/*----------------------------------THE END------------------------------------------*/
*
矩阵键盘驱动
* 文 件:
keyboard.h
* 编写人: LiuHui
* 描述:
扫描 4x4 矩阵键盘输入,并返回键值
* 适用范围: 驱动为 ST3.5 库编写,适用于 STM32F10x 系列单片机
* 所用引脚: PA0-PA7
* 编写时间: 2013 年 11 月 22 日
* 版本:
1.0
--------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------
*
矩阵键盘驱动
* 文 件:
keyboard.c
* 编写人: LiuHui
* 描述:
扫描 4x4 矩阵键盘输入,并返回键值
* 适用范围: 驱动采用 ST3.5 库编写,适用于 STM32F10x 系列单片机
/*--------------------------------THE END--------------------------------------------*/
/*--------------------------------------------------------------------------------------