esp32 在菜单里显示mlx90614温度显示,由于两个库函数都是使用一根总线 编译时发生冲突,温度传感器只能利用模拟iic

main.cpp 函数

/**
 * 基于FreeRTOS,可以多个任务并行处理.
 * ESP32有两个Tenants Xtensa LX6 微处理器
 * 用arduino进行编程时中使用第一个核心,第0核心没有使用
 * 多线程可以指定在那个核心运行
 */


/*****************************************************************************************8 */
#include <Arduino.h>
#include "u8g2menu.h"
#include <mlx90614.h>
/******************************************************************************* */
#define USE_MULTCORE 0   //定义利用那个核心 0选择用ESP32第0个核心 1不选择核心
//任务1
void xTaskOne(void *xTask1)
{
    while(1)
    {
       // Serial.printf("//任务1task1\r\n");
        delay(1000);
    }
}

//任务2
void xTaskTwo(void *xTask2)
{
    while(1)
    {
        Serial.printf("//任务1task2\r\n");
       
        delay(2000);
    }
}

//任务3
void xTaskThree(void *xTask3)
{
    while(1)
    {
       // mlx90614_config();
       // Serial.printf("//任务1task3\r\n");
        delay(3000);
    }
}
/******************************************************************************* */
//函数初始化
void setup() {
    Serial.begin(9600);
    delay(10);
    U8g2_init();
    delay(10);
    mlx90614_init();
//FreeRTOS
#if !USE_MULTCORE
    xTaskCreate(  
            xTaskOne,        // 任务函数  
            "TaskOne",       // 任务名称  
            4096,            // 堆栈大小(以字为单位)  
            NULL,            // 传递给任务的参数  
            1,               // 任务的优先级  
            NULL) ;    // 指向任务句柄的指针  
        
    xTaskCreate(
        xTaskTwo,
        "TaskTwo",
        4096,  //分配内存大小
        NULL,
        2,    //优先级
        NULL);
    xTaskCreate(
        xTaskThree,  //任务名称
        "TaskThree",
        4096,    //分配内存大小
        NULL,
        3,     //优先级
        NULL);
#else 
    //最后一个参数决定在那个核心运行
    xTaskCreatePinnedToCore(xTaskOne,"TaskOne", 4096,NULL,1,NULL,0);
    xTaskCreatePinnedToCore(xTaskTwo,"TaskTwo", 4096,NULL,2,NULL,1);
    xTaskCreatePinnedToCore(xTaskThree,"TaskThree", 4096,NULL,3,NULL,0);
#endif
 KYE_init(); //按键初始化

}

//主函数运行
void loop() {
 int value=0;
while(1)
{

u8g2_menu_config();
      
}

}

u8g2.cpp文件

#include "u8g2menu.h"
#include <Arduino.h>
#include <mlx90614.h>
#include <U8g2lib.h>
 //配置IIC引脚 与SPI引脚
#define scl 22  //时钟引脚IIC  SPI
#define sda 21  //数据引脚IIC  SPI
#define cs  0   //片选引脚     SPI
#define dc  0   //发送命令引脚     SPI
#define reset  0   //重置引脚     SPI
/*
#define U8g2_MULTCORE
 0.软件I2c  一次刷新为500ms
 1.硬件I2c  一次刷新为22ms
 2.软件SPI  一次刷新为40ms
 3.硬件SPI  一次刷新为5ms
*/
    /*
    旋转方式
    U8G2_R0:不旋转    U8G2_R1:顺时针旋转90度
    U8G2_R1:顺时针旋转180度
    U8G2_R3:顺时针旋转270度
    U8G2_MIRROR:镜像显示但不旋转
    u8g2.setBusClock(200000);//设置时钟频率注意频率
    */
#define U8g2_MULTCORE 1
    #if U8g2_MULTCORE == 0   //软件I2c  一次刷新为500ms 
        U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0,scl,sda,U8X8_PIN_NONE);
    #elif U8g2_MULTCORE == 1 //硬件I2c  一次刷新为22ms
        U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0,scl,sda,U8X8_PIN_NONE);
    #elif U8g2_MULTCORE == 2 //软件SPI  一次刷新为40ms
        U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0,scl,sda,cs,dc,reset);
    #elif U8g2_MULTCORE == 3 //硬件SPI  一次刷新为4ms  要设置时钟为9M
        U8G2_SSD1306_128X64_NONAME_F_4W_HW_SPI u8g2(U8G2_R0,cs,dc,reset);   
    #endif
//u8g2初始化
void U8g2_init()
{   


     u8g2.setBusClock(200000);//设置时钟频率

     //屏幕初始化
     u8g2.begin();
     // 开启中文字符集支持
     u8g2.enableUTF8Print();
     //关闭中文字符集
     //u8g2.disableUTF8Print();
     //设置屏幕亮度
     u8g2.setContrast(200);
     /*设置字体 字号12,13,14,15,16
     u8g2_font_wqy12_t_gb2312  
     u8g2_font_wqy12_t_gb2312a
     u8g2_font_wqy12_t_gb2312b
     u8g2_font_wqy12_t_chinese1
     u8g2_font_wqy12_t_chinese2
     u8g2_font_wqy12_t_chinese3
     */
    u8g2.setFont(u8g2_font_wqy12_t_gb2312);
    //打印时钟频率
    Serial.println(u8g2.getBusClock());
}

/********************************************************************************************8 */
//菜单输入按键初始化
#define key_OK_pin 27
#define key_UP_pin 4
#define key_DOWN_pin 15
#define key_OK digitalRead(key_OK_pin)  //引脚宏定义
#define key_UP digitalRead(key_UP_pin)  //引脚宏定义
#define key_DOWN digitalRead(key_DOWN_pin)  //引脚宏定义
void KYE_init()
{   
        //INPUT_PULLUP 上拉模式  INPUT_PULLDOWN 下拉模式
    pinMode(key_OK_pin, INPUT_PULLUP);
    pinMode(key_UP_pin, INPUT_PULLUP);
    pinMode(key_DOWN_pin, INPUT_PULLUP);
}
//设置显示1  64*64的图案
PROGMEM const uint8_t menu_one_1[] ={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
0x3F,0x00,0x00,0xE0,0x07,0x00,0x00,0xFE,0x3F,0x00,0x00,0xE0,0x07,0x00,0x00,0xFE,
0x3F,0x00,0x80,0xE1,0x87,0x00,0x00,0xFE,0x3F,0x00,0xC0,0xE3,0xE7,0x01,0x00,0xFE,
0x3F,0x00,0xE0,0xFF,0xFF,0x03,0x00,0xFE,0x3F,0x00,0xF0,0xFF,0xFF,0x07,0x00,0xFE,
0x3F,0x00,0xF0,0xFF,0xFF,0x07,0x00,0xFE,0x3F,0x00,0xE0,0xFF,0xFF,0x07,0x00,0xFE,
0x3F,0x00,0xC0,0xFF,0xFF,0x03,0x00,0xFE,0x3F,0x00,0xC0,0xFF,0xFF,0x03,0x00,0xFE,
0x3F,0x00,0xC0,0x1F,0xFC,0x03,0x00,0xFE,0x3F,0x00,0xFC,0x0F,0xF8,0x3F,0x00,0xFE,
0x3F,0x00,0xFC,0x07,0xF0,0x3F,0x00,0xFE,0x3F,0x00,0xFC,0x07,0xF0,0x3F,0x00,0xFE,
0x3F,0x00,0xFC,0x07,0xF0,0x3F,0x00,0xFE,0x3F,0x00,0xFC,0x0F,0xF8,0x3F,0x00,0xFE,
0x3F,0x00,0xFC,0x0F,0xF8,0x3F,0x00,0xFE,0x3F,0x00,0xC0,0x1F,0xFC,0x03,0x00,0xFE,
0x3F,0x00,0xC0,0xFF,0xFF,0x03,0x00,0xFE,0x3F,0x00,0xE0,0xFF,0xFF,0x03,0x00,0xFE,
0x3F,0x00,0xF0,0xFF,0xFF,0x07,0x00,0xFE,0x3F,0x00,0xF0,0xFF,0xFF,0x0F,0x00,0xFE,
0x3F,0x00,0xE0,0xFF,0xFF,0x07,0x00,0xFE,0x3F,0x00,0xE0,0xFF,0xFF,0x07,0x00,0xFE,
0x3F,0x00,0x80,0xE3,0xC7,0x03,0x00,0xFE,0x3F,0x00,0x00,0xE1,0x87,0x00,0x00,0xFE,
0x3F,0x00,0x00,0xE0,0x07,0x00,0x00,0xFE,0x3F,0x00,0x00,0xE0,0x07,0x00,0x00,0xFE,
0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
0xFF,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
};
//设置显示2  59*60的图案
PROGMEM const uint8_t menu_one_2[] ={
 0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x00,
0x00,0x00,0xFE,0xFF,0xFF,0x01,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0x07,0x00,0x00,
0x00,0xC0,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0x3F,0x00,0x00,
0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFC,0xFF,0xFF,0xFF,0xFF,0x01,0x00,
0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,
0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,
0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0xE0,0xFF,0xFF,0x03,0xFF,0xFF,0x3F,0x00,
0xF0,0xFF,0xFF,0x00,0xFC,0xFF,0x7F,0x00,0xF8,0xFF,0xFF,0x00,0xF8,0xFF,0x7F,0x00,
0xF8,0xFF,0x3F,0x00,0xF0,0xFF,0xFF,0x00,0xFC,0xFF,0x3F,0x00,0xF0,0xFF,0xFF,0x00,
0xFC,0xFF,0x3F,0x00,0xE0,0xFF,0xFF,0x00,0xFE,0xFF,0x1F,0x00,0xE0,0xFF,0xFF,0x01,
0xFE,0xFF,0x1F,0x00,0xE0,0xFF,0xFF,0x01,0xFE,0xFF,0x1F,0x00,0xE0,0xFF,0xFF,0x03,
0xFE,0xFF,0x1F,0x00,0xE0,0xFF,0xFF,0x03,0xFF,0xFF,0x1F,0x00,0xE0,0xFF,0xFF,0x03,
0xFF,0xFF,0x1F,0x00,0xE0,0xFF,0xFF,0x07,0xFF,0xFF,0x3F,0x00,0xE0,0xFF,0xFF,0x07,
0xFF,0xFF,0x3F,0x00,0xF0,0xFF,0xFF,0x07,0xFF,0xFF,0x7F,0x00,0xF0,0xFF,0xFF,0x07,
0xFF,0xFF,0xFF,0x00,0xF8,0xFF,0xFF,0x07,0xFF,0xFF,0xFF,0x01,0xFE,0xFF,0xFF,0x07,
0xFF,0xFF,0xFF,0x87,0xFF,0xFF,0xFF,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,
0xFF,0xFF,0x0F,0xFF,0x87,0xFF,0xFF,0x07,0xFF,0xFF,0x03,0x30,0x00,0xFF,0xFF,0x07,
0xFF,0xFF,0x01,0x00,0x00,0xFC,0xFF,0x07,0xFF,0xFF,0x00,0x00,0x00,0xF8,0xFF,0x03,
0xFE,0x7F,0x00,0x00,0x00,0xF8,0xFF,0x03,0xFE,0x3F,0x00,0x00,0x00,0xF0,0xFF,0x03,
0xFE,0x3F,0x00,0x00,0x00,0xF0,0xFF,0x01,0xFE,0x3F,0x00,0x00,0x00,0xE0,0xFF,0x01,
0xFE,0x3F,0x00,0x00,0x00,0xE0,0xFF,0x01,0xFC,0x3F,0x00,0x00,0x00,0xE0,0xFF,0x00,
0xFC,0x3F,0x00,0x00,0x00,0xE0,0xFF,0x00,0xF8,0x3F,0x00,0x00,0x00,0xE0,0x7F,0x00,
0xF0,0x3F,0x00,0x00,0x00,0xE0,0x7F,0x00,0xF0,0x3F,0x00,0x00,0x00,0xF0,0x3F,0x00,
0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,
0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,
0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0x01,0x00,
0x00,0xFC,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xF0,0xFF,0xFF,0xFF,0x3F,0x00,0x00,
0x00,0xE0,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0xC0,0xFF,0xFF,0xFF,0x0F,0x00,0x00,
0x00,0x00,0xFE,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0xF8,0xFF,0x7F,0x00,0x00,0x00,
0x00,0x00,0xC0,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,   
};
//设置显示3  64*63的图案
PROGMEM const uint8_t menu_one_3[] ={
0x00,0x00,0x00,0xFE,0xFF,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x07,0x00,0x00,
0x00,0x00,0xF8,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0x7F,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xC0,0xFF,0xFF,0xFF,0xFF,0x07,0x00,
0x00,0xF0,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0xF0,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,
0x00,0xFC,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0xFC,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,
0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,
0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,
0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,
0xF0,0xFF,0xFF,0x07,0xC0,0xFF,0xFF,0x0F,0xF0,0xFF,0x7F,0x00,0x00,0xFE,0xFF,0x1F,
0xF8,0xFF,0x3F,0x00,0x00,0xFC,0xFF,0x1F,0xF8,0xFF,0x0F,0x00,0x00,0xF0,0xFF,0x1F,
0xF8,0xFF,0x07,0x00,0x00,0xE0,0xFF,0x3F,0xFC,0xFF,0x03,0x00,0x00,0xC0,0xFF,0x3F,
0xFC,0xFF,0x01,0x00,0x00,0x80,0xFF,0x7F,0xFE,0xFF,0x01,0x00,0x00,0x00,0xFF,0x7F,
0xFE,0xFF,0x00,0x00,0x00,0x00,0xFF,0x7F,0xFE,0xFF,0x00,0x00,0x00,0x00,0xFE,0x7F,
0xFE,0x7F,0x00,0x00,0x00,0x00,0xFE,0x7F,0xFE,0x7F,0x80,0xC7,0xC3,0x01,0xFE,0xFF,
0xFE,0x7F,0x80,0xEF,0xE7,0x03,0xFE,0xFF,0xFF,0x7F,0xC0,0xEF,0xE7,0x03,0xFE,0xFF,
0xFF,0x7F,0x80,0xC7,0xE3,0x01,0xFE,0xFF,0xFF,0x7F,0x00,0x83,0xC1,0x01,0xFE,0xFF,
0xFF,0x7F,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFE,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFE,0xFF,0x01,0x00,0x00,0x80,0xFF,0xFF,0xFE,0xFF,0x01,0x00,0x00,0x80,0xFF,0x7F,
0xFE,0xFF,0x03,0x00,0x00,0xC0,0xFF,0x7F,0xFE,0xFF,0x07,0x00,0x00,0xE0,0xFF,0x7F,
0xFE,0xFF,0x0F,0x00,0x00,0xF0,0xFF,0x7F,0xFC,0xFF,0x3F,0x00,0x00,0xF8,0xFF,0x7F,
0xFC,0xFF,0x7F,0x00,0x00,0xFF,0xFF,0x3F,0xF8,0xFF,0x7F,0x00,0xF0,0xFF,0xFF,0x3F,
0xF8,0xFF,0x7F,0xE0,0xFF,0xFF,0xFF,0x1F,0xF8,0xFF,0x7F,0xF0,0xFF,0xFF,0xFF,0x1F,
0xF0,0xFF,0x7F,0xFC,0xFF,0xFF,0xFF,0x1F,0xF0,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0x0F,
0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,
0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,
0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,
0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0xFC,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,
0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0xF0,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,
0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x01,0x00,
0x00,0x00,0xFE,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x1F,0x00,0x00,
0x00,0x00,0xC0,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0x00,0x00,0x00,
0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x00,
};
//设置显示4  86*64的图案
PROGMEM const uint8_t menu_one_4[] ={
0xFF,0xE7,0xFF,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xC7,0xFF,0x0F,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xC3,0xFF,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x3F,0xFF,0xC3,0xFF,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xC3,0xFF,0x07,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xC1,0xFF,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0x3F,0xFF,0xF1,0x00,0x78,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0x3B,0x00,
0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0x0F,0x00,0x80,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x3F,0xFF,0x07,0x00,0x00,0x7F,0xF8,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0x07,
0x00,0xE0,0x06,0xF8,0xFF,0xFF,0xFF,0xFF,0x3F,0x80,0x03,0x00,0xF0,0x0D,0xF8,0xFF,
0xFF,0xFF,0xFF,0x3F,0x80,0x01,0x00,0xF0,0x1B,0xF8,0xFF,0xFF,0xFF,0xFF,0x3F,0xC0,
0x01,0x00,0xF0,0x1B,0xF8,0xFF,0xFF,0xFF,0xFF,0x3F,0xC0,0x00,0x00,0xF0,0x37,0xFC,
0xFF,0xFF,0xFF,0xFF,0x3F,0x61,0x00,0x00,0xE0,0x37,0x02,0xF0,0xFF,0xFF,0xFF,0x3F,
0x61,0x00,0x00,0x80,0x6F,0x03,0x00,0xFE,0xFF,0xFF,0x3F,0x63,0x00,0x00,0x00,0xEF,
0xF8,0x0F,0xF0,0xFF,0xFF,0x3F,0x7F,0xC0,0x00,0x18,0x6F,0xFE,0xFF,0x81,0xFF,0xFF,
0x3F,0x7F,0xC0,0x00,0x98,0x6F,0xFE,0xFF,0x1F,0xFE,0xFF,0x3F,0x7F,0x00,0x00,0x00,
0x6F,0xFF,0xFF,0x7F,0xF8,0xFF,0x3F,0x7F,0xE0,0xFF,0x1F,0x6E,0xFF,0xFF,0xFF,0xF1,
0xFF,0x3F,0x7F,0xF8,0xFF,0xFF,0x60,0xFF,0xFF,0xFF,0xE7,0xFF,0x3F,0x7F,0x0F,0x00,
0xC0,0x63,0xFF,0xFF,0xFF,0x8F,0xFF,0x3F,0xFF,0x03,0x00,0x00,0x3F,0xFE,0xFF,0xFF,
0x9F,0xFF,0x3F,0xFF,0x01,0x00,0x00,0x3C,0xFE,0xFF,0xFF,0x3F,0xFC,0x3F,0xFF,0x00,
0x00,0x00,0x38,0xFC,0xFF,0xFF,0x7F,0xF0,0x3F,0x7F,0xC0,0x00,0x18,0x38,0xF0,0xFF,
0xFF,0xFF,0xE6,0x3F,0x7F,0xE0,0x01,0x3C,0x30,0xC0,0xFF,0xFF,0xFF,0xCC,0x3F,0x7F,
0xF0,0x01,0x7C,0x30,0x80,0xFF,0xFF,0xFF,0x99,0x3F,0x3F,0xF0,0x01,0x7C,0x30,0x00,
0xFF,0xFF,0xFF,0x39,0x3F,0x3F,0xF0,0x00,0x78,0x30,0x00,0xFF,0xFF,0xFF,0x39,0x3F,
0x7F,0x60,0x00,0x10,0x30,0x00,0xFE,0x7F,0xF0,0x79,0x3E,0x7F,0x00,0x00,0x00,0x30,
0x00,0xFE,0x3F,0xC0,0xF8,0x3E,0xFF,0x00,0x00,0x00,0x18,0x00,0xFC,0x3F,0x00,0xF0,
0x3C,0xFF,0x01,0x00,0x00,0x1C,0x00,0xF8,0x1F,0x00,0x30,0x38,0xFF,0x03,0x00,0x00,
0x0E,0x00,0xE0,0x07,0x00,0x30,0x30,0xFF,0x1F,0x00,0xC0,0x07,0x00,0x00,0x00,0x00,
0x10,0x30,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x30,0x30,0xFF,0xE1,0xFF,
0x3F,0x00,0x00,0x00,0x00,0xE0,0x33,0x30,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0xF8,0x73,0x30,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xF7,0x38,0xFF,0xF9,
0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xF7,0x3C,0xFF,0xF9,0x01,0x00,0x00,0x00,0x00,
0x00,0xFE,0xF7,0x3E,0xFF,0xF8,0x03,0x00,0x00,0x00,0x00,0x00,0xFC,0xF7,0x3F,0xFF,
0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0xFC,0xF7,0x3F,0xFF,0xFC,0x03,0x00,0x00,0x00,
0x00,0x00,0xF8,0xF7,0x3F,0xFF,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0xF0,0xF3,0x3F,
0xFF,0xFC,0x01,0x00,0x00,0x00,0x00,0x00,0xF0,0xF3,0x3F,0xFF,0xFC,0x00,0x00,0x00,
0x00,0x00,0x00,0xF0,0xFB,0x3F,0xFF,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF9,
0x3F,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0xFF,0xFC,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xF8,0x3F,0xFF,0x7C,0x00,0x00,0x00,0xFF,0xFF,0x03,0x00,0xF8,0x3F,0xFF,0x3C,0x70,
0x00,0xC0,0x1F,0xE0,0x1F,0x00,0xF8,0x3F,0xFF,0x08,0xFC,0x03,0xC0,0x0F,0x00,0x38,
0x00,0xF8,0x3F,0xFF,0x01,0xFE,0x07,0xE0,0x0F,0x00,0x7C,0x00,0xFC,0x3F,0xFF,0x01,
0xFE,0x0F,0xE0,0x7F,0x00,0xFE,0x00,0xFC,0x3F,0xFF,0x03,0xFF,0x1F,0xF0,0x7F,0xE6,
0xFF,0x01,0xFC,0x3F,0xFF,0x03,0xFF,0x3F,0xF8,0xFF,0xFF,0xFF,0x03,0xFE,0x3F,0xFF,
0xC7,0xFF,0x7F,0xFC,0xFF,0xFF,0xFF,0x07,0xFF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x8F,0xFF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F};

//主菜单页面
/*****方法1***** */
  //  u8g2.clearBuffer();  //清除缓冲区内容
    /***输出文字图像*** */
    // u8g2.drawStr(0,16,"Hallo") ;  
    // u8g2.drawUTF8(0,32,"你好哈");
    //u8g2.setCursor(0,48); //设置光标
    //u8g2.printf("温度数值:%d",value);
    //u8g2.drawXBMP(0,0,62,62,logo1);
    /****************** */ 
   // u8g2.sendBuffer();  //显示缓冲区内容

 //delay(10);
 //value++;
/********方法2******* */
/*
 u8g2.firstPage();
 do{
   u8g2.drawXBMP(0,0,41,62,logo);
 }while (u8g2.nextPage());
 */
int menu_one()
{
    int flag = 1; //记录选择菜单

    while(1)
    {
        if(key_UP == 0) //下一项
        {
            delay(10);
            while (key_UP == 0);
            delay(10);
            flag++;
            if(flag==5) flag=1;
        }
        if(key_OK == 0)
        {
            delay(10);
            while (key_OK == 0);
            delay(10); 
            u8g2.clearBuffer();  //清除缓冲区内容
            return(flag) ;  
        }
        switch (flag)
        {
            case 1:
            {
                 
                u8g2.clearBuffer();  //清除缓冲区内容
                //u8g2.drawUTF8(0,16,"->设置1") ; 
                //u8g2.drawUTF8(0,32,"  设置2") ; 
                //u8g2.drawUTF8(0,48,"  设置3") ; 
                //u8g2.drawUTF8(0,64,"  设置4") ;
                u8g2.drawXBMP(0,0,64,64,menu_one_1);
                u8g2.sendBuffer();  //显示缓冲区内容
            }break;
            case 2:
            {
                u8g2.clearBuffer();  //清除缓冲区内容
                //u8g2.drawUTF8(0,16,"  设置1") ; 
                //u8g2.drawUTF8(0,32,"->设置2") ; 
                //u8g2.drawUTF8(0,48,"  设置3") ;
                //u8g2.drawUTF8(0,64,"  设置4") ; 
                 u8g2.drawXBMP(0,0,59,60,menu_one_2);
                u8g2.sendBuffer();  //显示缓冲区内容
            }break;
            case 3:
            {
                u8g2.clearBuffer();  //清除缓冲区内容
               // u8g2.drawUTF8(0,16,"  设置1") ; 
                //u8g2.drawUTF8(0,32,"  设置2") ; 
                //u8g2.drawUTF8(0,48,"->设置3") ; 
               // u8g2.drawUTF8(0,64,"  设置4") ; 
               u8g2.drawXBMP(0,0,64,63,menu_one_3);
                u8g2.sendBuffer();  //显示缓冲区内容
            }break;            
            case 4:
            {
                u8g2.clearBuffer();  //清除缓冲区内容
                //u8g2.drawUTF8(0,16,"  设置1") ; 
                //u8g2.drawUTF8(0,32,"  设置2") ; 
                //u8g2.drawUTF8(0,48,"  设置3") ; 
                //u8g2.drawUTF8(0,64,"->设置4") ;
                u8g2.drawXBMP(0,0,86,64,menu_one_4); 
                u8g2.sendBuffer();  //显示缓冲区内容
            }break;  
        }
    }
}
//子菜单设置1
int menu_TWo()
{
    int flag = 1; //记录选择菜单
    while(1)
    {
        if(key_UP == 0) //下一项
        {
            delay(10);
            while (key_UP == 0);
            delay(10);
            flag++;
            if(flag==5) flag=1;
        }
        if(key_OK == 0)
        {
            delay(10);
            while (key_OK == 0);
            delay(10); 
            u8g2.clearBuffer();  //清除缓冲区内容
            return 0;  //结束函数  这里可以添加变量函数
        }
        switch (flag)
        {
            case 1:
            {
                u8g2.clearBuffer();  //清除缓冲区内容
                u8g2.setCursor(0,16); //设置光标
                u8g2.printf("温度数值:%d",mlx90614_time());
               // u8g2.drawUTF8(0,16,"->子菜单1") ; 
                u8g2.drawUTF8(0,32,"  子菜单12") ; 
                u8g2.drawUTF8(0,48,"  子菜单13") ; 
                u8g2.drawUTF8(0,64,"  子菜单14") ;
                u8g2.sendBuffer();  //显示缓冲区内容
            }break;
            case 2:
            {
                u8g2.clearBuffer();  //清除缓冲区内容
                u8g2.drawUTF8(0,16,"  子菜单11") ; 
                u8g2.drawUTF8(0,32,"->子菜单12") ; 
                u8g2.drawUTF8(0,48,"  子菜单13") ;
                u8g2.drawUTF8(0,64,"  子菜单14") ; 
                u8g2.sendBuffer();  //显示缓冲区内容
            }break;
            case 3:
            {
                u8g2.clearBuffer();  //清除缓冲区内容
                u8g2.drawUTF8(0,16,"  子菜单11") ; 
                u8g2.drawUTF8(0,32,"  子菜单12") ; 
                u8g2.drawUTF8(0,48,"->子菜单13") ; 
                u8g2.drawUTF8(0,64,"  子菜单14") ; 
                u8g2.sendBuffer();  //显示缓冲区内容
            }break;            
            case 4:
            {
                u8g2.clearBuffer();  //清除缓冲区内容
                u8g2.drawUTF8(0,16,"  子菜单11") ; 
                u8g2.drawUTF8(0,32,"  子菜单12") ; 
                u8g2.drawUTF8(0,48,"  子菜单13") ; 
                u8g2.drawUTF8(0,64,"->子菜单14") ; 
                u8g2.sendBuffer();  //显示缓冲区内容
            }break;  
        }
    }
}
//子菜单设置2
int menu_Three()
{
    int flag = 1; //记录选择菜单
    while(1)
    {
        if(key_UP == 0) //下一项
        {
            delay(10);
            while (key_UP == 0);
            delay(10);
            flag++;
            if(flag==5) flag=1;
        }
        if(key_OK == 0)
        {
            delay(10);
            while (key_OK == 0);
            delay(10); 
            u8g2.clearBuffer();  //清除缓冲区内容
            return 0;  //结束函数  这里可以添加变量函数
        }
        switch (flag)
        {
            case 1:
            {
                u8g2.clearBuffer();  //清除缓冲区内容
                u8g2.drawUTF8(0,16,"->子菜单2") ; 
                u8g2.drawUTF8(0,32,"  子菜单22") ; 
                u8g2.drawUTF8(0,48,"  子菜单23") ; 
                u8g2.drawUTF8(0,64,"  子菜单24") ;
                u8g2.sendBuffer();  //显示缓冲区内容
            }break;
            case 2:
            {
                u8g2.clearBuffer();  //清除缓冲区内容
                u8g2.drawUTF8(0,16,"  子菜单21") ; 
                u8g2.drawUTF8(0,32,"->子菜单22") ; 
                u8g2.drawUTF8(0,48,"  子菜单23") ;
                u8g2.drawUTF8(0,64,"  子菜单24") ; 
                u8g2.sendBuffer();  //显示缓冲区内容
            }break;
            case 3:
            {
                u8g2.clearBuffer();  //清除缓冲区内容
                u8g2.drawUTF8(0,16,"  子菜单21") ; 
                u8g2.drawUTF8(0,32,"  子菜单22") ; 
                u8g2.drawUTF8(0,48,"->子菜单23") ; 
                u8g2.drawUTF8(0,64,"  子菜单24") ; 
                u8g2.sendBuffer();  //显示缓冲区内容
            }break;            
            case 4:
            {
                u8g2.clearBuffer();  //清除缓冲区内容
                u8g2.drawUTF8(0,16,"  子菜单21") ; 
                u8g2.drawUTF8(0,32,"  子菜单22") ; 
                u8g2.drawUTF8(0,48,"  子菜单23") ; 
                u8g2.drawUTF8(0,64,"->子菜单24") ; 
                u8g2.sendBuffer();  //显示缓冲区内容
            }break;  
        }
    }
}

//子菜单设置3
int menu_Four()
{
    int flag = 1; //记录选择菜单
    while(1)
    {
        if(key_UP == 0) //下一项
        {
            delay(10);
            while (key_UP == 0);
            delay(10);
            flag++;
            if(flag==5) flag=1;
        }
        if(key_OK == 0)
        {
            delay(10);
            while (key_OK == 0);
            delay(10); 
            u8g2.clearBuffer();  //清除缓冲区内容
            return 0;  //结束函数  这里可以添加变量函数
        }
        switch (flag)
        {
            case 1:
            {
                u8g2.clearBuffer();  //清除缓冲区内容
                u8g2.drawUTF8(0,16,"->子菜单32") ; 
                u8g2.drawUTF8(0,32,"  子菜单3") ; 
                u8g2.drawUTF8(0,48,"  子菜单33") ; 
                u8g2.drawUTF8(0,64,"  子菜单34") ;
                u8g2.sendBuffer();  //显示缓冲区内容
            }break;
            case 2:
            {
                u8g2.clearBuffer();  //清除缓冲区内容
                u8g2.drawUTF8(0,16,"  子菜单31") ; 
                u8g2.drawUTF8(0,32,"->子菜单32") ; 
                u8g2.drawUTF8(0,48,"  子菜单33") ;
                u8g2.drawUTF8(0,64,"  子菜单34") ; 
                u8g2.sendBuffer();  //显示缓冲区内容
            }break;
            case 3:
            {
                u8g2.clearBuffer();  //清除缓冲区内容
                u8g2.drawUTF8(0,16,"  子菜单31") ; 
                u8g2.drawUTF8(0,32,"  子菜单32") ; 
                u8g2.drawUTF8(0,48,"->子菜单33") ; 
                u8g2.drawUTF8(0,64,"  子菜单34") ; 
                u8g2.sendBuffer();  //显示缓冲区内容
            }break;            
            case 4:
            {
                u8g2.clearBuffer();  //清除缓冲区内容
                u8g2.drawUTF8(0,16,"  子菜单31") ; 
                u8g2.drawUTF8(0,32,"  子菜单32") ; 
                u8g2.drawUTF8(0,48,"  子菜单33") ; 
                u8g2.drawUTF8(0,64,"->子菜单34") ; 
                u8g2.sendBuffer();  //显示缓冲区内容
            }break;  
        }
    }
}

//子菜单设置4
int menu_Fivw()
{
    int flag = 1; //记录选择菜单
    while(1)
    {
        if(key_UP == 0) //下一项
        {
            delay(10);
            while (key_UP == 0);
            delay(10);
            flag++;
            if(flag==5) flag=1;
        }
        if(key_OK == 0)
        {
            delay(10);
            while (key_OK == 0);
            delay(10); 
            u8g2.clearBuffer();  //清除缓冲区内容
            return 0;  //结束函数  这里可以添加变量函数
        }
        switch (flag)
        {
            case 1:
            {
                u8g2.clearBuffer();  //清除缓冲区内容
                u8g2.drawUTF8(0,16,"->子菜单42") ; 
                u8g2.drawUTF8(0,32,"  子菜单43") ; 
                u8g2.drawUTF8(0,48,"  子菜单43") ; 
                u8g2.drawUTF8(0,64,"  子菜单44") ;
                u8g2.sendBuffer();  //显示缓冲区内容
            }break;
            case 2:
            {
                u8g2.clearBuffer();  //清除缓冲区内容
                u8g2.drawUTF8(0,16,"  子菜单4") ; 
                u8g2.drawUTF8(0,32,"->子菜单4") ; 
                u8g2.drawUTF8(0,48,"  子菜单4") ;
                u8g2.drawUTF8(0,64,"  子菜单4") ; 
                u8g2.sendBuffer();  //显示缓冲区内容
            }break;
            case 3:
            {
                u8g2.clearBuffer();  //清除缓冲区内容
                u8g2.drawUTF8(0,16,"  子菜单4") ; 
                u8g2.drawUTF8(0,32,"  子菜单4") ; 
                u8g2.drawUTF8(0,48,"->子菜单4") ; 
                u8g2.drawUTF8(0,64,"  子菜单34") ; 
                u8g2.sendBuffer();  //显示缓冲区内容
            }break;            
            case 4:
            {
                u8g2.clearBuffer();  //清除缓冲区内容
                u8g2.drawUTF8(0,16,"  子菜单4") ; 
                u8g2.drawUTF8(0,32,"  子菜单4") ; 
                u8g2.drawUTF8(0,48,"  子菜单34") ; 
                u8g2.drawUTF8(0,64,"->子菜单4") ; 
                u8g2.sendBuffer();  //显示缓冲区内容
            }break;  
        }
    }
}
void u8g2_menu_config()
{
   int value = menu_one();
    if(value == 1)  //子菜单1
    {
        menu_TWo();
    }else if (value == 2)
    {
        menu_Three();
    }else if (value == 3)
    {
         menu_Four();
    }else if (value == 4)
    {
         menu_Fivw();
    }

}

mlx90614.cpp文件

#include <Arduino.h>
#include <mlx90614.h>




// 定义常量
#define SCL_PIN 18
#define SDA_PIN 19

// 传感器地址
#define I2C_ADDRESS 0x00

// 定义变量
uint8_t bit_in = 0;
uint8_t bit_out = 0;
uint8_t data_in = 0;
uint8_t data_out = 0x5a; // 假设要写入的寄存器地址

// 定义函数原型
void delay_us(uint16_t time);
void start_bit();
void stop_bit();
void send_bit();
void receive_bit();
uint8_t rx_byte();
void tx_byte(uint8_t dat_byte);



// 写入一个字节到IIC设备
void writeByte(uint8_t addr, uint8_t value) {
  // 开始位
  start_bit();
  
  // 写入设备地址 + 写标志
  tx_byte(addr << 1);
  
  // 写入数据
  tx_byte(value);
  
  // 结束位
  stop_bit();
}

// 从IIC设备读取一个字节
uint8_t readByte(uint8_t addr) {
  uint8_t data = 0;
  
  // 开始位
  start_bit();
  
  // 写入设备地址 + 读标志
  tx_byte((addr << 1) | 1);
  
  // 读取数据
  data = rx_byte();
  
  // 读取结束位
  bit_in = 1; // NACK
  receive_bit();
  
  // 结束位
  stop_bit();
  
  return data;
}

// 延时函数
void delay_us(uint16_t time) {
  delayMicroseconds(time);
}

// 发送起始位
void start_bit() {
  digitalWrite(SCL_PIN, HIGH);
  digitalWrite(SDA_PIN, HIGH);
  delay_us(9);
  digitalWrite(SDA_PIN, LOW);
  delay_us(9);
  digitalWrite(SCL_PIN, LOW);
  delay_us(9);
}

// 发送停止位
void stop_bit() {
  digitalWrite(SCL_PIN, LOW);
  delay_us(9);
  digitalWrite(SDA_PIN, LOW);
  delay_us(9);
  digitalWrite(SCL_PIN, HIGH);
  delay_us(9);
  digitalWrite(SDA_PIN, HIGH);
}

// 发送一个位
void send_bit() {
  if (bit_out == 0) {
    digitalWrite(SDA_PIN, LOW);
  } else {
    digitalWrite(SDA_PIN, HIGH);
  }
  delay_us(9);
  digitalWrite(SCL_PIN, HIGH);
  delay_us(9);
  digitalWrite(SCL_PIN, LOW);
  delay_us(9);
}

// 接收一个位
void receive_bit() {
  pinMode(SDA_PIN, INPUT_PULLUP);
  digitalWrite(SCL_PIN, HIGH);
  delay_us(9);
  bit_in = digitalRead(SDA_PIN);
  digitalWrite(SCL_PIN, LOW);
  delay_us(9);
  pinMode(SDA_PIN, OUTPUT);
}

// 发送一个字节
void tx_byte(uint8_t dat_byte) {
  for (int i = 0; i < 8; i++) {
    if (dat_byte & 0x80) {
      bit_out = 1;
    } else {
      bit_out = 0;
    }
    send_bit();
    dat_byte <<= 1;
  }

  // 接收应答位
  receive_bit();
  if (bit_in == 1) {
    stop_bit();
  }
}

// 接收一个字节
uint8_t rx_byte() {
  uint8_t dat = 0;
  for (int i = 0; i < 8; i++) {
    dat <<= 1;
    receive_bit();
    if (bit_in == 1) {
      dat |= 1;
    }
  }
  // 发送应答位
  bit_out = 0;
  send_bit(); // ACK
  return dat;
}

int mlx90614_time()
{   uint16_t k;
    start_bit(); // 发送起始位
    tx_byte(I2C_ADDRESS);// 发送一个字节
    tx_byte(0x07);// 发送一个字节
    start_bit(); // 发送起始位
    tx_byte(0x01);// 发送一个字节
    bit_out=0;
    uint8_t dataL = rx_byte();
    bit_out=0;
    uint8_t datah = rx_byte();
    bit_out=1;
    stop_bit();
    //Serial.printf("datah:%d  dataL:%d\r\n",datah,dataL);
    k = (datah<<8)|dataL;
    return (((k*2)-27315)/100)*0.9;
}


void mlx90614_init() {
  // 初始化GPIO
  pinMode(SCL_PIN, OUTPUT);
  pinMode(SDA_PIN, OUTPUT);

 
}

void mlx90614_config() {
int l =mlx90614_time();
Serial.printf("time:%d\r\n",l);
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白文化

求大佬打赏;

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值