当前位置:首页 > 单片机 > 单片机
[导读]矩阵键盘程序,作为麦知club小车项目的一部分,从IAR状态机应用修改而来。IAR7.4+STM32CUBEMX调试通过。键盘行4,列3,每条线都有10K上拉电阻。改到4×4矩阵也很容易。行线设置为 输入,针脚为浮空; 列线设置为开漏

矩阵键盘程序,作为麦知club小车项目的一部分,从IAR状态机应用修改而来。

IAR7.4+STM32CUBEMX调试通过。

键盘行4,列3,每条线都有10K上拉电阻。改到4×4矩阵也很容易。

行线设置为 输入,针脚为浮空; 列线设置为开漏输出。


不支持长按和组合键,主要是我不会改。

在OS中使用20ms任务周期调用。


以下贴出代码。

keypad.h


/*

*

*Name:keypad.h

*/

#ifndefKEYPAD_H

#defineKEYPAD_H

#include"stm32f1xx_hal.h"

#include"pinname.h"

#definePORT_KEYGPIOD

#defineCOLS(GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6)

//读pin

//#defineIn(GPIO_Pin)(PORT_KEY->IDR&GPIO_Pin)

#defineIn(GPIO_Pin)HAL_GPIO_ReadPin(PORT_KEY,GPIO_Pin)

//写1到Pin

//#defineHigh(GPIO_Pin)PORT_KEY->BSRR=GPIO_Pin

#defineHigh(GPIO_Pin)HAL_GPIO_WritePin(PORT_KEY,GPIO_Pin,GPIO_PIN_SET)

//写0到Pin

//#defineLow(GPIO_Pin)PORT_KEY->BSRR=(uint32_t)GPIO_Pin<<16

#defineLow(GPIO_Pin)HAL_GPIO_WritePin(PORT_KEY,GPIO_Pin,GPIO_PIN_RESET)

/*

*0123

*4567

*891011

*12131415

*/

typedefenum{

Key_Up=0x02,

Key_Left=0x03,

Key_Right=0x04,

Key_Down=0x08,

Key_On=0x09,

Key_Mode=0x0a,

Key_None=0xFF

}KeyPressed;

staticconstintrow_count=4;

staticconstintcol_count=3;

uint16_tbus_out(void);

voidKeypad(void);

charAnyKey(void);

charSameKey(void);

charScanKey(void);

voidFindKey(void);

voidClearKey(void);

voidRead(void);

/**Startthekeypadinterruptroutines*/

voidStart(void);

/**Stopthekeypadinterruptroutines*/

voidStop(void);

voidCols_out(uint16_tv);

voidScan_Keyboard(void);

KeyPressedgetKey(void);

#endif//KEYPAD_H


keypad.c


/*

*

*Name:keypad.cpp

*

*/

#include"keypad.h"

//State:

charKeyState;

//Bitpatternaftereachscan:

charKeyCode;

//Outputvaluefromthevirtual74HC922:

KeyPressedKeyValue;

//KeyDownissetifkeyisdown:

charKeyDown;

//KeyNewisseteverytimeanewkeyisdown:

charKeyNew;

//映射表

charKeyTable[12][2];

//PinofRow

uint16_t_rows[]={KEYx0,KEYx1,KEYx2,KEYx3};

uint16_t_cols[]={KEYy0,KEYy1,KEYy2};

//构造函数

voidKeypad(void)

{

Stop();

KeyState=0;//按键状态初始0

}

//扫描键盘

voidScan_Keyboard(void){

switch(KeyState){

case0:{

if(AnyKey()){

charscankey=ScanKey();

if(scankey!=0xff)

KeyCode=scankey;

KeyState=1;

}

break;

}

case1:{

if(SameKey()){

FindKey();

KeyState=2;

}

else

KeyState=0;

break;

}

case2:{

if(SameKey()){

}

else

KeyState=3;

break;

}

case3:{

if(SameKey()){

KeyState=2;

}

else{

ClearKey();

KeyState=0;

}

break;

}

}

//funcend

}

//有键按下

charAnyKey(void){

//Start();//拉低

intr=-1;

for(r=0;r

if(In(_rows[r])==0)//Inmacro

break;

}

//Stop();//恢复

if(!(0<=r&&r

return0;

else

return1;

}

//键按下,键值相同

charSameKey(void){

//charKeyCode_new=KeyCode;

charKeyCode_new=ScanKey();

if(KeyCode==KeyCode_new)

return1;

else

return0;

}

//扫描键

charScanKey(void){

/*行扫描*/

intr=-1;

for(r=0;r

if(In(_rows[r])==0)//Inmacro

break;

}

/*若没有找到有效行,返回*/

if(!(0<=r&&r

return0xff;

}

/*列扫描,找出行上哪个被拉低*/

intc=-1;

for(c=0;c

//轮流输出列线

Cols_out(~(1<

if(In(_rows[r])==0)//Inmacro

break;

}

/*给所有的列重新充电*/

Start();

/*若没有找到有效列,返回*/

if(!(0<=c&&c

return0xff;

return r * col_count + c;

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

摘要:基于传统直角坐标机器人控制技术,以蓄电池极板连续生产线的码垛机器人为应用案例,根据设备需求、机器人控制原理和系统状态机的设计,介绍了一种通用的、灵活的、开发周期短的多轴直角坐标机器人控制方法。该机器人经过实践,验证...

关键字: 直角坐标机器人 状态机 控制系统

▼点击下方名片,关注公众号▼欢迎关注【玩转单片机与嵌入式】公众号,回复关键字获取更多免费资料。回复【加群】,限时免费进入知识共享群;回复【3D封装库】,常用元器件的3D封装库;回复【电容】,获取电容、元器件选型相关的内容...

关键字: 单片机 状态机 传感器中

在单片机裸机的编程方法中,状态机的方法是比较好的,经典的比如按键的检测判断等。其实,有很多地方可以使用这种思想,比如传感器的数据采集。因为单片机不可能一直等待着运行,那样的效率是很低的,通常都是结合fsmtimer的方式...

关键字: 单片机 状态机

关注、星标公众号,直达精彩内容来源:技术让梦想更伟大作者:ming_mei前言前些日子在微信上看到李肖遥的公众号,里面系统讲述了QP框架,我很有感触。我用QP框架很多年了,一开始是使用QM和QPC,到后来抛弃了QM,直接...

关键字: 单片机 状态机

星标「嵌入式大杂烩」,一起进步!来源:https://blog.csdn.net/qq_36969440/article/details/110387716状态机基本术语现态:是指当前所处的状态。条件:又称为“事件”,当...

关键字: 嵌入式 状态机 编程

关注、星标公众号,直达精彩内容来源:小鱼儿飞丫飞整理:技术让梦想更伟大|李肖遥前言:本框架实现的目的是在基于51单片机为控制芯片的产品内,因为51单片机的内存和堆栈比较有限,此框架比较简洁高效的。如果用于其他高性能的处理...

关键字: 状态机

来源:裸机思维作者:GorgonMeducer【说在前面的话】在前面的讲解中,我们介绍了如何使用状态图的方式来设计有限状态机、明确了状态图设计的“清晰”原则,并结合最简单和常用的switch状态机翻译模式详细说明了状态图...

关键字: 状态机

关注「嵌入式大杂烩」,选择「星标公众号」一起进步!来源:技术让梦想更伟大作者:李肖遥Blinky是自带的一个很简单的例子,也就是我们俗称的”HelloWorld!”,可以帮助我们了解QP。在这个blinky中,是以1HZ...

关键字: 状态机

来源:裸机思维作者:GorgonMeducer【说在前面的话】在前面的讲解中,我们介绍了如何使用状态图的方式来设计有限状态机、明确了状态图设计的“清晰”原则,并结合最简单和常用的switch状态机翻译模式详细说明了状态图...

关键字: 状态机

状态机的实现无非就是3个要素:状态、事件、响应。转换成具体的行为就3句话。发生了什么事?现在系统处在什么状态?在这样的状态下发生了这样的事,系统要干什么?用C语言实现状态机主要有3种方法:switch—case法、表格驱...

关键字: 状态机
关闭
关闭