口算数学宝DIY方案验证
最近逛抖音时无意中看到居然还有这么个有意思的东西,号称可以培养孩子口算能力,随身携带小巧方便.
感觉还可以,一看价格嘛......恩....还是算了,现在只要和儿童教育沾点边儿的东西,全都有些贵的离谱.作为资深的业余DIY爱好者,自己手动做一个应该也不难,说干就干!!
1.首先找一块自己熟悉的开发板,STM32,AVR,ESP8266,C51都可以,只要自己熟悉的就行,我这里就是用自己做的STM32G070核心板来验证.
2.显示部分可以使用LCD,灰度屏,墨水屏,点阵屏都可以,手头儿上有什么就用什么,我这里使用的是一块COG的点阵屏,分辨率128x64.
这块屏也是使用SPI接口,基本和LCD引脚一样,所以以后如果要更换屏幕,直接改驱动就好了. 目前这块屏是ST7567,移植的U8G2进行驱动.
3.按键部分用的4x4矩阵按键模块,矩阵键盘又称行列式键盘,它是使用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线与列线的交叉处放置一个按键。
这个模块算是比较常见的吧,原理图如下:
矩阵按键有2种检测方式,这里使用的是逐行逐列扫描法,代码稍微简单一些.
4.硬件都准备好了,因为我这里用的是STM32的板子,所以直接在CubeMX中配置好用到的IO功能.如图:
5.将屏幕和按键模块按照IO定义分别连接好,大概就是这么一陀东西吧:
6.准备开撸.....
6.0 移植u8g2
目前u8g2还不能直接兼容stm32,所以需要手工进行修改,主要是初始化以及spi发送部分.另外还要删去其它没用到的驱动,不然容量太大,根本放不下.
需要注意的是,根据刷屏方式的不同要修改不同的接口,我这里就简单的使用了全屏刷新的方式,这个方式会比较费一点内存,但是控制起来简单.
6.1先定义u8g2对象
U8G2_ST7567_ENH_DG128064I_F_4W_HW_SPI u8g2(U8G2_R2, /* cs=*/ GPIO_PIN_4, /* dc=*/ GPIO_PIN_1, /* reset=*/ GPIO_PIN_6);
其中那几个引脚的参数不重要,因为后面是使用的自定义接口,在接口里会控制io.
6.2按键读取:
uint16_t read_gpio_data()
{
uint16_t temp=((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)<<7)|
(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)<<6)|
(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)<<5)|
(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_10)<<4)|
(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_11)<<3)|
(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12)<<2)|
(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_13)<<1)|
(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14)));
return temp;
}
这里之所以搞这么麻烦是因为我没有按顺序使用连续IO,不然直接操作ODR,IDR什么就行了.
这里就是根据输入输出管脚状态拼装成1个8bit的字节数据,用来给后面的接口判断具体某个按键的状态.
6.3 算式的简单生成.
val=0;
a=rand()%10;
b=rand()%10;
f=rand()%3;
if(f==1&&a<b){int aa=b;b=a;a=aa;}
if((f==3||f==2)&&b==0){b=1;}
sprintf(_buff,"%d %c %d =",a,_op[f],b);
switch(f){
case 0:val=a+b;break;
case 1:val=a-b;break;
case 2:val=a*b;break;
case 3:val=a/b;break;
}
大概意思是随机生成2个10以内的数字,再随机生成一个 加\减\乘\除 运算符,最后拼接成字符串,同时计算一下结果用于和最后输入的结果对比. 这里只是简单验证方案,所以就大概的写一写,不考虑太多各种特殊情况.
7.运行效果:
8.方案基本完成,附件有完整工程参考.
全部评论