




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、STM3洲矩阵键盘,不带外部中断,可以多个按键同时按下C代码:STM32用矩阵键盘,不带外部中断,可以多个按键同时按下/*矩阵键盘.h文件*/#ifndef_COMMON_H#define_COMMON_H#include""/*4*4矩阵键盘*/voidkeyboard_init(void);voidupdate_key(void);externunsignedcharkey44;#endif/*矩阵键盘.c文件*/#include""structGPIO_TypeDef*GPIO_x;unsignedshortGPIO_pin;staticstruc
2、tio_portkey_output4=GPIOD,GPIO_Pin_0,GPIOD,GPIO_Pin_1,GPIOD,GPIO_Pin_2,GPIOD,GPIO_Pin_3io_port;staticstructio_portkey_input4=GPIOD,GPIO_Pin_4,GPIOD,GPIO_Pin_5,GPIOD,GPIO_Pin_6,GPIOD,GPIO_Pin_7;unsignedcharkey44;voidkeyboard_init(void)GPIO_InitTypeDefGPIO_InitStructure;unsignedchari;/*键盘行扫描输出线输出高电平*/
3、*PA0PA1PA2PA3输出*/=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;=GPIO_Mode_Out_PP;=GPIO_Speed_50MHz;GPIO_Init(GPIOD,&GPIO_InitStructure);/*键盘列扫描输入线键被按时输入高电平放开输入低电平*/*PA4PA5PA6PA7输入*/=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;=GPIO_Mode_IPU;GPIO_Init(GPIOD,&GPIO_InitStructure);for(i=0;i<4;
4、i+)GPIO_SetBits(key_outputi.GPIO_x,key_outputi.GPIO_pin);voidupdate_key(void)unsignedchari,j;for(i=0;i<4;i+)PIO_x,key_outputi.GPIO_pin);for(j=0;j<4;j+)PIO_x,key_inputj.GPIO_pin)=0)keyij=1;elsekeyij=0;GPIO_SetBits(key_outputi.GPIO_x,key_outputi.GPIO_pin);stm32矩阵键盘这是硬件上的键盘规划/|1|2|3|4|-line1PE6/|
5、5|6|7|8|-line2PE5/|9|10|11|12|-line3PE4/|13|14|15|16|-line4PE3/|17|18|19|20|-line5PE2/|/col1col2col3col4/PE0PB5PB8PB9/参考了下基于avr的矩阵键盘程序,耐着性子移植到符合上面硬件规划的stm32板子上。volatileuint8_tkey_flag=0;voidkey_init(void)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDefGPIO_In
6、itStructure;/keyoutput=GPIO_Mode_Out_PP;=GPIO_Speed_50MHz;=GPIO_Pin_0;GPIO_Init(GPIOE,&GPIO_InitStructure);=GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9;GPIO_Init(GPIOB,&GPIO_InitStructure);/keyinput=GPIO_Mode_IPU;/上拉输入=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;GPIO_Init(GPIOE,&GPIO_Ini
7、tStructure);/判断是否有键按下函数,对键盘进行一次扫描/返回键盘接口状态,有键按下时返回键值;没有键按下返回无效标志位uint8_tIs_Key_PressOn(void)volatileuint8_ti,ScanCode;for(i=0;i<4;i+)switch(i)/扫描信号产生case0:GPIOE->BSRR=0x00010000;/PE0=0;GPIOB->BSRR=0x00000320;/PB5=1;PB8=1;PB9=1;key_flag=1;break;case 1:GPIOE->BSRR=0x00000001;/PE0=1;GPIOB-&
8、gt;BSRR=0x00200300;/PB5=0;PB8=1;PB9=1;break;case 2:GPIOE->BSRR=0x00000001;/PE0=1;GPIOB->BSRR=0x01000220;/PB5=1;PB8=0;PB9=1;key_flag=3;break;case 3:GPIOE->BSRR=0x00000001;/PE0=1;GPIOB->BSRR=0x02000120;/PB5=1;PB8=1;PB9=0;key_flag=4;break;default:key_flag=0;break;if(uint8_t)GPIOE->IDR)|0
9、x83)!=0xff)return(uint8_t)GPIOE->IDR|0x83);return(PRESS_INVALID);/找到闭合键,判断延时前后两次键值是否相同,如果相同则返回键值uint8_tFind_Key_PressOn(uint8_tKeyCode_before,uint8_tKeyCode_after)if(KeyCode_before=KeyCode_after)return(KeyCode_after);elsereturn(PRESS_INVALID);/计算键值,根据返回的键值计算相应的返回值uint8_tCalc_Key_PressOn(uint8_tKe
10、yCode)uint8_tTempNum;switch(KeyCode)case0xBF:if(1=key_flag)TempNum=1;break;elseif(2=key_flag)TempNum=2;break;elseif(3=key_flag)TempNum=3;break;elseif(4=key_flag)TempNum=4;break;elsebreak;case0xDF:if(1=key_flag)TempNum=5;break;TempNum=6;break;elseif(3=key_flag)TempNum=7;break;elseif(4=key_flag)TempNu
11、m=8;break;elsebreak;case0xEF:if(1=key_flag)TempNum=9;break;elseif(2=key_flag)TempNum=10;break;elseif(3=key_flag)TempNum=11;break;TempNum=12;break;elsebreak;case0xF7:if(1=key_flag)TempNum=13;break;elseif(2=key_flag)TempNum=14;break;elseif(3=key_flag)TempNum=15;break;elseif(4=key_flag)TempNum=16;break
12、;elsebreak;case0xFB:if(1=key_flag)TempNum=17;break;TempNum=18;break;elseif(3=key_flag)TempNum=19;break;elseif(4=key_flag)TempNum=20;break;elsebreak;default:TempNum=0;break;/发生错误时返回,无效标志return(TempNum);/正常返回值为116/键盘扫描主程序uint8_tKeyboard(void)uint8_tkey_temp;/暂存键值的变量key_temp=Is_Key_PressOn();/判断是否有键闭合/
13、PORTC=key_temp;调试过程中使用,正常运行时没用可以删除if(key_temp=PRESS_INVALID)/判断该次扫描中是否有键按下return(PRESS_INVALID);/没有闭合则建立无效标志elsedelay_nus(100);/闭合则延时找到闭合键key_temp=Find_Key_PressOn(key_temp,(uint8_t)GPIOE->IDR|0x83);/if(key_temp=PRESS_INVALID)return(key_temp);/若延时前后键值不相等则返回无效标志elsekey_temp=Calc_Key_PressOn(key_te
14、mp);/有效则计算键值while(uint8_t)GPIOE->IDR)|0x83)!=0xff)/等待键放。看实际情况使用delay_nus(10);return(key_temp);/返回键值梦之旅同学松鼠学习笔记(三)之矩阵键盘这几天事情比较多,所以就一直没有更新,呵呵,今天早上没课,把之前写好代码整理一下,顺便说下思路,发上来,供大家参考参考。首先,本矩阵键盘硬件连接如下:思路:我的思路如下,首先,把纵向三线设置为推挽输出,然后把横向三线设置为下拉输入,然后读取横向三线的值,如果有接口的读数为1,说明有按键按下了,把该值与0x07相与后放到scana,然后左移4位放到resul
15、t中,这之后把横向三线设置为推挽输出,纵向三线设置为下拉输入,然后读取纵向三线的值,把相应的键值保存到scanb中,然后通过移位使得低四位表示的是相应的按键所在横向的值,然后与result相或放到result的低四位,这样得到的result高四位就是按键所在纵向的值,低四位就是按键所在横向的值,由此就可以检测到那个按键被按下了。效果:按下相应的键盘,四个led灯会显示各种不同的状态,hoho,一共有9种状态。#include""voidRCC_Configuration(void);voidGPIO_Configuration(void);voidNVIC_Configur
16、ation(void);voiddelay(void);u8KEY_GPIO_Scanning(void);intmain(void)#ifdefDEBUGdebug();#endifRCC_Configuration();/配置系统时钟NVIC_Configuration();/配置NVIC和VectorTableGPIO_Configuration();使用的GPIO口/主循环while(1)/循环扫描按键按键按下时对应的LED亮switch(KEY_GPIO_Scanning()case(0x18):GPIO_SetBits(GPIOB,GPIO_Pin_12);GPIO_ResetBi
17、ts(GPIOB,GPIO_Pin_13);GPIO_ResetBits(GPIOB,GPIO_Pin_14);GPIO_ResetBits(GPIOB,GPIO_Pin_15);break;case(0x12):GPIO_ResetBits(GPIOB,GPIO_Pin_12);GPIO_SetBits(GPIOB,GPIO_Pin_13);GPIO_ResetBits(GPIOB,GPIO_Pin_14);GPIO_ResetBits(GPIOB,GPIO_Pin_15);break;case(0x14):GPIO_SetBits(GPIOB,GPIO_Pin_12);GPIO_SetBi
18、ts(GPIOB,GPIO_Pin_13);GPIO_ResetBits(GPIOB,GPIO_Pin_14);GPIO_ResetBits(GPIOB,GPIO_Pin_15);break;case(0x28):GPIO_ResetBits(GPIOB,GPIO_Pin_12);GPIO_ResetBits(GPIOB,GPIO_Pin_13);GPIO_SetBits(GPIOB,GPIO_Pin_14);GPIO_ResetBits(GPIOB,GPIO_Pin_15);break;case(0x24):GPIO_SetBits(GPIOB,GPIO_Pin_12);GPIO_Reset
19、Bits(GPIOB,GPIO_Pin_13);GPIO_SetBits(GPIOB,GPIO_Pin_14);GPIO_ResetBits(GPIOB,GPIO_Pin_15);break;case(0x48):GPIO_SetBits(GPIOB,GPIO_Pin_12);GPIO_SetBits(GPIOB,GPIO_Pin_13);GPIO_SetBits(GPIOB,GPIO_Pin_14);GPIO_ResetBits(GPIOB,GPIO_Pin_15);break;case(0x42):GPIO_ResetBits(GPIOB,GPIO_Pin_12);GPIO_ResetBi
20、ts(GPIOB,GPIO_Pin_13);GPIO_ResetBits(GPIOB,GPIO_Pin_14);GPIO_SetBits(GPIOB,GPIO_Pin_15);break;case(0x44):GPIO_SetBits(GPIOB,GPIO_Pin_12);GPIO_ResetBits(GPIOB,GPIO_Pin_14);GPIO_SetBits(GPIOB,GPIO_Pin_15);break;case(0x22):GPIO_SetBits(GPIOB,GPIO_Pin_12);GPIO_SetBits(GPIOB,GPIO_Pin_13);GPIO_SetBits(GPI
21、OB,GPIO_Pin_14);GPIO_SetBits(GPIOB,GPIO_Pin_15);break;voidRCC_Configuration(void)ErrorStatusHSEStartUpStatus;RCC_DeInit();/将外设RCC寄存器重设为缺省值RCC_HSEConfig(RCC_HSE_ON);/设置外部高速晶振(HSE)HSEStartUpStatus=RCC_WaitForHSEStartUp();/等待HSE起振if(HSEStartUpStatus=SUCCESS)FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_
22、Enable);/预取指缓存使能FLASH_SetLatency(FLASH_Latency_2);/设置代码延时值FLASH_Latency_22延时周期RCC_HCLKConfig(RCC_SYSCLK_Div1);/设置AHB时钟(HCLK)AHB 时 钟RCC_PCLK2Config(RCC_HCLK_Div2);/设置高速(PCLK2)RCC_HCLK_Div2APB1时钟=HCLK/2RCC_PCLK1Config(RCC_HCLK_Div2);/设置低速AHB时钟(PCLK1)RCC_HCLK_Div2APB1时钟=HCLK/2RCC_PLLConfig(RCC_PLLSourc
23、e_HSE_Div1,RCC_PLLMul_9);/PLLCLK=8MHz*9=72MHz设置PLL时钟源及倍频系数RCC_PLLCmd(ENABLE);使能或者失能PLLwhile(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)=RESET)/等待指定的RCC标志位设置成功等待PLL初始化成功RCC_SYSCLKCon巾g(RCC_SYSCLKSource_PLLCLK);设置系统时钟(SYSCLK设置PLL为系统时钟源while(RCC_GetSYSCLKSource()!=0x08)/等待PLL成功用作于系统时钟的时钟源0x00:HSI作为系统时钟0x04:HSE作
24、为系统时钟0x08:PLL作为系统时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/使能或者失能APB2外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);voidGPIO_Configuration(void)GPIO_InitTypeDefGPIO_InitStructure;=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;=GPIO_Speed_50MHz;/LED端口设置为推挽输出=GPIO_Mode_Out_OD;G
25、PIO_Init(GPIOB,&GPIO_InitStructure);/键盘横向三线=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;=GPIO_Speed_50MHz;=GPIO_Mode_IPD;GPIO_Init(GPIOA,&GPIO_InitStructure);/键盘纵向三线=GPIO_Pin_3;=GPIO_Speed_50MHz;=GPIO_Mode_Out_PP;GPIO_Init(GPIOA,&GPIO_InitStructure);=GPIO_Pin_1|GPIO_Pin_2;=GPIO_Speed_50MHz;=GPIO_Mo
26、de_Out_PP;GPIO_Init(GPIOB,&GPIO_InitStructure);voidGPIO_Reconfiguration(void)GPIO_InitTypeDefGPIO_InitStructure;/键盘横向三线/*Function Name: KEY_GPIO_ScanningDescription:依次才3描4个按键 使用一个u8变量的低4位存储扫描结果Input: None* Output: None* Return: 扫描的结果有效数据是低 4 位=GPIO_Speed_50MHz;=GPIO_Mode_Out_PP;GPIO_Init(GPIOA,&
27、amp;GPIO_InitStructure);/键盘纵向三线=GPIO_Pin_3;=GPIO_Speed_50MHz;=GPIO_Mode_IPD;GPIO_Init(GPIOA,&GPIO_InitStructure);=GPIO_Pin_1|GPIO_Pin_2;=GPIO_Speed_50MHz;=GPIO_Mode_IPD;GPIO_Init(GPIOB,&GPIO_InitStructure);*u8KEY_GPIO_Scanning(void)u8result;u8scana;/单个按键扫描变量u8scanb;/四个按键总的情况变量scan_sum低四位的每一位对应一个按键scana=0;scanb=0;result=0;GPIO_SetBits(GPIOA,GPIO_Pin_3);GPIO_SetBits(GPIOB,GPIO_Pin_1);GPIO_SetBits(GPIOB,GPIO_Pi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年钢筋混凝土制品生产销售合同
- 2025年商业综合体室内设计分包合同样本
- 修理厂规章制度范本与修理厂转让协议合同7篇
- 2025年企业法人借款合同策划与管理
- 劳动合同最重要的条款
- 合租合同的缴纳细则
- 2025年中型货车租赁服务策划合同范本
- 公司补贴合同范本
- 产品开发项目转让合同范例
- 内部装饰设计合同范本
- MMPI14个量表得分题目号码
- 龙虎山正一日诵早晚课
- 2023版教科版二年级下册科学课堂作业本参考答案
- 护士条例及相关法律法规课件
- 内蒙古大中矿业有限公司(东五分子铁矿)矿山地质环境保护与土地复垦方案
- 大连理工大学信封纸
- 新人教版四年级下册小学数学全册课时练(一课一练)
- 《酷虫学校 第1 12册 注音版 》读书笔记思维导图PPT模板下载
- 中华人民共和国环境保护法
- 湘教版八年级地理下册全册教案
- 战略管理徐飞版课件
评论
0/150
提交评论