首页 > 编程知识 正文

stm32如何控制立方体矩阵(stm32矩阵键盘c语言程序,stm32的4*4矩阵键盘驱动程序)

时间:2023-05-03 20:46:26 阅读:122720 作者:585

/* * * * * * * * * * * * * * * * * *

正面是黑色引线,白色引线是列

a、b、c、d分别返回10 11 12 13

*14

#为15

0是16

不按按钮返回0

* * * * * * * * * * * * * * * * *

#include 'key.h '

#include 'delay.h '

//矩阵键盘管脚初始化

voidkey_init(void ) )。

{

gpio _ inittypedefgpio _ init structure;

RCC _ AP B2 periphclockcmd (RCC _ AP B2 per iph _ gpiob|RCC _ AP B2 per iph _ gpiod ); 启用PORTB、PORTD、PORTG时钟

//gpio _ pinremapconfig (gpio _ remap _ swj _ JTAG disable,ENABLE ); 可以关闭jtag并启用SWD,在SWD模式下进行调试。 针脚可能已被占用

gpio _ init structure.gpio _ pin=gpio _ pin _ 14; //键盘输出

gpio _ init structure.gpio _ mode=gpio _ mode _ out _ PP;

gpio _ init structure.gpio _ speed=gpio _ speed _ 50m Hz; //IO端口速度为50MHz

gpio_init(gpiod,GPIO_InitStructure );

gpio _ init structure.gpio _ pin=gpio _ pin _2| gpio _ pin _4| gpio _ pin _ 6; //键盘输出

gpio _ init structure.gpio _ mode=gpio _ mode _ out _ PP;

gpio _ init structure.gpio _ speed=gpio _ speed _ 50m Hz; //IO端口速度为50MHz

gpio_init(gpiog,GPIO_InitStructure );

gpio _ init structure.gpio _ pin=gpio _ pin _ 14; //键盘输入

gpio _ init structure.gpio _ mode=gpio _ mode _ IPU;

gpio_init(gpiob,GPIO_InitStructure );

gpio _ init structure.gpio _ pin=gpio _ pin _8| gpio _ pin _ 10|gpio _ pin _ 12; //键盘输入

gpio _ init structure.gpio _ mode=gpio _ mode _ IPU;

gpio_init(gpiod,GPIO_InitStructure );

}

//mode:0,不支持连击1 )支持连续按

u8key_scan(u8mode ) ) ) ) ) ) ) ) )。

{

静态u8 key0_ up=1; 按下//按钮释放徽标

静态u8 key1_ up=1; 按下//按钮释放徽标

静态u8 key2_ up=1; 按下//按钮释放徽标

静态u8 key3 _ up=1; 按下//按钮释放徽标

静态u8 key4_ up=1; 按下//按钮释放徽标

静态u8 key5_ up=1; 按下//按钮释放徽标

静态u8 key6_ up=1; 按下//按钮释放徽标

静态u8 key7_ up=1; 按下//按钮释放徽标

静态u8 key8_ up=1; 按下//按钮释放徽标

静态u8 key9_ up=1; 按下//按钮释放徽标

static u8 keyA_up=1; 按下//按钮释放徽标

静态u8 keyb _ up=1; 按下//按钮释放徽标

static u8 keyC_up=1; 按下//按钮释放徽标

static u8 keyD_up=1; 按下//按钮释放徽标

static u8 keyX_up=1; 按下//按钮释放徽标

static u8 keyJ_up=1; 按下//按钮释放徽标

是if (模式)

{

key0_up=1;

key1_up=1;

key2_up=1;

key3_up=1;

key4_up=1;

p>

key5_up=1;

key6_up=1;

key7_up=1;

key8_up=1;

key9_up=1;

keyA_up=1;

keyB_up=1;

keyC_up=1;

keyD_up=1;

keyX_up=1;

keyJ_up=1;

}

//第一行

Hang_00_L;//把第一行输出低电平

Hang_01_H;

Hang_02_H;

Hang_03_H;

if(key1_up&&Lie_00_V==0)

{

delayMs(jpys); //延时20秒,软件消抖

key1_up=0;

if(Lie_00_V==0) //如果第一列是低电平,说明有键被按下,如果没有直接退出if语句

{

return 1;

}

}else if(Lie_00_V==1)key1_up=1;

if(key2_up&&Lie_01_V==0)//如果第二列是低电平,

{

delayMs(jpys);//延时20秒,软件消抖

key2_up=0;

if(Lie_01_V==0)//如果第二列是低电平,说明有键被按下,如果没有直接退出if语句

{

return 2;

}

}else if(Lie_01_V==1)key2_up=1;

if(key3_up&&Lie_02_V==0)

{

delayMs(jpys);

key3_up=0;

if(Lie_02_V==0)

{

return 3;

}

}else if(Lie_02_V==1)key3_up=1;

if(keyA_up&&Lie_03_V==0)//如果第四列是低电平

{

delayMs(jpys);

keyA_up=0;

if(Lie_03_V==0)//如果第四列是低电平,说明有键被按下,如果没有直接退出if语句

{

return 10;

}

}else if(Lie_03_V==1)keyA_up=1;

//第二行

Hang_00_H;

Hang_01_L;//把第二行拉低

Hang_02_H;

Hang_03_H;

if(key4_up&&Lie_00_V==0)//如果第一列是低电平

{

delayMs(jpys);

key4_up=0;

if(Lie_00_V==0)//说明有键被按下,如果没有直接退出if语句

{

return 4;

}

}else if(Lie_00_V==1)key4_up=1;

if(key5_up&&Lie_01_V==0)

{

delayMs(jpys);

key5_up=0;

if(Lie_01_V==0)

{

return 5;

}

}else if(Lie_01_V==1)key5_up=1;

if(key6_up&&Lie_02_V==0)

{

delayMs(jpys);

key6_up=0;

if(Lie_02_V==0)

{

return 6;

}

}else if(Lie_02_V==1)key6_up=1;

if(keyB_up&&Lie_03_V==0)

{

delayMs(jpys);

keyB_up=0;

if(Lie_03_V==0)

{

return 11;

}

}else if(Lie_03_V==1)keyB_up=1;

//第三行

Hang_00_H;

Hang_01_H;

Hang_02_L;//把第三行置低

Hang_03_H;

if(key7_up&&Lie_00_V==0) //如果第一列是低电平

{

delayMs(jpys);//延时20秒

key7_up=0;

if(Lie_00_V==0)//说明有键被按下,如果没有直接退出if语句

{

return 7;

}

}else if(Lie_00_V==1)key7_up=1;

if(key8_up&&Lie_01_V==0)

{

delayMs(jpys);

key8_up=0;

if(Lie_01_V==0)

{

return 8;

}

}else if(Lie_01_V==1)key8_up=1;

if(key9_up&&Lie_02_V==0)

{

delayMs(jpys);

key9_up=0;

if(Lie_02_V==0)

{

return 9;

}

}else if(Lie_02_V==1)key9_up=1;

if(keyC_up&&Lie_03_V==0)

{

delayMs(jpys);

keyC_up=0;

if(Lie_03_V==0)

{

return 12;

}

}else if(Lie_03_V==1)keyC_up=1;

//第四行

Hang_00_H;

Hang_01_H;

Hang_02_H;

Hang_03_L;//把第四行置低

if(keyX_up&&Lie_00_V==0)//如果第一列是低电平

{

delayMs(jpys);

keyX_up=0;

if(Lie_00_V==0)//说明有键被按下,如果没有直接退出if语句

{

return 14;

}

}else if(Lie_00_V==1)keyX_up=1;

if(key0_up&&Lie_01_V==0)

{

delayMs(10);

key0_up=0;

if(Lie_01_V==0)

{

return 16;

}

}else if(Lie_01_V==1)key0_up=1;

……………………

…………限于本文篇幅 余下代码请从51黑下载附件…………

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。