大学生
最后登录1970-1-1
在线时间 小时
注册时间2014-7-24
|
本来是打算用火哥的F103板子,做实验的,结果jlink找不到了,所以就用了NUCLEO-F401的板子。使用有些状态机来实现,按键去抖动程序,用visio把UML图画出来。
效果是:按下按键,LED翻转一次。
然后根据这个图,编写按键检测程序:
- #define KEY_STATE_RELEASE 0 // 按键未按下
- #define KEY_STATE_WAITING 1 // 等待(消抖)
- #define KEY_STATE_PRESSED 2 // 按键按下(等待释放)
- #define readKey() HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)
- //等待时间,可以修改
- #define DURIATION_TIME 40
- /* 按键检测函数的返回值,按下为 1,未按下为 0 */
- #define PRESSED 1
- #define NOT_PRESSED 0
-
- #define KEY_PRESSED 0 //代表按下
- #define KEY_NOT_PRESSED 1 //代表未按下
- static int i = 0;
- uint8_t keyState = KEY_STATE_RELEASE;
- uint8_t keyDetect(void){
- switch(keyState){
- case KEY_STATE_RELEASE:
- if(readKey() == KEY_PRESSED){ //=1代表按键按下
- keyState = KEY_STATE_WAITING;
- }
- return NOT_PRESSED;
- break;
- case KEY_STATE_WAITING:
- if(readKey() == KEY_PRESSED){
- i++;
- if(i >= DURIATION_TIME){
- i = 0;
- keyState = KEY_STATE_PRESSED;
- return PRESSED;
- }else{
- keyState = KEY_STATE_WAITING;
- return NOT_PRESSED;
- }
- } else{
- i = 0;
- keyState = KEY_STATE_RELEASE;
- return NOT_PRESSED;
- }
- break;
- case KEY_STATE_PRESSED:
- if(readKey() == KEY_NOT_PRESSED){
- keyState = KEY_STATE_RELEASE;
- return NOT_PRESSED;
- }
- break;
- default:
- keyState = KEY_STATE_RELEASE;
- return NOT_PRESSED;
- break;
- }
- }
复制代码 我是利用cube直接生成一个工程的,这个工程很久前(14年的)生成的(懒重新在去生成),用的是HAL库,主函数代码如下
- int main(void)
- {
- HAL_Init();
- SystemClock_Config();
- HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
- HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
- MX_GPIO_Init();
- KEY_Init();
- HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
- while (1)
- {
- if( keyDetect() == PRESSED){
- HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
- }
-
- }
-
- return 0;
- }
复制代码 LED配置和KEY配置
- GPIO_InitTypeDef GPIO_InitStruct;
- /* GPIO Ports Clock Enable */
- __GPIOA_CLK_ENABLE();
- /*Configure GPIO pin : PA5 */
- GPIO_InitStruct.Pin = GPIO_PIN_5;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
-
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
复制代码- GPIO_InitTypeDef GPIO_InitStruct;
- /* GPIO Ports Clock Enable */
- __GPIOC_CLK_ENABLE();
- /*Configure GPIO pin : PC13 */
- GPIO_InitStruct.Pin = GPIO_PIN_13;
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
-
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
复制代码 装完逼了,跑了,不要打我0.0
***************************************补充****************************
有些资料超过10m了,传不上来。。
***************************************补充****************************
我也是初学者。。嘿嘿
链接: http://pan.baidu.com/s/1bXXuX4 密码: ecpa
slaa402a.pdf
(139.37 KB, 下载次数: 123)
用状态机原理进行软件设计.pdf.pdf
(267.81 KB, 下载次数: 242)
UML状态机C设计.pdf
(4.49 MB, 下载次数: 156)
|
-
|