精华内容
下载资源
问答
  • STM32键盘扫描程序

    千次阅读 2019-05-02 21:31:51
    STM32键盘扫描程序(带中断触发输入<可注释忽略>) #include “key.h” #include “delay.h” //按键初始化函数 void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB...

    STM32键盘扫描程序(带中断触发输入<可注释忽略>)
    #include “key.h”
    #include “delay.h”

    //按键初始化函数
    void KEY_Init(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PORTB时钟
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试

    /*矩阵键盘,端口可自定义*/
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//高电平输入,配置为下拉输入
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //键盘有中断输入功能且配置为高电平触发时,初始化必须为1
    

    }

    //按键扫描函数
    char Keyscan(void)//与或的位根据定义的端口修改
    {
    char KeyValue;

    GPIO_SetBits(GPIOB,GPIO_Pin_12); //1
    GPIO_ResetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);//0
    if((GPIOB->IDR&0x0f00)!=0x0000)//判断PA8~11是否有输入
    {
    	delay_ms(10);
    	if((GPIOB->IDR&0x0f00)!=0x0000)
    	{
    		switch(GPIOB->IDR&0x0f00)
    		{
    			case 0x0100:KeyValue='3';break;//不同端口及定义的值修改参数即可
    			case 0x0200:KeyValue='7';break;
    			case 0x0400:KeyValue='B';break;
    			case 0x0800:KeyValue='F';break;
    		}
    	}
    	while((GPIOB->IDR&0x0f00)!=0x0000);//等待松开
    	GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //键盘中断模式,输出端口全部置1,以便下次触发中断
    	return KeyValue;
    }
    
    GPIO_SetBits(GPIOB,GPIO_Pin_13); //1
    GPIO_ResetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_14|GPIO_Pin_15);//0
    if((GPIOB->IDR&0x0f00)!=0x0000)
    {
    	delay_ms(10);
    	if((GPIOB->IDR&0x0f00)!=0x0000)
    	{
    		switch(GPIOB->IDR&0x0f00)
    		{
    			case 0x0100:KeyValue='2';break;
    			case 0x0200:KeyValue='6';break;
    			case 0x0400:KeyValue='A';break;
    			case 0x0800:KeyValue='E';break;
    		}
    	}
    	while((GPIOB->IDR&0x0f00)!=0x0000);
    	GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //1
    	return KeyValue;
    }
    
    GPIO_SetBits(GPIOB,GPIO_Pin_14); //1
    GPIO_ResetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_15);//0
    if((GPIOB->IDR&0x0f00)!=0x0000)
    {
    	delay_ms(10);
    	if((GPIOB->IDR&0x0f00)!=0x0000)
    	{
    		switch(GPIOB->IDR&0x0f00)
    		{
    			case 0x0100:KeyValue='1';break;
    			case 0x0200:KeyValue='5';break;
    			case 0x0400:KeyValue='9';break;
    			case 0x0800:KeyValue='D';break;
    		}
    	}
    	while((GPIOB->IDR&0x0f00)!=0x0000);
    	GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //1
    	return KeyValue;
    }
    
    GPIO_SetBits(GPIOB,GPIO_Pin_15); //1
    GPIO_ResetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14);//0
    if((GPIOB->IDR&0x0f00)!=0x0000)
    {
    	delay_ms(10);
    	if((GPIOB->IDR&0x0f00)!=0x0000)
    	{
    		switch(GPIOB->IDR&0x0f00)
    		{
    			case 0x0100:KeyValue='0';break;
    			case 0x0200:KeyValue='4';break;
    			case 0x0400:KeyValue='8';break;
    			case 0x0800:KeyValue='C';break;
    		}
    	}
    	while((GPIOB->IDR&0x0f00)!=0x0000);
    	GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //1
    	return KeyValue;
    }
    GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //1
    return '!';//表明没键按下
    

    }

    欢迎使用Markdown编辑器

    你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

    新的改变

    我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

    1. 全新的界面设计 ,将会带来全新的写作体验;
    2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
    3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
    4. 全新的 KaTeX数学公式 语法;
    5. 增加了支持甘特图的mermaid语法1 功能;
    6. 增加了 多屏幕编辑 Markdown文章功能;
    7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
    8. 增加了 检查列表 功能。

    功能快捷键

    撤销:Ctrl/Command + Z
    重做:Ctrl/Command + Y
    加粗:Ctrl/Command + B
    斜体:Ctrl/Command + I
    标题:Ctrl/Command + Shift + H
    无序列表:Ctrl/Command + Shift + U
    有序列表:Ctrl/Command + Shift + O
    检查列表:Ctrl/Command + Shift + C
    插入代码:Ctrl/Command + Shift + K
    插入链接:Ctrl/Command + Shift + L
    插入图片:Ctrl/Command + Shift + G

    合理的创建标题,有助于目录的生成

    直接输入1次#,并按下space后,将生成1级标题。
    输入2次#,并按下space后,将生成2级标题。
    以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

    如何改变文本的样式

    强调文本 强调文本

    加粗文本 加粗文本

    标记文本

    删除文本

    引用文本

    H2O is是液体。

    210 运算结果是 1024.

    插入链接与图片

    链接: link.

    图片: Alt

    带尺寸的图片: Alt

    居中的图片: Alt

    居中并且带尺寸的图片: Alt

    当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

    如何插入一段漂亮的代码片

    博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

    // An highlighted block
    var foo = 'bar';
    

    生成一个适合你的列表

    • 项目
      • 项目
        • 项目
    1. 项目1
    2. 项目2
    3. 项目3
    • 计划任务
    • 完成任务

    创建一个表格

    一个简单的表格是这么创建的:

    项目 Value
    电脑 $1600
    手机 $12
    导管 $1

    设定内容居中、居左、居右

    使用:---------:居中
    使用:----------居左
    使用----------:居右

    第一列 第二列 第三列
    第一列文本居中 第二列文本居右 第三列文本居左

    SmartyPants

    SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

    TYPE ASCII HTML
    Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
    Quotes "Isn't this fun?" “Isn’t this fun?”
    Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

    创建一个自定义列表

    Markdown
    Text-to-HTML conversion tool
    Authors
    John
    Luke

    如何创建一个注脚

    一个具有注脚的文本。2

    注释也是必不可少的

    Markdown将文本转换为 HTML

    KaTeX数学公式

    您可以使用渲染LaTeX数学表达式 KaTeX:

    Gamma公式展示 Γ(n)=(n1)!nN\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通过欧拉积分

    Γ(z)=0tz1etdt&ThinSpace;. \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

    你可以找到更多关于的信息 LaTeX 数学表达式here.

    新的甘特图功能,丰富你的文章

    Mon 06Mon 13Mon 20已完成 进行中 计划一 计划二 现有任务Adding GANTT diagram functionality to mermaid
    • 关于 甘特图 语法,参考 这儿,

    UML 图表

    可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

    张三李四王五你好!李四, 最近怎么样?你最近怎么样,王五?我很好,谢谢!我很好,谢谢!李四想了很长时间,文字太长了不适合放在一行.打量着王五...很好... 王五, 你怎么样?张三李四王五

    这将产生一个流程图。:

    链接
    长方形
    圆角长方形
    菱形
    • 关于 Mermaid 语法,参考 这儿,

    FLowchart流程图

    我们依旧会支持flowchart的流程图:

    Created with Raphaël 2.2.0开始我的操作确认?结束yesno
    • 关于 Flowchart流程图 语法,参考 这儿.

    导出与导入

    导出

    如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

    导入

    如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
    继续你的创作。


    1. mermaid语法说明 ↩︎

    2. 注脚的解释 ↩︎

    展开全文
  • 我们知道在51单片机中,通过扫描某个口的电平高低得知那个按键按下,比如,控制两行4列,假如让P1=0xCf;低位都置1 (pb0-pb3),pb4-pb5置0;然后我们就扫描P1口就行了,如果有按键被按下的,高电平会被强制拉低的。
  • STM32键盘扫描程序

    千次阅读 2019-05-13 18:57:46
    32写了一个键盘扫描程序,分享给大家 !这里插入图片描述](https://img-blog.csdnimg.cn/20190513185453498.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4...
    展开全文
  • 内含STM32的驱动,有详细的按键扫描程序以及完整工程,可以拿去直接编译通过调试即可,可在平台运行成功
  • stm32矩阵键盘按键扫描程序亲测可用,PA0~PA7为矩阵键盘接口,PA9PA10为串口
  • stm32矩阵键盘扫描

    2015-08-09 10:24:21
    stm32矩阵键盘扫描程序,亲测可用,GPIOA口,原理与51单片机类似
  • STM32 矩阵键盘扫描实验

    热门讨论 2011-05-15 09:45:27
    STM32 矩阵键盘扫描实验,完整程序,高度的可移植性,可以接到任意IO口。 4*4 与4*3 扫描读按键程序
  • stm32矩阵键盘程序

    2016-07-25 13:43:46
    最简单的矩阵键盘程序代码,扫描只有九行代码,通俗易懂,方便移植,
  • 基于STM32l152做的4*8矩阵键盘,采用定时器消抖,扫描效率高
  • STM32】4*4矩阵键盘扫描程序(扫描方式)

    千次阅读 热门讨论 2020-06-16 13:35:48
    能力有限,参照之前学的51单片机例程写了份简单粗暴型的按键扫描程序,如需在大项目中使用还是得用中断来处理比较好~ 矩阵键盘实物和原理图 图中厂家给的图应该标错了序号,从左到右是S1-S4、S5-S8、S9-S12、S13-...

    由于买的最小系统开发板只有一个按键感觉不大方便调试和搞其他东东,所以又在某宝买了一个4*4矩阵键盘拓展一下按键哈。能力有限,参照之前学的51单片机例程写了份简单粗暴型的按键扫描程序,如需在大项目中使用还是得用中断来处理比较好~
    点击下载源码

    矩阵键盘实物和原理图


    图中厂家给的图应该标错了序号,从左到右是S1-S4、S5-S8、S9-S12、S13-S16为一行,小伙伴们自行理会啦。

    总体思路:先向矩阵的4行输出低电平,然后检测4列的输入,若为’0’的那列即该列有按键按下;接着向列输出高电平,检测行输入,若为’1’的那行即为按键在该列的位置,从而确定按键所在的某列某行了。(先检测行再检测列也是可以的)

    void KEY1_Init(void)
    {
       GPIO_InitTypeDef GPIO_InitStructure;
       RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOA、B
       GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入  
       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_10|GPIO_Pin_11;  
       GPIO_Init(GPIOB,&GPIO_InitStructure); 
       GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;        //推挽输出
       GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;      
       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
       GPIO_Init(GPIOA,&GPIO_InitStructure);       
       GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); //行输出低电平,扫描列
    }
    void KEY2_Init(void)
    {
       GPIO_InitTypeDef GPIO_InitStructure;
       RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
    
    	
       GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;        //推挽输出
       GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_10;
       GPIO_Init(GPIOB,&GPIO_InitStructure);
       GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_10|GPIO_Pin_11);  //扫描行
       GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;   //下拉输入
       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
       GPIO_Init(GPIOA,&GPIO_InitStructure);	 
    }
    u8 KeyScan(void)
    {
    	u8 column=0,KeyValue=0;
        KEY1_Init();    //行输入低电平,扫描列
    	while(1)
    	{
    		if(PBin(0)==0)
    		{
    			delay_ms(50);
    			if(PBin(0)==0)
    			{
    				column=1;        //第一列
    			}
    		}
    		if(PBin(1)==0)
    		{
    			delay_ms(50);
    			if(PBin(1)==0)
    			{
    				column=2;        //第二列
    			}
    		}
    		if(PBin(10)==0)
    		{
    			delay_ms(50);
    			if(PBin(10)==0)
    			{
    				column=3;        //第三列
    			}
    		}
    		if(PBin(11)==0)
    		{
    			delay_ms(50);
    			if(PBin(11)==0)
    			{
    				column=4;        //第四列
    			}
    		}		
    		if(column==1)  
    		{
    				KEY2_Init();     //列输出高电平,扫描行		           
    					if(PAin(7)==1) //第一列第一行
    					{
    						KeyValue=1;
    						break;   
    					}
    					if(PAin(6)==1) //第一列第二行
    					{
    						KeyValue=5;
    						break;   
    					}
    					if(PAin(5)==1) //第一列第三行
    					{
    						KeyValue=9;
    						break;   
    					}
    					if(PAin(4)==1) //第一列第四行
    					{
    						KeyValue=13;
    						break;   
    					}
    				
    		}	
    		
    		if(column==2)
    		{
    				KEY2_Init();     //以下同理				           
    					if(PAin(7)==1)
    					{
    						KeyValue=2;
    						break;   
    					}
    					if(PAin(6)==1)
    					{
    						KeyValue=6;
    						break;  
    					}
    					if(PAin(5)==1)
    					{
    						KeyValue=10;
    						break; 
    					}
    					if(PAin(4)==1)
    					{
    						KeyValue=14;
    						break;  
    					}
    				
    		}		
    		if(column==3)
    		{
    				KEY2_Init();    			           
    					if(PAin(7)==1)
    					{
    						KeyValue=3;
    						break;   
    					}
    					if(PAin(6)==1)
    					{
    						KeyValue=7;
    						break;   
    					}
    					if(PAin(5)==1)
    					{
    						KeyValue=11;
    						break;   
    					}
    					if(PAin(4)==1)
    					{
    						KeyValue=15;
    						break;   
    					}
    				
    		}
    		
    		if(column==4)
    		{
    				KEY2_Init();             
    					if(PAin(7)==1)
    					{
    						KeyValue=4;
    						break;  
    					}
    					if(PAin(6)==1)
    					{
    						KeyValue=8;
    						break;   
    					}
    					if(PAin(5)==1)
    					{
    						KeyValue=12;
    						break;   
    					}
    					if(PAin(4)==1)
    					{
    						KeyValue=16;
    						break;   
    					}				
    		}
    		
    	}
       return KeyValue;
    }
    

    效果图

    注意事项:
    ①在选择开发板的IO口时一定要看看原理图或者数据手册,确定这8个IO口是可用的(小编在使用时本来用了PB2引脚的,结果调试了好久都没得到正确的结果,检查了N多遍程序觉得没问题,最后回归到硬件上才发现原来只有PB2与BOOT1和GND相连了,所以就导致大部分结果都出错啦,希望其他小伙伴别走进坑哈哈)
    ②关于IO口输入输出模式的选择问题。输出模式一般都是选择推挽输出的,因为可直接输出0或1;关于输入模式的话,按键一边输出了0(1),那么要检测是否有按键按下,另一边的应选择上拉输入设置该引脚为1(下拉输入设置该引脚为0)。
    ③该程序没有写按键松开检测程序,所以不松开按键的话可以一直检测到;想弄按键松开检测的小伙伴可以设置一个静态变量作为按键松开的标志即可。

    这里用的方法比较简单易懂,但是比较占用MCU的资源。若大家有很好的推荐,欢迎交流沟通呀!!!若大家要下载源码可以留言邮箱(设置了0C币发现过几天会自动升价)。

    展开全文
  • STM32】4*4矩阵键盘扫描程序(中断方式)

    千次阅读 热门讨论 2020-08-12 21:49:55
    上一篇杂记写了个扫描方式的键盘程序,但是最近在做一个小游戏对CPU响应速度有要求,于是再弄个简单的键盘中断检测程序吧。 总体思路:中断线为4行连接的GPIO口,先初始化矩阵的4行输出低电平4列输出高电平,当有...

    点击下载源码
    上一篇杂记写了个扫描方式的键盘程序,但是最近在做一个小游戏对CPU响应速度有要求,于是再弄个简单的键盘中断检测程序吧。

    总体思路:中断线为4行连接的GPIO口,先初始化矩阵的4行输出低电平4列输出高电平,当有按键按下时的上升沿触发中断;然后在相应的中断处理函数里面采取查询的方式(参考上篇)获得键值。

    部分程序

    void EXTI9_5_IRQHandler(void)                           //外部中断中断函数
    {
    
    		if(EXTI_GetITStatus(EXTI_Line7) != RESET)           //检测中断标志位
    		{			
    			//行置高,列置低,扫描列
    			GPIO_SetBits ( ROW1_GPIO_PORT, ROW1_GPIO_PIN );
    			
    			GPIO_ResetBits ( LINE1_GPIO_PORT, LINE1_GPIO_PIN );
    		    GPIO_ResetBits ( LINE2_GPIO_PORT, LINE2_GPIO_PIN );
    		    GPIO_ResetBits ( LINE3_GPIO_PORT, LINE3_GPIO_PIN );
    			GPIO_ResetBits ( LINE4_GPIO_PORT, LINE4_GPIO_PIN );
    
    			//取4列的状态
    			if(GPIO_ReadInputDataBit ( LINE1_GPIO_PORT, LINE1_GPIO_PIN ))
    			{
    				while(GPIO_ReadInputDataBit ( LINE1_GPIO_PORT, LINE1_GPIO_PIN )); //等待按键松开,不然出现连续进入中断的错误
    				KeyValue = 1;
    									
    			}
    			if(GPIO_ReadInputDataBit ( LINE2_GPIO_PORT, LINE2_GPIO_PIN ))
    			{
    				while(GPIO_ReadInputDataBit ( LINE2_GPIO_PORT, LINE2_GPIO_PIN ));
    				KeyValue = 2;
    			}
    			if(GPIO_ReadInputDataBit ( LINE3_GPIO_PORT, LINE3_GPIO_PIN ))
    			{
    				while(GPIO_ReadInputDataBit ( LINE3_GPIO_PORT, LINE3_GPIO_PIN ));
    				KeyValue = 3;
    			}
               if(GPIO_ReadInputDataBit ( LINE4_GPIO_PORT, LINE4_GPIO_PIN ))
    			{
    				while(GPIO_ReadInputDataBit ( LINE4_GPIO_PORT, LINE4_GPIO_PIN ));
    				KeyValue = 4;
    			}				
    			EXTI_ClearITPendingBit(EXTI_Line7);                         //清除标志位	
    
    		}		
    		
    		
    		if(EXTI_GetITStatus(EXTI_Line6) != RESET)           //检测中断标志位
    		{
    		
    			GPIO_SetBits ( ROW2_GPIO_PORT, ROW2_GPIO_PIN );
    			
    			GPIO_ResetBits ( LINE1_GPIO_PORT, LINE1_GPIO_PIN );
    		    GPIO_ResetBits ( LINE2_GPIO_PORT, LINE2_GPIO_PIN );
    		    GPIO_ResetBits ( LINE3_GPIO_PORT, LINE3_GPIO_PIN );
    			GPIO_ResetBits ( LINE4_GPIO_PORT, LINE4_GPIO_PIN );
    			//取4列的状态
    			if(GPIO_ReadInputDataBit ( LINE1_GPIO_PORT, LINE1_GPIO_PIN ))
    			{
    				while(GPIO_ReadInputDataBit ( LINE1_GPIO_PORT, LINE1_GPIO_PIN ));
    				KeyValue = 5;			
    			}
    			if(GPIO_ReadInputDataBit ( LINE2_GPIO_PORT, LINE2_GPIO_PIN ))
    			{
    				while(GPIO_ReadInputDataBit ( LINE2_GPIO_PORT, LINE2_GPIO_PIN ));
    				KeyValue = 6;
    			}
    			if(GPIO_ReadInputDataBit ( LINE3_GPIO_PORT, LINE3_GPIO_PIN ))
    			{
    				while(GPIO_ReadInputDataBit ( LINE3_GPIO_PORT, LINE3_GPIO_PIN ));
    				KeyValue = 7;
    			}
    			if(GPIO_ReadInputDataBit ( LINE4_GPIO_PORT, LINE4_GPIO_PIN ))
    			{
    				while(GPIO_ReadInputDataBit ( LINE4_GPIO_PORT, LINE4_GPIO_PIN ));
    				KeyValue = 8;
    			}
    			EXTI_ClearITPendingBit(EXTI_Line6);                         //清除标志位
    		}
    		
    		if(EXTI_GetITStatus(EXTI_Line5) != RESET)           //检测中断标志位
    		{
    	
    			GPIO_SetBits ( ROW3_GPIO_PORT, ROW3_GPIO_PIN );
    			
    			GPIO_ResetBits ( LINE1_GPIO_PORT, LINE1_GPIO_PIN );
    		    GPIO_ResetBits ( LINE2_GPIO_PORT, LINE2_GPIO_PIN );
    		    GPIO_ResetBits ( LINE3_GPIO_PORT, LINE3_GPIO_PIN );
    			GPIO_ResetBits ( LINE4_GPIO_PORT, LINE4_GPIO_PIN );
    			//取4列的状态
    			if(GPIO_ReadInputDataBit ( LINE1_GPIO_PORT, LINE1_GPIO_PIN ))
    			{
    				while(GPIO_ReadInputDataBit ( LINE1_GPIO_PORT, LINE1_GPIO_PIN ));
    				KeyValue = 9;			
    			}
    			if(GPIO_ReadInputDataBit ( LINE2_GPIO_PORT, LINE2_GPIO_PIN ))
    			{
    				while(GPIO_ReadInputDataBit ( LINE2_GPIO_PORT, LINE2_GPIO_PIN ));
    				KeyValue = 10;
    			}
    			if(GPIO_ReadInputDataBit ( LINE3_GPIO_PORT, LINE3_GPIO_PIN ))
    			{
    				while(GPIO_ReadInputDataBit ( LINE3_GPIO_PORT, LINE3_GPIO_PIN ));
    				KeyValue = 11;
    			}
    			if(GPIO_ReadInputDataBit ( LINE4_GPIO_PORT, LINE4_GPIO_PIN ))
    			{
    				while(GPIO_ReadInputDataBit ( LINE4_GPIO_PORT, LINE4_GPIO_PIN ));
    				KeyValue = 12;
    			}
    			EXTI_ClearITPendingBit(EXTI_Line5);                         //清除标志位
    		}
    				
    		//重置GPIO,等待下次中断
    	    //行置高
    		GPIO_ResetBits ( ROW1_GPIO_PORT, ROW1_GPIO_PIN );
    		GPIO_ResetBits ( ROW2_GPIO_PORT, ROW2_GPIO_PIN );
    		GPIO_ResetBits ( ROW3_GPIO_PORT, ROW3_GPIO_PIN );
    	    GPIO_ResetBits ( ROW4_GPIO_PORT, ROW4_GPIO_PIN );
        	//列置高
    		GPIO_SetBits ( LINE1_GPIO_PORT, LINE1_GPIO_PIN );
    		GPIO_SetBits ( LINE2_GPIO_PORT, LINE2_GPIO_PIN );
    		GPIO_SetBits ( LINE3_GPIO_PORT, LINE3_GPIO_PIN );	
    		GPIO_SetBits ( LINE4_GPIO_PORT, LINE4_GPIO_PIN );	
    	}
    void EXTI4_IRQHandler(void) 
    {
    if(EXTI_GetITStatus(EXTI_Line4) != RESET)           //检测中断标志位
    		{
    		
    			
    			GPIO_SetBits ( ROW4_GPIO_PORT, ROW4_GPIO_PIN );
    			
    			GPIO_ResetBits ( LINE1_GPIO_PORT, LINE1_GPIO_PIN );
    		    GPIO_ResetBits ( LINE2_GPIO_PORT, LINE2_GPIO_PIN );
    		    GPIO_ResetBits ( LINE3_GPIO_PORT, LINE3_GPIO_PIN );
    			GPIO_ResetBits ( LINE4_GPIO_PORT, LINE4_GPIO_PIN );
    			//取4列的状态
    			if(GPIO_ReadInputDataBit ( LINE1_GPIO_PORT, LINE1_GPIO_PIN ))
    			{
    				while(GPIO_ReadInputDataBit ( LINE1_GPIO_PORT, LINE1_GPIO_PIN ));
    				KeyValue = 13;		
    			}
    			if(GPIO_ReadInputDataBit ( LINE2_GPIO_PORT, LINE2_GPIO_PIN ))
    			{
    				while(GPIO_ReadInputDataBit ( LINE2_GPIO_PORT, LINE2_GPIO_PIN ));
    				KeyValue = 14;
    			}
    			if(GPIO_ReadInputDataBit ( LINE3_GPIO_PORT, LINE3_GPIO_PIN ))
    			{
    				while(GPIO_ReadInputDataBit ( LINE3_GPIO_PORT, LINE3_GPIO_PIN ));
    				KeyValue = 15;   
    			}
    			if(GPIO_ReadInputDataBit ( LINE4_GPIO_PORT, LINE4_GPIO_PIN ))
    			{
    				while(GPIO_ReadInputDataBit ( LINE4_GPIO_PORT, LINE4_GPIO_PIN ));
    				KeyValue = 16;   
    			}
    			EXTI_ClearITPendingBit(EXTI_Line4);                         //清除标志位
    		}
    		//重置GPIO,等待下次中断
    	    //行置高
    		GPIO_ResetBits ( ROW1_GPIO_PORT, ROW1_GPIO_PIN );
    		GPIO_ResetBits ( ROW2_GPIO_PORT, ROW2_GPIO_PIN );
    		GPIO_ResetBits ( ROW3_GPIO_PORT, ROW3_GPIO_PIN );
    	    GPIO_ResetBits ( ROW4_GPIO_PORT, ROW4_GPIO_PIN );
        	//列置高
    		GPIO_SetBits ( LINE1_GPIO_PORT, LINE1_GPIO_PIN );
    		GPIO_SetBits ( LINE2_GPIO_PORT, LINE2_GPIO_PIN );
    		GPIO_SetBits ( LINE3_GPIO_PORT, LINE3_GPIO_PIN );	
    		GPIO_SetBits ( LINE4_GPIO_PORT, LINE4_GPIO_PIN );	
    }
    
    

    注意事项:
    ①在选择开发板的IO口时一定要看看原理图或者数据手册,确定这8个IO口是可用的
    ②使用外部中断时要打开复用IO时钟AFIO
    ③中断程序里面一定要有按键松开的检测,不然会一直进入中断服务函数。

    若大家要下载源码可以留言邮箱(设置了0C币发现过几天会自动升价)。还有其他建议,欢迎交流沟通呀!!!

    展开全文
  • STM32的矩阵键盘扫描及处理

    千次阅读 多人点赞 2020-10-04 11:04:48
    STM32的矩阵键盘扫描及处理 前言 由于最近帮做一个毕业设计需要用到直接输入目标值去控制输出,所以才写这么一个按键处理的程序。对于一个才接触单片机没多久的大学生菜鸟来说,实现毕设里的每一项功能都有一定的...
  • 这是一个完整的stm32加上tft液晶屏显示加键盘扫描程序
  • 没有关系,自己改成stm32 的,手册里的时序延时最小几纳秒就可以,所以对于使stm32f4或者51程序中可以不加延时函数,直接写语句就可以,因为一条语句执行的时间已经超出手册上的最小时间了。 官方程序(C51),博主...
  • 矩阵键盘驱动 矩阵键盘驱动 /* *文件 *编写人LiuHui *描述扫描4x4矩阵键盘输入并返回键值 *适用范围驱动采用库编写适用于 STM32F10X系列单片机 *所用引脚PA0-PA7 *编写时间2014年5月20日 */ #i nclude" #i nclude" #...
  • 基于STM32的按键扫描测试程序(学习记录): 目录: 源码; 4x4按键原理; Tips: 粘贴代码时,粘贴在源文件存放的位置中(如:HARDWARE中的.c和.h文件),用C++编译器打开,而不是kei;最后keil会正常显示中文...
  • 使用G070RB编了一个矩阵键盘扫描程序. 如下图, 1-4轮流拉低, 5-8检测输入确定是哪个键按下. 然后用1602液晶显示. 写完后在主函数中调用, 正常运行没有问题. 做完后想试试用外部中断调用是否可以. 于是用J25的引脚接...
  • 高速嵌入式MCU应用中,键盘扫描程序对电气信号完整性的容错处理。
  • //按键扫描函数 void Key_Text(void); #endif key.c文件 #include "key.h" #include "sys.h" #include "delay.h" #include "usart.h" #include "lcd.h" u8 tem; //按键初始化函数 void KEY_Init...
  • 亲测可用4X4矩阵键盘,简单好用,采用行列扫描方法,延时程序不占用MCU资源。 主控芯片为stm32f407VGT6
  • stm32矩阵按键程序.rar

    2020-06-16 13:19:05
    键盘扫描
  • 利用stm32f103vet6外部中断来获取矩阵键盘键值外加可精确到小数点后6位计算器源程序 利用外部中断来获取键值,避免了逐行扫描,减少了cpu的占用。准确的获取键值,运用二维数组来存放键值,让55的矩阵键盘输出键值,...
  • 电子-新型键盘扫描程序非常简单好用.doc,单片机/嵌入式STM32-F0/F1/F2
  • 经本人刻苦钻研,将51单片机上用的矩阵键盘扫描程序移植到了stm32上,同时也做了很大的改进,最大的改进莫过于消抖这块了。以前的消抖总是采用delay延时约10到20ms的时间,但这样会导致MCU在延时里空跑而造成主程序...
  • 本文实现的代码是基于STM32HAL库的基础上的,不过标准库也可以用,只是调用的库函数不同,逻辑跟配置是一样的,按我这里的逻辑来配置即可。 1、键盘原理图: 原理举例:先把 F0-F7 内部拉高,这样这个8个引脚都是高...
  • 4*4键盘程序代码 基于STM32

    千次阅读 2014-10-31 20:13:59
    4*4键盘程序代码 基于STM32   这是自己写的扫描第一行按键的程序代码。 PE的位8~位11设置为下拉输入。 PE的位12~位15设置为推挽输出 其中PE的位11是4*4键盘的第一列,PE的为键盘的第一行。 先将第一行设置为...

空空如也

空空如也

1 2 3
收藏数 51
精华内容 20
关键字:

stm32键盘扫描程序