TA的每日心情 | 奋斗 2023-5-10 20:09 |
---|
签到天数: 1742 天 连续签到: 1 天 [LV.Master]伴坛终老
|
在套件的随机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 |
|