该项目系列的总体目标是设计一个智能环境光监视器,它可以分析室内光线水平并执行相应的响应操作,例如控制灯调光器。在开发这个项目的过程中,我们需要一种方便的方法来表示电流和电压幅度的模数转换值。因此,我们将从编写固件开始,该固件可以将存储在变量中的普通数字转换为一系列单独的数字,然后这些数字将决定我们将哪些像素数据阵列传输到 LCD 模块。
该固件旨在显示三位数测量值,单位为毫伏、伏特、微安或毫安。如果显示的单位是伏特或毫安,位数字后的小数点将自动启用。这意味着显示接口可以处理从 0 μA 到 9.99 mA 的电流幅度和从 0 mV 到 9.99 V 的电压幅度。但是,这个范围的大部分将永远不会被使用——光传感器的输出电流为 5 mA, ADC 无法测量高于其参考电压的电压,在本设计中为 2.4 V。
端口输入输出
您可以参阅本文 以获取有关使用交叉开关和将引脚配置为输入或输出的更深入信息。如上图所示,SPI 信号被启用并路由到连接到相应 LCD 信号的引脚。SPI片选信号由固件控制,输出到P0.1,因为内置的SPI从机选择信号与LCD接口不兼容。
外设和中断
在项目的这个阶段,我们只需要两个外设:SPI 和 Timer4。SPI 配置为 3 线主机模式,时钟分频器设置为产生 875 kHz 的 SPI 时钟频率。
SPI 中断被启用是因为 SPI 传输由 SPI 中断服务例程中的状态机控制。传输每个字节后都会触发中断。Timer4 用于短延迟,例如 LCD 模块数据表中指定的设置和保持延迟。一个 Timer4 计数约为 490 ns,因此如果我们需要 6 μs 的延迟,我们将 Timer4 寄存器设置为零并等待计数达到 12。
固件
该项目的固件可分为三个主要部分:LCD 通信接口、将存储在变量中的数字转换为一系列单独数字的函数以及更新 LCD 像素数据阵列的例程。
液晶界面
我们使用多行更新模式与 LCD 通信,如前一篇文章所述。当微控制器启动时,它将 LCD 清除为所有白色像素。随后通过将 128 位像素数据写入一个或多个行地址来更新 LCD。所有 LCD 更新均由“LCDControl.c”源文件中的 UpdateLCD() 函数启动,数据传输过程在 SPI 中断服务程序中继续进行。该项目中的 LCD 通信接口包括对我们在之前文章中使用的内容的一项改进:每次调用 UpdateLCD() 都可以通过将适当的行和一行地址放入 LCDLineStart 和 LCDLineStop 变量来指定要更新显示的 哪一部分 。
将数字转换为数字
重要的是要理解存储在变量中的数值与我们用来可视化数值的一系列数字根本不同。一个变量只是一个由 1 和 0 组成的序列;这个序列可以用多种方式解释——例如,解释为无符号整数、有符号整数或浮点值。然后需要进一步转换,以视觉形式表达这个解释值。将变量值转换为一系列数字或字符的标准 C 语言方法是库中包含的 printf() 函数。但尽可能避免库例程是明智的,主要是因为设计自己的代码更有趣、更有价值、更有启发性。不过,也有实际的好处。