STM32中的IIC协议和OLED显示屏
串口通信协议的缺点
- 串口通信通常需要至少三条线(TX、RX和GND),而 I2C 总线仅需要两条信号线(SDA和SCL);
- 串口通信仅支持一对一通信,而 I2C 总线支持多机通信,允许单个主机与多个从机设备进行通信;
- 串口通信通常无应答机制,而 I2C 必须有应答机制;
- 串口通讯一般是异步通信,而 I2C 使用同步传输方式,数据在时钟信号(SCL)的控制下传输。
(上述中,黑体加粗是串口的一些特点,红色是IIC的通信特点)
IIC总线介绍
I2C总线,全称Inter-Integrated Circuit(互连集成电路),是一种由Philips(现NXP半导体)公司在1980年代初开发的同步 串行 半双工通信总线。
说明:一个主机可以控制多个从机,每个从机都有一个编号,通过编号指定从机的通信。
IIC也支持多主多从,但是这个比较复杂不常用。
下节课介绍的OLED显示器就是通过IIC进行通信的。
工作原理:
- 主从关系:主器件用于 启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。
(主机的作用:启动总线传输数据,产生时钟用来开放传送的器件)
- 数据传输:
- 如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送。
- 如果主机要接收从器件的数据,首先由主器件寻址从器件,然后主机接收从器件发送的数据,最后由主机终止接收过程。
- 时钟同步:SCL用于数据的时钟同步,确保主从设备之间的数据传输同步进行。
主要特点:
- 硬件简单:I2C总线只需要 一根数据线 和 一根时钟线 两根线,总线接口已经集成在芯片内部,不需要特殊的接口电路。
- 多主机总线:I2C总线是一个真正的 多主机总线,如果两个或多个主机同时初始化数据传输,可以通过冲突检测和仲裁防止数据破坏。
- 在线检测:I2C总线可以通过外部连线进行在线检测,便于系统故障诊断和调试。
- 数据传输与地址设定:数据传输和地址设定由软件设定,非常灵活。总线上的器件增加和删除不影响其他器件正常工作。
- 负载能力:由于线路中电容会影响总线传输速度,I2C总线的负载能力为400pF,因此可以估算出总线允许长度和所接器件数量。
应用领域
I2C总线广泛应用于各种设备和应用领域,例如传感器、存储器(如EEPROM)、显示屏、温度传感器、实时时钟(RTC)、扩展IO芯片等。
一般是软件配置IIC:引脚进行分配。一般不设有硬件的IIC
总线上会挂载两个上拉电阻的原因?(面试的时候可能会问到)
答:设备输出的模式要配置成开漏输出,只能输出低电平,上拉电阻是为了输出低电平。
IIC上的设备要配置的输出模式?为什么?(面试的时候可能会问到)
答:要配置成开漏输出,不能是推挽输出。
原因:当没有上拉电阻的时候,一个设备配置成推挽输出且输出高电平,另一个设备配置成开漏输出,输出低电平,两个设备间会形成回路,严重时会造成设备烧毁。
若一个设备的输出模式配置成开漏输出,会发生什么?
答:由于总线上的上拉电阻作用,会强制将这一线路的电平拉成0伏,使开漏输出不能正常的工作。是为了安全考虑,避免多个设备间的烧毁。因此,输出模式要配置成开漏输出。(一主一从的时候,推挽输出和开漏输出都可以,若配置成开漏输出的时候,确保总线上有上拉电阻,要不无法输出高电平。)
IIC总线时序
起始信号
- 起始信号由主设备发起,用于通知总线上的所有设备即将开始数据传输。
- 当SCL为高电平时,SDA由高电平变为低电平,产生一个下降沿,表示起始信号的开始。
停止信号
- 停止信号也由主设备发起,用于通知总线上的所有设备数据传输已经结束。
- 当SCL为高电平时,SDA由低电平变为高电平,产生一个上升沿,表示停止信号的开始。
应答信号
- 每当一个字节的数据传输完成后,接收方会向发送方发送一个应答信号(ACK)或非应答信(NACK)。
- 应答信号在SCL的第9个时钟周期(当SCL为高电平时)发送,传输一个字节是8位,需要八个时钟周期。
- 当SCL高电平,若SDA线为低电平,则表示ACK(有效应答),表示接收方已成功接收该字节。
- 当SCL高电平,若SDA线为高电平,则表示NACK(非应答),通常表示接收方接收该字节没有成功。
读写时序
- 发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节。
- 接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)。
一次完整的I2C时序
注意:IIC传输数据的过程中, 是 高位先行,与串口传输数据不同,串口传输数据是 低位先行。
模块:OLED显示器
0.96寸OLED屏幕介绍
0.96 寸 4P(支持IIC协议) 7P(既支持IIC协议又支持SPI协议)OLED 屏幕模块是一种显示屏模块,它包括一个 0.96 英寸的 OLED 显示屏 和 四个引脚。这种OLED 屏幕模块通常用于嵌入式系统和小型电子设备中,可以显示文本、图像和其他类型的信息。由于其小尺寸和低功耗,也常用于智能手表、健康追踪器和其他便携式设备中。
0.96寸OLED 参数
驱动芯片 | SSD1306 | 分辨率 | 128 (横向像素点)× 64(纵向像素点) |
显示尺寸 | 0.96 英寸 | 外形尺寸 | 27.5 × 27.8 ( mm ) |
玻璃尺寸 | 26.7 × 19.26 × 1.4 ( mm ) | 显示区域 | 21.74 ( W ) × 10.864 ( mm ) |
视角 | 全视角 | 工作电压 | 3.3V ~ 5V |
工作温度 | -20 ℃ ~ 70 ℃ | 存储温度 | -30 ℃ ~ 80 ℃ |
使用寿命 | >=16000 小时 | 支持接口 | I2C(4p仅支持,7p支持SPI和I2C) |
0.96OLED 屏幕模块的优点有:
1. 高对比度和高亮度:OLED 屏幕模块可以提供深黑色背景和明亮的字色,因此可以实现高对比度和高亮度的显示效果;
2. 自发光:OLED 屏幕模块不需要背光灯,因此可以实现更薄、更轻的设计;
3. 响应速度快:OLED 屏幕模块的响应速度非常快,可以实现流畅的动画和视频效果;
4. 视角宽:OLED 屏幕模块的视角非常宽,即使从不同角度观察,图像和文字也能保持清晰。
0.96OLED 屏幕模块的缺点有:
1. 显示寿命短:与 LCD 显示屏相比,OLED 的显示寿命相对较短,因为它的有机材料会随着时间的推移而逐渐失效;
2. 显示面积小:0.96 寸 OLED 屏幕模块的显示面积相对较小,因此不适合用于需要大屏幕的应用。
如何驱动OLED屏幕显示内容?
告诉(OLED通讯协议)
The I2C-bus interface gives access to write data and command into the device. Please refer to Figure 8-7 for the write mode of I2 C-bus in chronological order.
告诉哪一个设备,执行的命令和数据。
OLED显示屏(SSD1306)
框图:
简图:
在哪里(GDDRAM)Graphic Display Data RAM
说明:这个显示器128x64,一个字节占8位,64个纵向像素点,可以分成8个PAGE(PAGE0~PAGE7) 。
输入数据时的模式
说明:这个是最常用的模式。指定某一行,数据从第一列到最后一列写入,最后一列写完之后开始从第一列写入。
水平地址模式:
说明: 当最后一列输入完成后自动跳到下一列的第一行开始输入。
垂直地址模式:
说明: 指定一列,数据从page0到page7依次输入数据,输入完成后开始从第二列的page0输入,不断重复。
OLED命令
Software Configuration
SSD1306 has internal command registers that are used to configure the operations of the driver IC. After reset, the registers should be set with appropriate values in order to function well. The registers can be accessed by MPU interface in either 6800, 8080, SPI type with D/C# pin pull low or using I2C interface. Below is an example of initialization flow of SSD1306. The values of registers depend on different condition and application.
SSD1306 内置有用于配置驱动 IC 操作的命令寄存器。复位后,应将寄存器设置为适当的值以确保其正常工作。这些寄存器可通过 MPU 接口以 6800、8080 或 SPI 类型(D/C# 引脚拉低)访问,也可通过 I2C 接口访问。以下是 SSD1306 初始化流程的一个示例。寄存器的值取决于不同的条件和应用。
如何取模
小实验:OLED实验
实验目的
驱动OLED屏幕驱动 OLED 屏幕,显示点、线、字符、字符串、汉字、图片等内容。
硬件清单
OLED屏幕、开发板、ST-Link、USB转TTL
硬件接线
文件代码:
- oled.c文件代码:
.c文件代码的流程:
- 进行SDL和SDA的GPIO口初始化;
- 封装函数,配置IIC的时序图:开始,停止,应答,写时序。
- 配置利用I2C协议,对OLED写数据或指令的函数;
- 封装OLED初始化函数:GPIO初始化函数,OLED初始化命令;
- 封装设置坐标的函数;
- 封装清除屏幕的函数;
- 封装显示一个字符的函数;
- 封装一个显示字符串的函数;
- 封装一个显示汉字的函数;
- 封装一个显示图像的函数。
#include "oled.h"
#include "delay.h"
#include "font.h"void oled_gpio_init(void){GPIO_InitTypeDef gpio_initstruct;OLED_I2C_SCL_CLK();OLED_I2C_SDA_CLK();gpio_initstruct.Pin = OLED_I2C_SCL_PIN;gpio_initstruct.Mode = GPIO_MODE_OUTPUT_OD;gpio_initstruct.Pull = GPIO_PULLUP;gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(OLED_I2C_SCL_PORT,&gpio_initstruct);gpio_initstruct.Pin = OLED_I2C_SDA_PIN;HAL_GPIO_Init(OLED_I2C_SDA_PORT,&gpio_initstruct);}void oled_i2c_start(void){OLED_SCL_SET();OLED_SDA_SET();OLED_SDA_RESET();OLED_SCL_RESET();
}void oled_i2c_stop(void){OLED_SCL_RESET();OLED_SDA_RESET();OLED_SCL_SET();OLED_SDA_SET();
}
void oled_i2c_ack(void){OLED_SCL_SET();OLED_SCL_RESET();
}void oled_i2c_write_byte(uint8_t data){uint8_t i,temp;temp = data;for(i = 0;i < 8 ;i++){if((temp & 0x80) == 0x80)OLED_SDA_SET();elseOLED_SDA_RESET();temp = temp << 1;OLED_SCL_SET();OLED_SCL_RESET();}
}void oled_write_cmd(uint8_t cmd){oled_i2c_start();oled_i2c_write_byte(0x78);oled_i2c_ack();oled_i2c_write_byte(0x00);oled_i2c_ack();oled_i2c_write_byte(cmd);oled_i2c_ack();oled_i2c_stop();
}void oled_write_date(uint8_t data){oled_i2c_start();oled_i2c_write_byte(0x78);oled_i2c_ack();oled_i2c_write_byte(0x40);oled_i2c_ack();oled_i2c_write_byte(data);oled_i2c_ack();oled_i2c_stop();}void oled_init(void){oled_gpio_init();//初始化后要发送一系列的命令要进行发送。delay_ms(100);oled_write_cmd(0xAE); //设置显示开启/关闭,0xAE关闭,0xAF开启oled_write_cmd(0xD5); //设置显示时钟分频比/振荡器频率oled_write_cmd(0x80); //0x00~0xFFoled_write_cmd(0xA8); //设置多路复用率oled_write_cmd(0x3F); //0x0E~0x3Foled_write_cmd(0xD3); //设置显示偏移oled_write_cmd(0x00); //0x00~0x7Foled_write_cmd(0x40); //设置显示开始行,0x40~0x7Foled_write_cmd(0xA1); //设置左右方向,0xA1正常,0xA0左右反置oled_write_cmd(0xC8); //设置上下方向,0xC8正常,0xC0上下反置oled_write_cmd(0xDA); //设置COM引脚硬件配置oled_write_cmd(0x12);oled_write_cmd(0x81); //设置对比度oled_write_cmd(0xCF); //0x00~0xFFoled_write_cmd(0xD9); //设置预充电周期oled_write_cmd(0xF1);oled_write_cmd(0xDB); //设置VCOMH取消选择级别oled_write_cmd(0x30);oled_write_cmd(0xA4); //设置整个显示打开/关闭oled_write_cmd(0xA6); //设置正常/反色显示,0xA6正常,0xA7反色oled_write_cmd(0x8D); //设置充电泵oled_write_cmd(0x14);oled_write_cmd(0xAF); //开启显示
}void oled_set_cursor(uint8_t x,uint8_t y){oled_write_cmd(0xB0 + x);oled_write_cmd((y & 0x0F) | 0x00); //取x的低位oled_write_cmd(((y & 0xF0) >> 4) | 0x10); //取高位
}//清屏函数
void oled_fill(uint8_t data){uint8_t i,j;for (i = 0;i < 8 ;i++){oled_set_cursor(i,0);for(j = 0;j < 128;j++)oled_write_date(data);}
}//封装一个函数,显示任意字符,
void oled_show_char(uint8_t x ,uint8_t y,uint8_t number ,uint8_t size){ //size代表的是高度number = number - ' ';uint8_t i,j,page; //page:表示输入的字符总共需要的PAGEpage = size / 8;if(size % 8 != 0)page ++;for (i = 0;i < page; i++){oled_set_cursor(x+i,y);for (j = size / 2 * i;j < size / 2 * (i + 1); j++){ //size/2:高度的一半是宽度if(size == 16)oled_write_date(ascii_8X16[number][j]); }}
}void oled_show_string(uint8_t x,uint8_t y,char *p ,uint8_t size){while(*p != '\0'){oled_show_char(x,y,*p,size); //*p:取出数组中的首元素y += size / 2;p++; //p++:代表的是数组指针递增,指向下一个元素地址。}
}void oled_show_chinese(uint8_t x,uint8_t y, uint8_t N ,uint8_t size){uint8_t i,j;for (i = 0 ; i < size / 8 ;i++){oled_set_cursor(x+i,y);for(j = size * i;j < size * (i + 1);j++){if(size == 16)oled_write_date(chinese_16X16[N][j]);
// if(size == 24)
// oled_write_date(chinese_24X24[N][j]);}}
}void oled_show_image(uint8_t x,uint8_t y, uint8_t width ,uint8_t highth ,uint8_t * bpm){uint8_t i,j;for(i = 0; i < highth ;i++){oled_set_cursor(x+i,j);for(j = 0;j < width;j++)oled_write_date(bpm[ width * i + j ]);}}
注意:
- 关于写一个字节的函数中,使用的是&位运算符和<<位运算符;
- 写坐标的函数,取高四位和第四位的写法;
- 要多看写一个字符的函数中,for循环函数中的写法;
- 和函数图像函数中的,for循环的函数中的写法。
- olde.h文件代码
#ifndef __OLED_H__
#define __OLED_H__
#include "stm32f1xx.h"#define OLED_I2C_SCL_CLK() __HAL_RCC_GPIOB_CLK_ENABLE()
#define OLED_I2C_SCL_PORT GPIOB
#define OLED_I2C_SCL_PIN GPIO_PIN_6#define OLED_I2C_SDA_CLK() __HAL_RCC_GPIOB_CLK_ENABLE()
#define OLED_I2C_SDA_PORT GPIOB
#define OLED_I2C_SDA_PIN GPIO_PIN_7#define OLED_SCL_RESET() HAL_GPIO_WritePin(OLED_I2C_SCL_PORT,OLED_I2C_SCL_PIN,GPIO_PIN_RESET)
#define OLED_SCL_SET() HAL_GPIO_WritePin(OLED_I2C_SCL_PORT,OLED_I2C_SCL_PIN,GPIO_PIN_SET)#define OLED_SDA_RESET() HAL_GPIO_WritePin(OLED_I2C_SDA_PORT,OLED_I2C_SDA_PIN,GPIO_PIN_RESET)
#define OLED_SDA_SET() HAL_GPIO_WritePin(OLED_I2C_SDA_PORT,OLED_I2C_SDA_PIN,GPIO_PIN_SET)void oled_init(void);
void oled_set_cursor(uint8_t x,uint8_t y);
void oled_fill(uint8_t data);
void oled_write_date(uint8_t data);
void oled_show_char(uint8_t x ,uint8_t y,uint8_t number ,uint8_t size);
void oled_show_string(uint8_t x,uint8_t y,char *p ,uint8_t size);
void oled_show_chinese(uint8_t x, uint8_t y, uint8_t N, uint8_t size);
void oled_show_image(uint8_t x,uint8_t y, uint8_t width ,uint8_t highth,uint8_t * bpm);#endif
注意:在.h文件中进行宏定义,便于后续的修改,和代码的书写方便。
- mian.c文件代码
#include "sys.h"
#include "led.h"
#include "delay.h"
#include "uart1.h"
#include "oled.h"extern const unsigned char image_date[];
extern const unsigned char tigger_image[];int main(void)
{HAL_Init(); /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init(); /* LED初始化 */oled_init();uart1_init(115200);printf("hello,world");oled_fill(0x00);/* 显示一个字母A */
// oled_set_cursor(0,0);
// oled_write_date(0x00);
// oled_write_date(0x00);
// oled_write_date(0xC0);
// oled_write_date(0x38);
// oled_write_date(0xE0);
// oled_write_date(0x00);
// oled_write_date(0x00);
// oled_write_date(0x00);
//
// oled_set_cursor(1,0);
// oled_write_date(0x20);
// oled_write_date(0x3C);
// oled_write_date(0x23);
// oled_write_date(0x02);
// oled_write_date(0x27);
// oled_write_date(0x38);
// oled_write_date(0x20);/*封装一个写任意字符的函数,每一个字符占的宽度是8个像素点*/
//oled_show_char(1,1,'B',16);
//oled_show_char(1,10,'{',16);
//oled_show_char(1,20,'?',16);
//oled_show_char(1,30,'1',16);
//oled_show_char(1,40,'x',16);/*封装一个函数,显示字符串*/
//oled_show_string(3,0,"xys handsome !!!",16);/*封装一个函数,显示字符串*/
//uint8_t i;
//for(i = 0; i < 2; i++){
// oled_show_chinese(0,i*16,i,16);
//}/*封装一个函数,显示字符串*/oled_show_image(0,0,128,8,(unsigned char *)image_date);while(1){
// for(uint8_t i = 0;i < 128;i++)
// oled_write_date(0x80);
// break;
// led1_on();
// led2_off();
// delay_ms(500);
// led1_off();
// led2_on();
// delay_ms(500);}
}
若要显示字符,图像,汉族等内容,需创建一个font.h文件用来存储取模后的十六进制的数据,如下所示:
- font.h文件代码
#ifndef __FONT_H__
#define __FONT_H__//汉字
const unsigned char chinese_16X16[][32] = {0x00,0x80,0x60,0xF8,0x07,0x40,0x20,0x18,0x0F,0x08,0xC8,0x08,0x08,0x28,0x18,0x00,0x01,0x00,0x00,0xFF,0x00,0x10,0x0C,0x03,0x40,0x80,0x7F,0x00,0x01,0x06,0x18,0x00,/*"你",0*/0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,/*"好",1*/};//图像
const unsigned char image_date[] = {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,
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,0x80,0x80,0x80,
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x80,0x80,0x80,0x80,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,0xFC,0x04,0x02,0xE2,
0x32,0x12,0x92,0x72,0x22,0x14,0x0C,0x04,0x04,0x82,0x42,0x21,0x21,0xA0,0x20,0x20,
0x40,0x80,0x02,0x12,0x52,0x7E,0x53,0x50,0x80,0x40,0x40,0x40,0x40,0x40,0x41,0x81,
0x02,0x06,0x06,0x0A,0x11,0x39,0x49,0x89,0x09,0x09,0x19,0xB1,0xE1,0x86,0x78,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x40,0x40,
0x40,0xE0,0xF0,0x90,0x18,0x08,0x08,0x08,0x08,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,0x07,0x38,0xE1,
0x1F,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x81,0x02,0x02,0x02,0x02,0x02,
0x01,0xE0,0x20,0x20,0xE0,0x00,0x00,0x01,0x02,0x04,0x06,0x04,0x04,0x04,0x04,0x02,
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x3B,0xC1,0x61,0x1C,0x83,0x80,0x80,
0x80,0x80,0x80,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xF8,0x87,0x81,0x80,0x00,
0x00,0x01,0x01,0x01,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,0x3F,
0xC0,0x00,0x00,0x00,0x00,0x00,0x12,0x13,0x11,0x19,0x08,0x08,0x00,0x00,0x00,0x00,
0x03,0x05,0x18,0x08,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x94,
0x34,0x24,0x66,0x42,0x02,0x00,0x00,0x00,0x00,0xE0,0x9F,0x01,0x01,0x01,0x00,0x00,
0x0C,0x10,0x08,0x18,0x10,0x00,0x04,0x1C,0x00,0x00,0x0C,0x18,0x00,0x0C,0x19,0x83,
0x82,0xFE,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,0x03,0x0C,0x10,0x20,0x40,0x80,0x0E,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x0C,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x01,
0x01,0x03,0x02,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x61,0x21,0x31,0x19,0x0E,0x02,
0x02,0x02,0x02,0x7E,0x42,0x02,0x02,0x02,0x02,0x02,0x06,0x1E,0x71,0x41,0x03,0x03,
0x04,0x08,0x18,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,0x01,0x01,0x02,0x02,0x04,0x04,0x08,0x08,0x08,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x08,0x08,0x04,0x04,0x02,
0x02,0x01,0x01,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,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,/*"C:\Users\86182\Desktop\小老虎.bmp",0*/};const unsigned char ascii_8X16[][16]=
{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
注意:
- 关于数据的数据类型是 const unsigned char;
- 对于二维数组来说,列数一定要设置正确,否则显示会出问题。
- 字符,汉字是二维数组,图像是一维数组。