实现的任务就是用lcd做一个菜单,用按键控制不同的led流转模式。
第一步--熟悉硬件
这个就是普通的按键连接方式,没有硬件上消抖所以,就得软件处理了。经过查阅原理图发现,按键连接的引脚是pa0,pa8,pb1,pb2。其中pa0有唤醒的功能,不知道会不会考。
第二步--软件设计
led,lcd相关的东西我在上一篇以及做了,在这里就不说了。
那么就是介绍按键输入相关。
首先就是对按键的初始化
void key_gpio_config(void){ gpio_inittypedef gpio_strue; rcc_apb2periphclockcmd(rcc_apb2periph_gpioa, enable); gpio_strue.gpio_pin = gpio_pin_0| gpio_pin_8; gpio_strue.gpio_mode = gpio_mode_ipu; gpio_strue.gpio_speed =gpio_speed_50mhz; gpio_init(gpioa, &gpio_strue); rcc_apb2periphclockcmd(rcc_apb2periph_gpiob, enable); gpio_strue.gpio_pin = gpio_pin_1| gpio_pin_2; gpio_init(gpiob, &gpio_strue);}之后就是对按键处理。
因为有抖动所以就要消抖。有的教程是延时消抖,但是延时的过程中cpu就是空闲下来了,无法对外界消息做出回应,在对时间要求较高的场和中就不太适用。既然我是要学习的,就要和实际看齐,就要想一种不太占用cpu的方法。这是定时器就出来了,我们将一大段的延时拆成一小段一小段的,这样不就减轻cpu的压力了?
在处理抖动的问题上,我们可以采用一种滤波的方式,每隔一段时间采一下值,然后判断这些值,如果这些值稳定在一个值,那么就说明按键处于按下或者弹起的状态。下面的程序就是实现这种消抖的方式
void key_scan(void){ uint8_t i; uint8_t key_buff[] ={0xff,0xff,0xff,0xff}; key_buff[0]= (key_buff[0] < < 1) | key1; key_buff[1]= (key_buff[1] < < 1) | key2; key_buff[2]= (key_buff[2] < < 1) | key3; key_buff[3]= (key_buff[3] < < 1) | key4; for(i = 0; i __/__/_ ); lcd_displaystringline(line6, (uint8_t *) / /); lcd_displaystringline(line7, (uint8_t *)________________________); lcd_displaystringline(line8, (uint8_t *)press b1 to start...);然后就是控制界面
lcd_clear(black); lcd_setbackcolor(blue); lcd_settextcolor(black); lcd_displaystringline(line0, (uint8_t *) mode selection ); lcd_setbackcolor(black); lcd_settextcolor(white); lcd_displaystringline(line2, (uint8_t *) mode1); lcd_displaystringline(line3, (uint8_t *) mode2); lcd_displaystringline(line4, (uint8_t *) mode3); lcd_displaystringline(line5, (uint8_t *) mode4); lcd_displaystringline(line7, (uint8_t *)_____________________); lcd_displaystringline(line8, (uint8_t *)runing:); lcd_displaystringline(line9, (uint8_t *)nothing.);最后就是一堆逻辑,感觉写的复杂了
int main(void){ uint8_t keyval; uint8_t mode; systick_config(systemcoreclock/1000); nvic_prioritygroupconfig(nvic_prioritygroup_2);//抢占和响应优先级的范围0~3 stm3210b_lcd_init(); led_enable_gpio_cofig(); key_gpio_config(); tim4_config(); while(1) { if(start_flag) { lcd_clear(black); while(start_flag) { count_flag = 0; led_count = 0; led_enable(); gpio_write(gpioc, 0xff00); led_disenable(); keyval = get_keyval(); if(keyval == 0xa1) { start_flag = 0; } } } else { mode = 1; while(start_flag == 0) { keyval = get_keyval(); if(keyval == 0xa3) { mode = mode + 1; if(mode > 4) { mode = 4; } } if(keyval == 0xa2) { mode = mode - 1; if(mode '); lcd_displaychar(line3, 16* 14, ' '); lcd_displaychar(line4, 16* 14, ' '); lcd_displaychar(line5, 16* 14, ' '); break; case 2: lcd_displaychar(line2, 16* 14, ' '); lcd_displaychar(line3, 16* 14, ' >'); lcd_displaychar(line4, 16* 14, ' '); lcd_displaychar(line5, 16* 14, ' '); break; case 3: lcd_displaychar(line2, 16* 14, ' '); lcd_displaychar(line3, 16* 14, ' '); lcd_displaychar(line4, 16* 14, ' >'); lcd_displaychar(line5, 16* 14, ' '); break; case 4: lcd_displaychar(line2, 16* 14, ' '); lcd_displaychar(line3, 16* 14, ' '); lcd_displaychar(line4, 16* 14, ' '); lcd_displaychar(line5, 16* 14, ' >'); break; } if(keyval == 0xa4) { count_flag = 1; lcd_clearline(line9); switch(mode) { case 1: lcd_displaystringline(line9, (uint8_t *)mode1);break; case 2: lcd_displaystringline(line9, (uint8_t *)mode2);break; case 3: lcd_displaystringline(line9, (uint8_t *)mode3);break; case 4: lcd_displaystringline(line9, (uint8_t *)mode4);break; } } if(keyval == 0xa1) { start_flag = 1; } while(count_flag) { led_enable(); gpio_write(gpioc, led_buff[mode-1][led_count]); keyval = get_keyval(); if(keyval == 0xa4) { count_flag = 0; gpio_write(gpioc, 0xff00); led_disenable(); lcd_clearline(line9); lcd_displaystringline(line9, (uint8_t *)nothing.); } if(keyval == 0xa1) { start_flag = 1; count_flag = 0; gpio_write(gpioc, 0xff00); led_disenable(); } } } } }}
端到端自动驾驶到底是什么?
可穿戴创业:以色列的孵化器为何如此给力?
MR-16 LED驱动器和用于脉冲LED冷却器供电的5V辅助
适合中小型企业的智能网关都有哪些
诺基亚确认与蔡司终止合作 不再使用ZEISS镜头
如何用按键控制不同的LED流转模式?
针式打印机的兼容操作系统
云计算的思维转换 无服务器的优势
直流电机调速的多种技术,直流串联和并联电机的速度控制方法
格力15%股权转让 乐视网退市暂无时间表
PCB设计完成后,为什么经常要拼版及拼版注意事项
央企华润集团旗下的微电子企业华润微产业布局再度领先
频程及滤波器的Q值计算
RLC子层的概述模型
知道这4条,升级iOS10.3才安心
SK海力士开发出业界最快的服务器内存模组MCR DIMM
生物医用材料市场概况及其在3D打印中的应用
英飞凌REAL3 ToF传感器的背后技术揭秘
财政部:传感器等十余类仪器继续不加征关税
电动机的工作原理是什么 电动机的短路试验电压是多少