![6e74f7ad17c85f53d09374974d6e9581.png](https://i-blog.csdnimg.cn/blog_migrate/789ca56c007cc01f2d6f79ba584b7587.jpeg)
来源:百问网_嵌入式Linux wiki_jz2440 新1期视频维基教程 (视频文字版)
作者:韦东山
本文字数:1533,阅读时长:2分钟
这节我们在OLED显示ADC电压值,通过调节可调电阻,让ADC的值在屏幕上不断变化。
在JZ2440的主光盘的hardware里面有一个adc_ts触摸屏的程序,把里面的adc_ts.c和adc_ts.h提取出来放在本节视频待写的代码里面。
主函数调用的是Test_Adc.c进行测试adc,因此在里面加上打印和OLED显示函数。
/* * 测试ADC * 通过A/D转换,测量可变电阻器的电压值 */ void Test_Adc(void){ float vol0, vol1; int t0, t1; char buf[100]; printf("Measuring the voltage of AIN0 and AIN1, press any key to exit"); while (!awaitkey(0)) // 串口无输入,则不断测试 { vol0 = ((float)ReadAdc(0)*3.3)/1024.0; // 计算电压值 vol1 = ((float)ReadAdc(1)*3.3)/1024.0; // 计算电压值 t0 = (vol0 - (int)vol0) * 1000; // 计算小数部分, 本代码中的printf无法打印浮点数 t1 = (vol1 - (int)vol1) * 1000; // 计算小数部分, 本代码中的printf无法打印浮点数 printf("AIN0 = %d.%-3dV AIN1 = %d.%-3dV", (int)vol0, t0, (int)vol1, t1); sprintf(buf,"ADC: %d.%-3d, %d.%-3d", (int)vol0, t0, (int)vol1, t1); OLEDPrint(6, 0, buf); } printf("");}
这里调用了一个awaitkey()函数,需要再复制adc_ts触摸屏的程序里serial.c的该函数到本工程里面。
/* * 接收字符,若有数据直接返回,否则等待规定的时间 * 输入参数: * timeout: 等待的最大循环次数,0表示不等待 * 返回值: * 0 : 无数据,超时退出 * 其他值:串口接收到的数据 */unsigned char awaitkey(unsigned long timeout){while (!(UTRSTAT0 & RXD0READY)) { if (timeout > 0) timeout--; else return 0; // 超时,返回0} return URXH0; // 返回接收到的串口数据}
修改Makefile,加入adc_ts.o,编译,报错,涉及除法操作,需要加入数学库:
LDFLASG := -L $(shell dirname $(CC) $(CFLAGS) -print-libgcc-file-name) -lgcc
现在重新编译即可通过。
现在将IIC的的结果也在OLED上显示出来,在主函数添加如下代码:
i2c_init(); at24cxx_write(0, 0x55); data = at24cxx_read(0); OLEDClearPage(2); OLEDClearPage(3); if (data == 0x55) OLEDPrint(2,0,"I2C OK!"); else OLEDPrint(2,0,"I2C Err!");
先初始化iic,在0地址写入0x55,然后再读取出来,判断是否与写入的一样,一样则打印OK,否则打印Err。
为了防止OLED出现之前显示的数据残留,需要再写一个清除Page的函数:
void OLEDClearPage(int page){ int i; OLEDSetPos(page, 0); for (i = 0; i < 128; i++) OLEDWriteDat(0); }
「新品首发」STM32MP157开发板火爆预售!首批仅300套