完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
简单理解
上拉输入:即在悬空状态下,将输入信号,上拉成高电平 下拉输入:即在悬空状态下,将输入信号,下拉成低电平 将PB 3,4,6,7设置为,输出, 将PB 9,10,11,12设置为上拉输入 因为stm32的io口改输出,输入模式比较麻烦,所以,选择一行一行读取的方法 STM32CubeMX配置如下: 设置定时器 time2 每0.1秒进入一次中断 串口输出 其他时钟,debug等配置,按平常一样配置 重定向 #include #define USER_MAIN_PRINTF #ifdef USER_MAIN_PRINTF #define USE_MAIN_INFO(format,...) printf("t[main info] "format "rn",##__VA_ARGS__) #define USE_MAIN_DEBUG(format,...) printf("t[main debug]"format"rn",##__VA_ARGS__) #define USE_MAIN_ERROR(format,...) printf("t[main error]"format"rn",##__VA_ARGS__) #define _DEBUG_ printf("testrn"); #else #define USE_MAIN_INFO(format,...) #define USE_MAIN_DEBUG(format,...) #define USE_MAIN_ERROR(format,...) #define _DEBUG_ #endif 设置扫描函数 int rowread(void) { if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_11)==GPIO_PIN_RESET) return 1; if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_10)==GPIO_PIN_RESET) return 2; if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)==GPIO_PIN_RESET) return 4; if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12)==GPIO_PIN_RESET) return 3; return 0; } 设置读取函数 while()循环为消抖 void columnread(void) { int column_flag=0 ; HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET); if((column_flag=rowread())!=0){ while(rowread()!=0); USE_MAIN_INFO("按下第%d个数字",column_flag); } HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); if((column_flag=rowread())!=0){ while(rowread()!=0); USE_MAIN_INFO("按下第%d个数字",column_flag+4); } HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET); if((column_flag=rowread())!=0){ while(rowread()!=0); USE_MAIN_INFO("按下第%d个数字",column_flag+8); } HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET); if((column_flag=rowread())!=0){ while(rowread()!=0); USE_MAIN_INFO("按下第%d个数字",column_flag+12); } HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET); } 在中断函数中调用读取函数 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance==TIM2) { columnread(); } } 别忘了在 主函数 main()中的while()循环前调用,定时器启动函数` HAL_TIM_Base_Start_IT(&htim2); |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1364 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1359 浏览 1 评论
780 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
562 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1394 浏览 2 评论
1758浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
484浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
420浏览 3评论
414浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
389浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-29 03:06 , Processed in 1.354514 second(s), Total 47, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号