初步上手的地方我不过多赘述,因为其他项目提供的教程非常详细,我主要提供对于该代码尤其是编码器判断顺时针逆时针的方式的思路,解释。
事先说明一下,我这个示波器目前可以做到不够完美的输出到屏幕上动态的波(通过ADC采集的数据),并可以通过编码器和按键对波的位置,波的幅度进行调整
首先是初始化部分,注意这里使用的st7789以及字体需要使用漂移菌大佬写的库(可以在旁边高昂学长的项目附件中找到,也可以在github上搜索yoyojacky),否则是不能成功运行我的代码的。初始化首先就是初始化LCD屏幕,当然也要初始化使得LCD屏幕能够使用的SPI,其对应的引脚无论是代码还是电路图都是非常清晰的。然后就是要对关于开关的五个引脚进行初始化,key,key1,key2分别对应按下编码器和编码器右侧两个按键的检测。最后就是为读取mic(注意,麦克风想要读取必须把跳帽放在三个连续引脚的上面两个,单纯看电路图容易产生误解)做准备和为了主函数而初始化的一些值,这些值具体解释可以看图片上的备注本身
然后是四个中断服务函数,它们触发的条件分别与编码器的左右旋转、编码器是否按下、按键1和按键2有关。
以编码器的旋转这个终端服务函数为例,首先这个中断服务函数的下一行是对其的声明,其触发的条件是,keyleft引脚的电平出现下降或者上升(其他的条件也写的这个,虽然都能实现任务但应该有更好的条件可以使用,比如”低电平时“这个条件应该更适合与普通的按下的按钮的检测,但是我水平不足,没有找到适合pico的库中有这种条件)。然后看中断服务函数本身,首先进去先关闭自己这个中断,保证在自己的中断运行过程中不会再因为触发条件而再次进入自己这个中断导致实现效果不如人意。
然后就是该中断服务函数的主干部分,其原理是,当我们转动编码器的时候,我们的GPIO4和GPIO5引脚会不断的由低电平变成高电平再由高电平变成低电平,但是两者变化是不同步的,每次电平变化的中间,会有短暂的一个引脚先变,一个引脚后变的过程,两者的先后又会因为逆时针和顺时针转动的不同而产生差异,这就是我们判断转动是逆时针还是顺时针的基础!在判断出之后,我们对负责处理数据的关键参数mo进行处理,并根据mo的不同判断当前是什么放大的级别,同时变动dif使得变化级别后波的水平线保持一致。当然,要记得fill黑屏保证显示不会出错,以及加上延时保证该函数不会一次性过多的触发,过分敏感,结束了之后也要重新打开我们的中断,保证下一次还能够进入。
其他的三个中断服务函数就是分别控制着是否锁定显示便于观察者观看,对波的中心线进行调整,实现原理都很容易理解,不再过多解释。
然后是主函数部分,首先是判断当前是否屏幕锁定,锁定了就不对输出进行处理,如果没锁定,就先通过ADC采集我们要输出的数据,然后根据mo进行处理,使其能够处于一个合适的数据范围之内。在边界处理之后,我们先把数组上一次该横坐标与相应纵坐标交汇的的点去掉(即涂上背景颜色——黑色),然后再对当前的相应的交汇的点输出上,然后横轴加一,再进行下一次的输出,当然检测到横坐标大于屏幕显示了就给它恢复初始值。
遗憾与不足:因为我没有研究出来如何调整ADC或者使用DMA等方式增快屏幕刷新的速度,使得如果密集输出会导致卡顿的问题,避免卡顿输出的点比较稀疏。打算换一种编程语言,通过C/C++来对pico进行使用,进而达到需要的效果