查看: 1191|回复: 0

Vishay VEML6040 环境颜色检测开发套件测评(3)

[复制链接]
  • TA的每日心情
    奋斗
    2023-5-10 20:09
  • 签到天数: 1742 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2017-3-21 13:16:59 | 显示全部楼层 |阅读模式
    分享到:
    在套件的随机U盘中为我们提供了详细的功能源代码,为了便于进行二次开发,我们就来看看源代码的设计思想及实现手段。为了便于理解,将个人的理解直接以注释的方式加在源代码上。
    int main(void)      //  主函数{        uint16_t txSize;//发送字节数        uint16_t rxSize;//接收字节数        uint8_t  LSB,MSB,i;        uint16_t last_Data;//重新检测数据        uint32_t sum_data,avr_data,delay_time=100;        uint8_t times=30;//平均样本数        /* Generic Initialization */        SystemCoreClockUpdate();        Board_Init();   //套件初始化        /* Setup I2C pin muxing */        Init_I2C_PinMux();//初始化I2C引脚        /* Allocate I2C handle, setup I2C rate, and initialize I2C clocking */        setupI2CMaster();//将I2C设为主模式        /* Disable the interrupt for the I2C */        NVIC_DisableIRQ(I2C_IRQn);//禁止I2C中断        set_lcmGPIO();//设置LCM液晶屏GPIO定义        LcmInit();     //LCM液晶屏初始化        PUTImage(LOGO);//显示LOGO图标        delay_Long(60000);//延时        LcmClear();//清屏        Welcome_on();//显示欢迎界面        delay_Long(60000);//延时        LcmClear();//清屏        RGB_data();//设置检测数据显示格式        txSize = 2;//发送字节设为2        rxSize = 0;//接收字节设为0        txData[0]=0x00;        txData[1]=0x10;//设置发送的指令        SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);        delay(delay_time);//延时        last_Data=0;        txSize = 1;//设发送字节数        rxSize = 2;//设接收字节数        while(1) {            //进入循环检测状态                sum_data=0;                 txData[0]=0x08;//读取红色R的检测值                 for (i=0; i<times; i++)//检测30次以获得平均值                {                        SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);                        delay(delay_time);                        LSB = rxData[0];//获取低字节                        MSB = rxData[1];//获取高字节                        last_Data = ((MSB << 8) + LSB);//拼接成一个字                        sum_data += last_Data;//求累加                }                avr_data = sum_data/times;//获得平均值                 PUTchar8x16(4,3,"     ",0);//清除原显示内容                PUTNum( 4, 3,avr_data, 0);//输出检测平均值                //后面依次为检测绿色、蓝色及白色的结果,处理方法基本一样,就不再进行过多的注释。                txData[0]=0x09;  //读取绿色G的检测值                sum_data=0;                for (i=0; i<times; i++)                {                        SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);                        delay(delay_time);                        LSB = rxData[0];                        MSB = rxData[1];                        last_Data = ((MSB << 8) + LSB);                        sum_data += last_Data;                }                avr_data = sum_data/times;                 PUTchar8x16(4,11,"     ",0);                PUTNum( 4, 11,avr_data, 0);                 txData[0]=0x0A;//读取蓝色B的检测值                sum_data=0;                for (i=0; i<times; i++)                {                        SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);                         delay(delay_time);                        LSB = rxData[0];                        MSB = rxData[1];                        last_Data = ((MSB << 8) + LSB);                        sum_data += last_Data;                }                avr_data = sum_data/times;                PUTchar8x16(6,3,"     ",0);                PUTNum( 6, 3,avr_data, 0);                txData[0]=0x0B;//读取白色W的检测值                sum_data=0;                for (i=0; i<times; i++)                {                        SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);                        delay(delay_time);                        LSB = rxData[0];                        MSB = rxData[1];                        last_Data = ((MSB << 8) + LSB);                        sum_data += last_Data;                }                avr_data = sum_data/times;                 PUTchar8x16(6,11,"     ",0);                PUTNum( 6, 11,avr_data, 0);                delay_Long2(20000);        }}综上可知,该程序的实现方法是:
    1)实现进行全局的初始化;
    2)对VEML6040进行相关设置;
    3)对LCM_12864进行初始化;
    4)以轮询方式依次对红、绿、蓝、白色环境光进行检测并显示
    其中用到的关键函数为:
    SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);
    这里的I2C_ADDR_7BIT是VEML6040的从地址为0x10,txData为指令字,txSize为指令长度,rxData为检测结果的存储首地址,rxSize为检测结果的长度。
    通过查询手册可知,检测红、绿、蓝、白色环境光的指令字分别为08H~0BH,我们在程序中可得到验证。

    此外,为了输出检测结果还主要用到了2个显示函数,分别是字符串显示函数PUTchar8x16(),主要用于清除原显示内容;数值显示函数PUTNum( ),用于显示检测结果。
       作为字符和数字显示的字模,则是存放在Eng.h中,其存储结构如下:
    const unsigned char ENGLISH[]={
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",32*/
    0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,/*"!",33*
    /0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*""",34*/
    0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,/*"#",35*/
    0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,/*"$",36*/
    。。。
    }
         显示LOGO的数据存放在logo.h中,存储结构为:
    const unsigned char LOGO[]={
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    。。。
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    }
    以此为基础,后面再讨论如何在套件上实现中文显示功能等。
    相关阅读:https://jingyan.eeboard.com/search/article?key=Vishay
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-20 19:35 , Processed in 0.113969 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.