历史上的今天
今天是:2025年04月08日(星期二)
2019年04月08日 | STM32F407实现矩阵键盘程序
2019-04-08 来源:eefocus
由于最近在做一个有关按键的项目,有用到矩阵键盘,因为网上有关矩阵键盘的程序很少,所以我就自己写一个发上去供大家参考,该程序所用到的GPIO口是PD0--PD7,至于矩阵键盘的原理就不一一描述了,直接上程序,具体程序如下:
//GPIO初始化函数
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructuress;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOA, ENABLE); //打开时钟
GPIO_InitStructuress.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; //初始化PD0-PD3
GPIO_InitStructuress.GPIO_Mode = GPIO_Mode_OUT ;
GPIO_InitStructuress.GPIO_OType = GPIO_OType_PP; //设置为推挽输出
GPIO_InitStructuress.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructuress.GPIO_PuPd =GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOD, &GPIO_InitStructuress);
GPIO_InitStructuress.GPIO_Pin =GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; //初始化PD4-PD7
GPIO_InitStructuress.GPIO_Mode =GPIO_Mode_OUT ;
GPIO_InitStructuress.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructuress.GPIO_PuPd = GPIO_PuPd_DOWN ;//Ï下拉
GPIO_Init(GPIOD, &GPIO_InitStructuress);
GPIO_SetBits( GPIOD,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
GPIO_ResetBits( GPIOD,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
}
//按键函数
extern void Keyspress()
{
int KeyValue;
int y=0;
int f=5;
while(f)
{
if((GPIO_ReadInputData(GPIOD)&0xff)!=0x0f)
{
Delay10ms(20);
if((GPIO_ReadInputData(GPIOD)&0xff)!=0x0f)
{
GPIO_SetBits(GPIOD,GPIO_Pin_0);
GPIO_ResetBits(GPIOD,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
switch(GPIO_ReadInputData(GPIOD)&0xff)
{
case 0x11:KeyValue=12;break;
case 0x21:KeyValue=13;break;
case 0x41:KeyValue=14;break;
case 0x81:KeyValue=15;break;
}
GPIO_SetBits(GPIOD,GPIO_Pin_1);
GPIO_ResetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3);
switch(GPIO_ReadInputData(GPIOD)&0xff)
{
case 0x12:KeyValue=8;break;
case 0x22:KeyValue=9;break;
case 0x42:KeyValue=10;break;
case 0x82:KeyValue=11;break;
}
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3);
switch(GPIO_ReadInputData(GPIOD)&0xff)
{
case 0x14:KeyValue=4;break;
case 0x24:KeyValue=5;break;
case 0x44:KeyValue=6;break;
case 0x84:KeyValue=7;break;
}
GPIO_SetBits(GPIOD,GPIO_Pin_3);
GPIO_ResetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);
switch(GPIO_ReadInputData(GPIOD)&0xff)
{
case 0x18:KeyValue=0;break;
case 0x28:KeyValue=1;break;
case 0x48:KeyValue=2;break;
case 0x88:KeyValue=3;break;
}
GPIO_SetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2 |GPIO_Pin_3);
GPIO_ResetBits(GPIOD, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 |GPIO_Pin_7);
while((GPIO_ReadInputData(GPIOD)&0xff)!=0x0f);
switch(KeyValue)
{
case 0:f=3;break;
case 1:f=3;break;
case 2:f=3;break;
case 4: f=3;break;
case 5: f=3;break;
case 6: f=3;break;
case 8:f=3;break;
case 9: f=3;break;
case 10: f=3; break;
case 12: f=3;break;
case 13: f=3;break;//由于项目只用到12个按键,所以有4个按键的扫描程序是没有的
}
}
}
}
}
//主函数:
int main
{
GPIO_Configuration();
Keyspress();
}
史海拾趣
|
a.宾馆、银行、饭店、娱乐场所等服务行业 服务行业的竞争愈来愈激烈,人们对服务行业的服务质量、服务态度有了更高的要求。这使得在窗口服务行业中,管理人员对营业人员的管理日趋重要。而闭路监控系统为管理者提供了一种有效的手段。电视监控 ...… 查看全部问答> |
|
我的电路图如下,其中稳压管是Vz=30V,做实验时发现随着输入电压(集电极电压)的增加,基极电压不变,射级电压缓慢增加,Vbe逐渐减小,当Vc升到40+时,Vbe竟然变成负的(Vb约30V,Ve=30.5V),我的三极管型号是MJH11022。为啥我的管子Vbe会变成负 ...… 查看全部问答> |
|
WinCE的设备,插入一张SD卡,然后在桌面创建一个快捷方式指向SD卡中程序,怎么运行不了呢,就是找不到程序,有知道的吗? WinCE的设备,插入一张SD卡,然后在桌面创建一个快捷方式指向SD卡中程序,怎么运行不了呢,就是找不到程序,有知道的吗?… 查看全部问答> |
|
内核是linux 2.4.18, busybox的配置信息:1.使用静态连接库 2.不用本地/usr 3.添加ext2文件系统工具:e2fsck, fsck.... 4.添加交叉编译工具路径。仅此而已,错误信息如下: > LINK busybox_unstri ...… 查看全部问答> |
|
问题: 虽然有dll的函数说明但不知道 一些参数的格式,和如果要读写数据时,需要那些步骤. 如有做过智能卡的开发的朋友 给点资料.谢谢!… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 13:40 编辑 具有SNRBoost 技术的最低功耗 11 位 200 MSPS ADC 4 通道、双通道与缓冲单通道选项 德州仪器 (TI) ADS58C48 系列是业界最低功耗的 11 位 ADC,速率高达 200 MSPS。 ...… 查看全部问答> |
|
STM32F串口出现奇怪现象,是不是串口收发器BUG,望高手指点 大家好,我用的是红牛开发板,CPU型号是STM32F103ZE,在进行串口实验时,STM32会将收到的数据原封不动的发送回来。在实验中,如果发送的数据不是0x00,收发正确,即串口发送什么东西,STM32都会正确接收,并回复给串口助手,串口助手也能正确 ...… 查看全部问答> |
|
dspMCBSP多通道缓冲串口,后接MAX3111进行串口扩展 用dsp的MCBSP串口扩展通信,使用SPI协议。知道mcbsp怎么初始化了,max3111有一个输出中断,连接到DSP,DSP要怎么样检测并使用MAX3111的输出中断?… 查看全部问答> |




