CC2640R2F学习笔记(2)——OLED屏使用
一、简介
1.1 硬件规格
SSD1306规格书:
链接:https://pan.baidu.com/s/1BtCtp87fTB7VXBG-20czWQ 提取码:vtqv
OLED尺寸: 0.96寸
OLED像素: 128 * 64
OLED驱动IC: SSD1306
接口类型: 4线SPI、3线SPI、IIC接口,可通过配置模块上的电阻等元件切换
1.2 接口定义
引脚 | 功能说明 |
---|---|
GND | 电源地 |
VCC | 电源正 3.3~5V |
D0 | SPI接口时为SPI时钟线,IIC接口时为IIC时钟线 |
D1 | SPI接口时为SPI数据线,IIC接口时为IIC数据线 |
RST | OLED复位,OLED在上电后需做一次复位 |
DC | SPI接口时SPI数据/命令选择脚,IIC接口时用来设置IIC地址 |
二、OLED控制流程
2.1 硬件连接
OLED引脚 | 香瓜CC2640R2F开发板引脚 |
---|---|
GND | GND |
VCC | VCC |
D0 | IOID_9 |
D1 | IOID_10 |
D0 | IOID_9 |
RST | IOID_4 |
DC | IOID_26 |
2.2 总线协议
IO口软件模拟SPI
2.3 软件控制流程
①IO初始化。
②根据时序初始化LCD。
③显示。
三、移植文件
链接:https://pan.baidu.com/s/1FT7PMZoV8jUgoB6WUEkAEw 提取码:wifz
将 board_oled.c 和 board_oled.h 两个文件拖拽至CCS工程的Application文件夹下
添加文件过程中,选项选择如下
3.1 board_oled.c
/********************************************************************** INCLUDES*/
/* BIOS Header files */
#include <ti/sysbios/knl/Task.h>
#include <ti/sysbios/knl/Clock.h>
#include <ti/sysbios/knl/Semaphore.h>
#include <ti/sysbios/knl/Queue.h>/* Board Header files */
#include "Board.h"#include "util.h"
#include "board_oled.h"#include <string.h>
#include <stdio.h>/******************************************************************************* DEFINITIONS*/
#define OLED_SCL IOID_9 //SCLK 时钟 D0(SCLK)
#define OLED_SDA IOID_10 //SDA D1(MOSI) 数据
#define OLED_RST IOID_4 //_RES hardware reset 复位
#define OLED_DC IOID_26 //A0 H/L 命令数据选通端,H:数据,L:命令#define X_WIDTH 128
#define Y_WIDTH 64#define HAL_OLED_MAX_CHARS 16
#define HAL_OLED_MAX_BUF 25#define OLED_SCL_1() PIN_setOutputValue(OLEDPinHandle, OLED_SCL, 1)
#define OLED_SCL_0() PIN_setOutputValue(OLEDPinHandle, OLED_SCL, 0)
#define OLED_SDA_1() PIN_setOutputValue(OLEDPinHandle, OLED_SDA, 1)
#define OLED_SDA_0() PIN_setOutputValue(OLEDPinHandle, OLED_SDA, 0)
#define OLED_RST_1() PIN_setOutputValue(OLEDPinHandle, OLED_RST, 1)
#define OLED_RST_0() PIN_setOutputValue(OLEDPinHandle, OLED_RST, 0)
#define OLED_DC_1() PIN_setOutputValue(OLEDPinHandle, OLED_DC, 1)
#define OLED_DC_0() PIN_setOutputValue(OLEDPinHandle, OLED_DC, 0)#define LCD_SUPPORT 0/********************************************************************** LOCAL VARIABLES*/
/* Application OLED pin configuration table */
static PIN_Config OLEDPinTable[] = {OLED_SCL | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,OLED_SDA | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,OLED_RST | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,OLED_DC | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,PIN_TERMINATE // Terminate list
};/* Pin driver handle */
static PIN_Handle OLEDPinHandle = NULL;
static PIN_State OLEDPinState;/********************************************************************** LOCAL FUNCTIONS*/
#if LCD_SUPPORT
//16*16的点阵字体取模方式:共阴——列行式——逆向输出
static const unsigned char F16x16[] =
{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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: 深 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x61,0x06,0xE0,0x00,0x26,0x22,0x1A,0x02,0xC2,0x0A,0x12,0x32,0x06,0x02,0x00,0x04,0xFC,0x03,0x20,0x20,0x11,0x11,0x09,0x05,0xFF,0x05,0x09,0x19,0x31,0x10,0x00,/*-- 文字: 圳 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0x10,0xFE,0x10,0x10,0xFE,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x00,0x00,0x08,0x08,0x04,0x47,0x24,0x18,0x07,0x00,0x00,0x1F,0x00,0x00,0x00,0x7F,0x00,0x00,/*-- 文字: 市 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x04,0x04,0x04,0xE4,0x24,0x24,0x25,0xFE,0x24,0x24,0x24,0x24,0xE4,0x04,0x04,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0xFF,0x00,0x00,0x10,0x20,0x1F,0x00,0x00,0x00,
};//8*16的点阵
static const unsigned char F8X16[]=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 00x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 10x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 20x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 30x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 40xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 50x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 60x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 70x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 80x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 90x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 100x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 110x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 120x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 130x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 140x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 150x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 160x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 170x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 180x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 190x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 200x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 210x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 220x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 230x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 240x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 250x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 260x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 270x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 280x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 290x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 300x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 310xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 320x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 330x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 340xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 350x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 360x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 370x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 380xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 390x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 400x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 410x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 420x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 430x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 440x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 450x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 460xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 470x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 480xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 490x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 500x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 510x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 520x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 530x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 540xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 550x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 560x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 570x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 580x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 590x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 600x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 610x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 620x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 630x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 640x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 650x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 660x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 670x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 680x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 690x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 700x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 710x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 720x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 730x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 740x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 750x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 760x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 770x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 780x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 790x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 800x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 810x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 820x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 830x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 840x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 850x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 860x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 870x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 880x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 890x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 900x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 910x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 920x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 930x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
};
#endif//6*8的点阵
static const unsigned char F6x8[92][6] =
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 00x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 10x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 20x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 30x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 40x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 50x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 60x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 70x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 80x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 90x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// <0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 550x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines
};//字转数组
static void _itoa(unsigned int uiNum, unsigned char *buf, unsigned char uiRadix)
{unsigned char c, i;unsigned char *p, rst[32];p = rst;for (i = 0; i < 32; i++, p++){/* Isolate a digit */c = uiNum % uiRadix;/* Convert to Ascii */*p = c + ((c < 10) ? '0' : '7');uiNum /= uiRadix;if (!uiNum)break;}for (c = 0; c <= i; c++){/* Reverse character order */*buf++ = *p--;}*buf = '\0';
}//字转数组
static unsigned char * _ltoa(unsigned long l, unsigned char *buf, unsigned char radix)
{#if defined (__TI_COMPILER_VERSION)return ( (unsigned char*)ltoa( l, (char *)buf ) );
#elif defined( __GNUC__ )return ( (char*)ltoa( l, buf, radix ) );
#elseunsigned char tmp1[10] = "", tmp2[10] = "", tmp3[10] = "";unsigned short num1, num2, num3;unsigned char i;buf[0] = '\0';if ( radix == 10 ){num1 = l % 10000;num2 = (l / 10000) % 10000;num3 = (unsigned short)(l / 100000000);if (num3) _itoa(num3, tmp3, 10);if (num2) _itoa(num2, tmp2, 10);if (num1) _itoa(num1, tmp1, 10);if (num3){strcpy((char*)buf, (char const*)tmp3);for (i = 0; i < 4 - strlen((char const*)tmp2); i++)strcat((char*)buf, "0");}strcat((char*)buf, (char const*)tmp2);if (num3 || num2){for (i = 0; i < 4 - strlen((char const*)tmp1); i++)strcat((char*)buf, "0");}strcat((char*)buf, (char const*)tmp1);if (!num3 && !num2 && !num1)strcpy((char*)buf, "0");}else if ( radix == 16 ){num1 = l & 0x0000FFFF;num2 = l >> 16;if (num2) _itoa(num2, tmp2, 16);if (num1) _itoa(num1, tmp1, 16);if (num2){strcpy((char*)buf,(char const*)tmp2);for (i = 0; i < 4 - strlen((char const*)tmp1); i++)strcat((char*)buf, "0");}strcat((char*)buf, (char const*)tmp1);if (!num2 && !num1)strcpy((char*)buf, "0");}elsereturn NULL;return buf;
#endif
}/*********************OLED 延时1ms************************************/
static void OLED_DLY_Ms(unsigned int ms)
{ unsigned int a;while(ms){a=1800;while(a--);ms--;}return;
}/*********************OLED 写数据************************************/
static void OLED_WrDat(unsigned char dat)
{unsigned char i=8, temp=0;OLED_DC_1(); for(i=0;i<8;i++) //鍙戦�佷竴涓叓浣嶆暟鎹�{OLED_SCL_0(); temp = dat&0x80;if (temp == 0){OLED_SDA_0();}else{OLED_SDA_1();}OLED_SCL_1(); dat<<=1; }
} /*********************OLED 写命令************************************/
static void OLED_WrCmd(unsigned char cmd)
{unsigned char i=8, temp=0;OLED_DC_0(); for(i=0;i<8;i++) //鍙戦�佷竴涓叓浣嶆暟鎹�{ OLED_SCL_0(); temp = cmd&0x80;if (temp == 0){OLED_SDA_0();}else{OLED_SDA_1();}OLED_SCL_1(); cmd<<=1;; }
}/*********************OLED 设置坐标************************************/
static void OLED_Set_Pos(unsigned char x, unsigned char y)
{ OLED_WrCmd(0xb0+y);OLED_WrCmd(((x&0xf0)>>4)|0x10);OLED_WrCmd((x&0x0f)|0x01);
} /*********************OLED 全屏************************************/
static void OLED_Fill(unsigned char bmp_dat)
{unsigned char y,x;for(y=0;y<8;y++){OLED_WrCmd(0xb0+y);OLED_WrCmd(0x01);OLED_WrCmd(0x10);for(x=0;x<X_WIDTH;x++)OLED_WrDat(bmp_dat);}
}/***************功能描述:行填充, y为页范围0~7****************/
static void OLED_FillLine(unsigned char y,unsigned char ch)
{unsigned char x; OLED_WrCmd(0xb0+y);OLED_WrCmd(0x01);OLED_WrCmd(0x10); for(x=0;x<X_WIDTH;x++)OLED_WrDat(ch);
}/*********************OLED 复位************************************/
static void OLED_CLS(void)
{unsigned char y,x; for(y=0;y<8;y++){OLED_WrCmd(0xb0+y);OLED_WrCmd(0x01);OLED_WrCmd(0x10); for(x=0;x<X_WIDTH;x++)OLED_WrDat(0);}
}/***************功能描述:显示6*8一组标准ASCII字符串 显示的坐标(x,y),y为页范围0~7****************/
static void OLED_P6x8Str(unsigned char x, unsigned char y,unsigned char ch[])
{unsigned char c=0,i=0,j=0; while (ch[j]!='\0'){ c =ch[j]-32;if(x>126){x=0;y++;}OLED_Set_Pos(x,y); if(c > 0 && c < 92){for(i=0;i<6;i++) OLED_WrDat(F6x8[c][i]); }x+=6;j++;}
}/***********功能描述:显示一行ascii 码?无显示的点阵显示黑色, y为页的范围0~7*****************/
static void OLED_WriteLine(unsigned char line, const char *pText)
{OLED_FillLine(line, 0); //鍏堟妸杩欎竴琛屾樉绀烘垚榛戣壊OLED_P6x8Str(0, line, (unsigned char *)pText);
}#if LCD_SUPPORT
/*******************功能描述:显示8*16一组标准ASCII字符串 显示的坐标(x,y),y为页范围0~7****************/
static void OLED_P8x16Str(unsigned char x, unsigned char y,unsigned char ch[])
{unsigned char c=0,i=0,j=0;while (ch[j]!='\0'){ c =ch[j]-32;if(x>120){x=0;y++;}OLED_Set_Pos(x,y); for(i=0;i<8;i++) OLED_WrDat(F8X16[c*16+i]);OLED_Set_Pos(x,y+1); for(i=0;i<8;i++) OLED_WrDat(F8X16[c*16+i+8]); x+=8;j++;}
}/*****************功能描述:显示16*16点阵 显示的坐标(x,y),y为页范围0~7****************************/
static void OLED_P16x16Ch(unsigned char x, unsigned char y, unsigned char N)
{unsigned char wm=0;unsigned int adder=32*N; // OLED_Set_Pos(x , y);for(wm = 0;wm < 16;wm++) // {OLED_WrDat(F16x16[adder]); adder += 1;} OLED_Set_Pos(x,y + 1); for(wm = 0;wm < 16;wm++) // {OLED_WrDat(F16x16[adder]);adder += 1;}
}
#endif/********************************************************************** PUBLIC FUNCTIONS*/
/********************************************************************** @fn Board_initOLED** @brief Initialize OLED pins.** @param none** @return none*/
void Board_initOLED(void)
{/* Open LED pins */if(OLEDPinHandle == NULL){OLEDPinHandle = PIN_open(&OLEDPinState, OLEDPinTable);}//初始化OLED_SCL_1();OLED_RST_0();OLED_DLY_Ms(250);OLED_RST_1(); //从上电到下面开始初始化要有足够的时间,即等待RC复位完毕 OLED_WrCmd(0xae);//--turn off oled panelOLED_WrCmd(0x00);//---set low column addressOLED_WrCmd(0x10);//---set high column addressOLED_WrCmd(0x40);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)OLED_WrCmd(0x81);//--set contrast control registerOLED_WrCmd(0xcf);// Set SEG Output Current BrightnessOLED_WrCmd(0xa1);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常OLED_WrCmd(0xc8);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常OLED_WrCmd(0xa6);//--set normal displayOLED_WrCmd(0xa8);//--set multiplex ratio(1 to 64)OLED_WrCmd(0x3f);//--1/64 dutyOLED_WrCmd(0xd3);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)OLED_WrCmd(0x00);//-not offsetOLED_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequencyOLED_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/SecOLED_WrCmd(0xd9);//--set pre-charge periodOLED_WrCmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 ClockOLED_WrCmd(0xda);//--set com pins hardware configurationOLED_WrCmd(0x12);OLED_WrCmd(0xdb);//--set vcomhOLED_WrCmd(0x40);//Set VCOM Deselect LevelOLED_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)OLED_WrCmd(0x02);//OLED_WrCmd(0x8d);//--set Charge Pump enable/disableOLED_WrCmd(0x14);//--set(0x10) disableOLED_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)OLED_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7)OLED_WrCmd(0xaf);//--turn on oled panelOLED_Fill(0x00); //初始成黑屏//设置偏移值OLED_Set_Pos(0,0);
}/********************************************************************** @fn OLED_writeValue** @brief Write a value to the OLED.** @param value - value that will be displayed* @param radix - 8, 10, 16* @param line - display options** @return none*/
void OLED_writeValue(unsigned int value, const unsigned char radix, unsigned char line)
{unsigned char buf[HAL_OLED_MAX_BUF];_ltoa(value, &buf[0], radix);OLED_WriteLine(line, (char*)buf);
}/********************************************************************** @fn OLED_writeString** @brief Write a string on the OLED display.** @param str - string to print* @param line - line (page) to write (0-7)** @return void*/
void OLED_writeString(char *str, unsigned char line)
{OLED_WriteLine(line, (char*)str);
}/********************************************************************** @fn OLED_writeStringValue** @brief Write a string and value on the OLED display.** @param str - string to print* @param value - value to print* @param format - base of the value to print (2,8,16 etc)* @param line - line (page) to write (0-7)** @return none*/
void OLED_writeStringValue(char *str, unsigned int value, unsigned char format, unsigned char line)
{unsigned char tmpLen;unsigned char buf[HAL_OLED_MAX_BUF] = {0};tmpLen = (unsigned char)strlen((char*)str);memcpy(buf, str, tmpLen);buf[tmpLen] = ' ';_ltoa(value, &buf[tmpLen+1], format );OLED_WriteLine(line, (char*)buf);
}/********************************************************************** @fn OLED_clearLine** @brief Clear lines if the OLED is on.** @param line - line (page) to write (0-7)** @return none*/
void OLED_clearLine(unsigned char line)
{OLED_FillLine(line, 0);
}
3.2 board_oled.h
#ifndef BOARD_OLED_H
#define BOARD_OLED_H#ifdef __cplusplus
extern "C" {#endif/********************************************************************** INCLUDES*//********************************************************************** EXTERNAL VARIABLES*//********************************************************************** CONSTANTS*//********************************************************************** TYPEDEFS*/
//LCD的可写行
typedef enum
{OLED_LINE0 = 0,OLED_LINE1,OLED_LINE2,OLED_LINE3,OLED_LINE4,OLED_LINE5,OLED_LINE6,OLED_LINE7,OLED_LINE_COUNT
}OLED_LINE;/********************************************************************** MACROS*//********************************************************************** API FUNCTIONS*//********************************************************************** @fn Board_initOLED** @brief Initialize OLED pins.** @param none** @return none*/
void Board_initOLED(void);/********************************************************************** @fn OLED_writeValue** @brief Write a value to the OLED.** @param value - value that will be displayed* @param radix - 8, 10, 16* @param line - display options** @return none*/
void OLED_writeValue(unsigned int value, const unsigned char radix, unsigned char line);/********************************************************************** @fn OLED_writeString** @brief Write a string on the OLED display.** @param str - string to print* @param line - line (page) to write (0-7)** @return void*/
void OLED_writeString(char *str, unsigned char line);/********************************************************************** @fn OLED_writeStringValue** @brief Write a string and value on the OLED display.** @param str - string to print* @param value - value to print* @param format - base of the value to print (2,8,16 etc)* @param line - line (page) to write (0-7)** @return none*/
void OLED_writeStringValue(char *str, unsigned int value, unsigned char format, unsigned char line);/********************************************************************** @fn OLED_clearLine** @brief Clear lines if the OLED is on.** @param line - line (page) to write (0-7)** @return none*/
void OLED_clearLine(unsigned char line);/*********************************************************************
*********************************************************************/#ifdef __cplusplus
}
#endif#endif /* BOARD_OLED_H */
四、API调用
需包含头文件 board_oled.h
Board_initOLED
功能 | 初始化OLED引脚 |
---|---|
函数定义 | void Board_initOLED(void) |
参数 | 无 |
返回 | 无 |
OLED_writeValue
功能 | 对OLED写入数值 |
---|---|
函数定义 | void OLED_writeValue(unsigned int value, const unsigned char radix, unsigned char line) |
参数1 | value:被显示的数值 |
参数2 | radix:8, 10, 16进制 |
参数3 | line:数值被显示所在的行数 |
返回 | 无 |
OLED_writeString
功能 | 对OLED写入字符串 |
---|---|
函数定义 | void OLED_writeString(char *str, unsigned char line) |
参数1 | str:被显示的字符串 |
参数2 | line:数值被显示所在的行数 |
返回 | 无 |
OLED_writeStringValue
功能 | 对OLED写入字符串和值 |
---|---|
函数定义 | void OLED_writeStringValue(char *str, unsigned int value, unsigned char format, unsigned char line) |
参数1 | str:被显示的字符串 |
参数2 | value:被显示的数值 |
参数3 | format:8, 10, 16进制 |
参数4 | line:数值被显示所在的行数 |
返回 | 无 |
OLED_clearLine
功能 | 清除所在行 |
---|---|
函数定义 | void OLED_clearLine(unsigned char line) |
参数 | 无 |
返回 | 无 |
五、使用例子
1)添加头文件(例 multi_role.c 中)
#include "board_oled.h"
2)添加初始化代码(multi_role.c 的 multi_role_init 函数末尾中)
// 初始化OLED屏
Board_initOLED();
3)添加显示内容
OLED_writeString("Leung", OLED_LINE0); // 写字符串
OLED_writeValue(557278427, 10, OLED_LINE1); // 写数据
OLED_writeStringValue("day:", 31, 10, OLED_LINE2);// 写字符串+数据
OLED_clearLine(OLED_LINE3); // 清除该行
• 由 Leung 写于 2018 年 12 月 26 日
• 参考:【CC2640R2F】香瓜CC2640R2F之LCD
CC2640R2F学习笔记(2)——OLED屏使用相关推荐
- STM32学习笔记之OLED屏
STM32学习笔记--OLED屏 OLED屏的特点: 1. 模块有单色和双色可选,单色为纯蓝色,双色为黄蓝双色(本人选用双色): 2. 显示尺寸为0.96寸 3. 分辨率为128*64 4. ...
- CC2640R2F学习笔记(一.开发环境)
文章目录 前言 一.硬件 二.操作系统 三.SDK 四.CCS 前言 以下列出CC2640R2F学习笔记所基于的软.硬件平台,笔记的所有实验.代码都是在这些平台上来进行的. 一.硬件 开发板LAUNC ...
- CC2640R2F学习笔记(九.总结)
文章目录 前言 正文 总结 前言 注意:本文章仅代表作者对开发CC2640的一些理解,并非权威,仅供参考,如有错误欢迎指正. 正文 本想用CC2640R2F开发一个小产品,看重它的是价格便宜,尤其是几 ...
- 51单片机学习笔记-12LCD1602液晶屏
12 LCD1602液晶屏 [toc] 注:笔记主要参考B站江科大自化协教学视频"51单片机入门教程-2020版 程序全程纯手打 从零开始入门". 注:工程及代码文件放在了本人的G ...
- Android安全学习笔记1——锁屏密码方式
前言 在Android安全学习中,我接触到第一个例子是锁屏密码.我们日常使用手机的时候使用最多的锁屏密码是怎么构成的?下面分享一下我接触到的知识. 锁屏密码的思考 为了安全,Android设备在解锁屏 ...
- CC2640R2F学习笔记(1)——搭建环境、编译烧写
一.搭建环境 1.1 安装BLE5.0 协议栈 SDK 官网下载:http://www.ti.com/tool/download/SIMPLELINK-CC2640R2-SDK 百度网盘:https: ...
- CC2640R2F学习笔记(五.第一个程序:GPIO点灯)
文章目录 前言 一.生成配置文件 二.导入工程"empty" 三.代码改动 四.实现点灯 前言 点灯似乎是所有MCU开发编写的第一个程序,使用CUBEMX来配置STM32初始化程序 ...
- CC2640R2F学习笔记(27)——ADC使用
一.简介 CC2640R2F 的 ADC 是几位的.几个通道的? 12 位模数转换器 (ADC).200MSPS.8 通道模拟多路复用器. 使用的是什么参考源? 参考源有两种,一种是内部的固定 4.3 ...
- CC2640R2F学习笔记(二.gpiointerrupt例程解析)
文章目录 前言 一.导入gpiointerrupt工程 二.主要文件功能 三.代码解析 1.main_tirtos.c 2.gpiointerrupt.c 四.实验现象 总结 参考 前言 gpioin ...
- CC2640R2F学习笔记(6)——UART串口使用
一.硬件连接 串口 引脚 TXD DIO_2 RXD DIO_3 二.移植文件 链接:https://pan.baidu.com/s/1fE8XWgvdzYiF1bdUzTDxUg 提取码:r5s2 ...
最新文章
- 分布式K/V存储方案
- vue + element ui 的后台管理系统框架_从零开始搭建 VUE + Element UI后台管理系统框架...
- oracle创建表语句_利用FME去拼接SQL语句并创建表
- android多接口请求参数,okhttp3 使用json参数post方式请求接口数据(android)
- java简单单向链表_用java简单的实现单链表的基本操作
- 类型的取值范围_Java基础类型取值范围,从基础的理解加深记忆
- 安装apk报错INSTALL_FAILED_UPDATE_INCOMPATIBLE的解决方法
- TFS小记(3):建立团队项目
- 用于无人驾驶技术的车道线_自动驾驶汽车可用于查找车道的4种技术
- iOS关于上传iTunes store一直卡住终极解决方案
- PS制作一寸带白框的证件照
- 处理器核(core)、处理器(cpu)区别
- 【大厂直通车】哔哩哔哩日常实习_测开面经
- matlab求球的体积,【matlab计算不规则物体体积资讯】matlab计算不规则物体体积足球知识与常识 - 足球百科 - 599比分...
- PAT乙级--1033 旧键盘打字(测试点2,测试点4解决)
- Excel区间数据拆分
- android广告平台介绍
- 江苏省计算机高一考试试题,江苏省计算机等级考试试题参考
- 国产操作系统逐步强大,Linux操作系统成为主流
- PHP操作期数,期号的常用方法
热门文章
- 新浪OAuth客户端登陆另辟蹊径
- 对游戏编程开发的一点思考
- 东大22春领导科学与决策X《领导科学与决策》在线平时作业2题目非答案
- 使用FastReport进行基于富盛SBO程序开发框架的报表开发
- 小米电视联网后显示无法解析小米电视服务器,小米电视机功能详解 教你轻松使用...
- 使用AppNode部署IT资产管理平台(Chemex 3.2.0版本)- 肥仔Sam
- 推箱子游戏的java设计思路_基于Java推箱子游戏的设计与实现
- CodeForces 128A Statues 简单搜索
- 替换WIN键和Ctrl键
- 精彩回顾 | NDBC 2021华为参会回顾