本帖最后由 jinglixixi 于 2017-3-21 10:46 编辑
在套件的随机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;//设接收字节数
- /* Enter the task loop */
- while(1) { //进入循环检测状态
- sum_data=0;
- txData[0]=0x08;//读取红色R的检测值
- for (i=0; 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,3," ",0);//清除原显示内容
- PUTNum( 4, 3,avr_data, 0);//输出检测平均值
- //后面依次为检测绿色、蓝色及白色的结果,处理方法基本一样,就不再进行过多的注释。
- txData[0]=0x09; //读取绿色G的检测值
- sum_data=0;
- for (i=0; 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
- {
- 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
- {
- 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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
以此为基础,后面再讨论如何在套件上实现中文显示功能等。
|