目录

一、IIC协议简介

IIC总线通讯(Inter-Integrated Circuit)

IIC总线物理层

IIC总线协议层

(一)空闲状态

(二)起始和停止信号

(三)应答信号

(四)数据的有效性

(五)七位地址的传输

(六) IIC的数据传输

(七)IIC基本读写过程

1. 主机写数据到从机(写格式)

2. 主机在从机读数据(读格式)

3. 通讯复合格式

二、OLED屏幕

(一)OLED简介

(二)OLED屏幕常用指令

(三)OLED打点显示字符方式

三、IIC+OLED代码

(一)硬件IIC配置OLED

(1)oled.c

(2)oled.h

(3)main.c

(4)codetab.h

(5)delay.c

(二)软件IIC配置OLED


一、IIC协议简介

IIC总线通讯(Inter-Integrated Circuit)

中文名:集成电路总线,特点:硬件结构简单、成本低、引脚少、近距离、低速的芯片之间的通信,不需要UASRT,CAN通讯协议的外部收发设备,属于半双工的通信方式。广泛使用在系统内多个集成电路IC(integratedcircuit )间的通讯(适用于电路板上芯片间交互一些简单的数据)。由于抗干扰能力差一些,带宽要求高的场合不适用。
        IIC通信的同步仲裁自动进行的,可以了解,但不必掌握。

IIC总线物理层

在一个IIC通讯总线中,支持多个通讯主机及多个通讯从机,可连接多个IIC通讯设备。每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备直接的访问。

一个IIC总线由SCL(串行时钟线)和SDA(双向串行数据线)两根线组成:

1. 数据线即用来表示数据(双向串行):设备输出电路用于向SDA线上发送数据;输入电路用于接收SDA线上的数据;

2. 时钟线用于数据收发同步时钟信号从始至终都是由主设备发送

各设备的SDA是“与”关系,SCL也是“与”关系: 总线空闲时设备都是开漏输出,由电路中的上拉电阻Rp使SDA和SCL都保持高电平。当任一设备输出低电平时都会使总线上的信号线变低。

1. 当IIC设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态,由上拉电阻把总线拉成高电平

2. 每个设备都可作为主机/从机且都有唯一的7/10位地址(7位的地址更多),但同一时刻只能有一个主机控制总线。在多个主机同时使用总线时,为了防止数据冲突,IIC会自启动仲裁功能,决定哪个设备先占用总线。

3. IIC三种传输模式:标准模式传输速率为100kbit/s快速模式400kbit/s,高速模式下可达3.4M/s,但目前大多IIC设备尚不支持高速模式。连接到总线的接口数量只由总线电容是 400pF 的限制决定。

IIC总线协议层

IIC的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等。

(一)空闲状态

在总线未被主机占用时,电路中的上拉电阻 Rp 使 SDA 和 SCL 线保持高电平状态,并等待主机启用总线。

(二)起始和停止信号

起始和停止条件一般由主机产生,总线在起始条件后被认为处于忙的状态 在停止条件的某段时间后,总线再次处于空闲状态。

1. 起始条件:在 SCL 线是高电平时 SDA 线从高到低的跳变

2. 停止条件:在 SCL 线是高电平时 SDA 线由低到高的跳变

3. 重复起始:在不产生停止条件时产生重复起始条件,会让总线一直处于忙的状态,该条件的功能和起始条件一样。

(三)应答信号

发送器每发送一个字节,会在第九个时钟脉冲期间释放数据线(低电平),由接收器反馈一个响应(ACK/NACK)。

1. ACK(应答信号):应答信号为低电平(0),表示接收器已经成功地接收了该字节;

2. NACK(非应答信号):  应答信号为高电平(1)时,一般表示接收器接收该字节没有成功。

1. 对于反馈有效应答位ACK的要求是:接收器在第九个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。

2. 当从机不能响应从机地址时(例如它正在执行一些实时函数不能接收或发送),从机必须使数据线保持高电平(相当于NACK),主机再产生一个停止信号终止传输或者产生重复起始条件开始新的传输。

3. 如果接收器是主机,则在它收到最后一个字节后,发送一个NACK信号,以便通知发送器(从机)停止发送,并释放SDA线,以便主机发送一个停止信号P。(数据传输中有图例)

(四)数据的有效性

在IIC总线进行数据传输时,SCL时钟信号为高电平期间,SDA数据线上的数据必须保持稳定。只有在SCL时钟线上的信号低电平期间,SDA数据线上的电平状态才允许变化。SDA数据线在SCL的每个时钟周期传输一位数据

(五)七位地址的传输

起始信号后发送的第一个字节(8位)从机地址+数据方向位
        从机地址共有 7 位,紧接着的第 8 位数据方向位 R/ W(表示从机进行读/写)操作。
        “0” 表示“写”发送数据,“1” 表示“读”请求数据。

(六) IIC的数据传输

数据位传输:边沿触发。 在IIC总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。

1. 发送到 SDA 线上的每个字节必须为 8 位,每次传输的字节数量不受限(字节为单位)。

2. 传输的数据方向:从高位->低位(第八位(R/W)->第七位->......->第一位)。

3. 每个字节后必须跟一个应答信号,若从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟线 SCL 保持低电平迫使主机进入等待状态,当从机准备好接收下一个数据字节并释放时钟线 SCL 后 数据传输继续。

4. 在某些情况下,可以用与IIC总线格式不一样的格式(例如兼容 CBUS 的器件)。甚至在传输一个字节时)可以通过产生停止条件来终止,此时不会产生响应 (遇到这种再说)。

此图片转自:
(12条消息) I2C协议靠这16张图彻底搞懂(超详细)_小麦大叔的博客-CSDN博客_i2c电路图

IIC基本读写过程

数据传输一般由主机产生的停止位 P 终止,起始信号和停止信号均由主机发送,在起始条件后面不能立刻跟着一个停止条件主机和从机均可以当发送器/接收器

1. 主机写数据到从机(写格式)

①S:起始信号(主机使用总线)                               
②SLAVE ADDRESS:从机地址 (7位/10位)
一般是7位,当主机广播的地址与某个设备的地址相同时,这个设备就被选中了,没被选中的设备将会忽略之后的数据信号。
③R/W:数据方向位(R/W = 1/0,包含在含有从机地址的字节中),主机读/写数据(接收器/发送器)
④A(ACK)/A~(NACK):响应位(应答信号/非应答信号),发送器接收到接收器的应答信号(ACK)后才会发送下一个字节数据。
⑤DATA:传输的字节数据                         
⑥P:停止信号(数据传输结束,总线恢复空闲状态)

        IIC写数据过程:主机发送起始信号(S)->从机地址(SLAVE ADDRESS,由主机广播寻址,从机地址7/10位+R/W1位数据方向位)->等待从机反馈应答信号(ACK)->主机传输字节数据->等待从机反馈应答信号(ACK)->...(n个字节+ACK(应答信号))...->主机发送停止信号(P)(主机传输完毕,总线回归空闲状态)

当从机不能响应主机时,从机在第九个时钟脉冲时,必须使数据线保持高电平(非应答信号NACK),主机会产生一个停止条件终止传输或者产生重复起始条件开始新的传输。

2. 主机在从机读数据(读格式)

        IIC读数据过程:主机发送起始信号(S)->从机地址(SLAVE ADDRESS,由主机广播寻址,从机地址7/10位+R/W 1位数据方向位)->等待从机反馈应答信号(ACK)->从机传输字节数据->等待主机反馈应答信号(ACK)->...(n个字节+ACK(应答信号))...->当从机传输完毕/主机不想接收时,主机会发送非应答信号(NACK)->主机发送停止信号(P)

(传输完毕,总线回归空闲状态)

3. 通讯复合格式

在1和2中,主机接收/发送最后一个数据字节后仍希望在总线上通讯,则在接收器反馈最后一个响应位(ACK/NACK)后,主机不发送停止信号,并产生一个重复起始条件 Sr发送一个字节寻址相同/不同从机地址+R/W位)。在这种传输过程中,可以有不同的读/写格式结合

        复合传输过程:主机发送起始信号->主机寻址从机地址(主机广播自动寻址,从机地址7/10位+R/W 1位数据方向位)->接收从机反馈应答信号(ACK)->发送器传输字节数据->等待接收器反馈应答信号(ACK)->...(n个字节+ACK)...->接收器反馈最后一个响应后 ->
        主机发送一个Sr(重复起始信号)->主机寻址从机地址(包含数据方向位)->接收从机反馈应答信号(ACK)->发送器传输字节数据->等待接收器反馈应答信号(ACK)->...(n个字节+ACK)...->当最后一个接收器反馈应答/非应答信号(ACK/NACK)后,主机发送停止信号(P)(传输完毕,总线回归空闲状态)

复合格式运用最多,通讯复合格式与其他方式的区别:多了一个Sr(重复起始信号),且在Sr条件前主机不发送停止信号(P)。

同一个外设运用IIC复合格式来传输:发送起始信号后,先写,然后发送重复起始信号,再读。eg:EEPROM: 起始信号 -> 写EEPROM设备地址+写 -> 写EEPROM的寄存器地址 -> 重复起始信号 -> 写EEPROM设备地址+读 -> 读取EEPROM里面寄存器保存的数据。(之后会有51代码附上)。

二、OLED屏幕

     OLED简介

        这里用的是4根线的OLED:VCC、GND、SCL、SDA。OLED本身是没有显存的,他的现存是依赖SSD1306提供的,而SSD1306提供一块显存。SSD1306显存总共为128*64bit大小,SSD1306将这些显存分成了8页。每页包含了128个字节(一页就是8行,每一行128列,不过我们一般说一页),每一页垂直分布,一个字节数据就占一页的一列

STM32内部建立一个缓存(共128*8个字节),每次修改的时候,只是修改STM32上的缓存(实际上就是SRAM),修改完后一次性把STM32上的缓存数据写入到OLED的GRAM。但SRAM很小的51就很麻烦。

       OLED屏幕常用指令

    ·命令0X81: 设置对比度。包含两个字节,第一个0X81为命令,随后方法是的一个字节要设置这个对比度,值越大屏幕越亮。

    ·命令0XAE/0XAF: 0XAE为关闭显示命令,0XAF为开启显示命令

    ·0X8D: 包含两个字节,第一个为命令字,第二个为设置值,第二个字节的BIT2表示电荷泵的开关状态,该位为1开启电荷泵,为0则关闭。模块初始化的时候,这个必须要开启,否则看不到屏幕显示

    ·命令0XB0~B7:用于设置页地址,其低三位的值对应GRAM页地址。

    ·命令0X00~0X0F:用于设置显示时的起始列地址低四位。

   ·命令0X10~0X1F: 用于设置显示时的起始列地址高四位。

      OLED打点显示字符方式

从左往右,从下往上开始画一页的一列(一个8位二进制),OLED会自动跳到下一列。
字模选择的取模方式为“列行式”。

三、IIC+OLED代码

IIC总线配置概述

硬件IIC:对应芯片上的IIC外设,有相对应的IIC驱动电路,其所使用的IIC管脚也是专用的(默认复用功能/重映射);

软件IIC:一般是GPIO的任意管脚,用软件控制管脚状态以及模拟IIC通信波形。

区别:硬件IIC的效率要远高于软件的,而软件IIC不受引脚限制,接口比较灵活。

1.硬件IIC用法复杂,模拟IIC流程更加清楚

2.硬件IIC速度比模拟快,并且可以用DMA

3.模拟IIC可以在任何管脚上,硬件IIC在固定管脚上

关键硬件IIC必须使用已经配置好引脚,去查引脚资料即可,且用库函数已经封装好的函数按照所需格式来写IIC传输过程。而软件IIC是任意使用引脚,但什么都要自己写,不过没硬件IIC那么复杂,最重要的是时序问题(就是延时,这个很重要,有的延时用了会出bug)。

(一)硬件IIC配置OLED

        MCU为主发送器,硬件IIC按下面的IIC传输图来组装代码,这幅图和之前介绍的有点不一样,图也有点问题,且EVx事件在IIC传输中相当于代替了应答信号(32的库函数都封装好了这些事件的检测函数,直接调用即可),但是不影响。

(1)oled.c

#include "stm32f10x.h"
#include "oled.h"
#include "delay.h"    //定时器延时,其他延时有的会出bug(时序问题,改了好久,还是定时器好用)
#include "codetab.h"  //里面放了OLED的字符库//OLED存放格式
//[0]0 1 2 3 ... 127
//[1]0 1 2 3 ... 127
//[2]0 1 2 3 ... 127
//[3]0 1 2 3 ... 127
//[4]0 1 2 3 ... 127
//[5]0 1 2 3 ... 127
//[6]0 1 2 3 ... 127
//[7]0 1 2 3 ... 127
//共有8页,每一页相当于8行(但一般说页),每一页都有128列
//页数垂直分布(0~7页),都是一页一页的写
//一页刚好用一个8位二进制表示 1点亮 0熄灭//定义IIC结构体、配置IIC结构体、初始化IIC结构体、使能IIC结构体
//定义GPIO结构体、配置GPIO结构体、初始化GPIO结构体
void I2C_Configuration(void)
{I2C_InitTypeDef   I2C_InitStructure;  GPIO_InitTypeDef   GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,  ENABLE); RCC_APB1PeriphClockCmd( RCC_APB1Periph_I2C1, ENABLE );  //打开IIC时钟外设//PB6 --SCL ;PB7 --SDAGPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_OD;     //开漏输出(IIC协议规定要外接上拉电阻,这个模式记住就好)GPIO_InitStructure.GPIO_Pin   =  GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);I2C_DeInit(I2C1);         //功能:将I2C1外设寄存器重设为默认值,避免受之前配置的影响I2C_InitStructure.I2C_Ack  =  I2C_Ack_Enable;        //IIC应答使能I2C_InitStructure.I2C_AcknowledgedAddress =  I2C_AcknowledgedAddress_7bit;I2C_InitStructure.I2C_ClockSpeed = 400000 ;          //快速模式I2C_InitStructure.I2C_DutyCycle  = I2C_DutyCycle_2 ; //时钟占空比,有2个,都相差不大I2C_InitStructure.I2C_Mode =  I2C_Mode_I2C;          //工作模式,共有三个(IIC不需要在此区分主、从模式[2个SMBus],故用I2C_Mode_I2C即可,其他2个模式不必深究I2C_Mode_SMBusDevice和I2C_Mode_SMBusHost)I2C_InitStructure.I2C_OwnAddress1 = 0X30 ;           //自身的IIC地址,自己随便定义一个I2C_Init(I2C1,&I2C_InitStructure );                   //初始化IIC结构体            I2C_Cmd(I2C1,ENABLE);                                //使能IIC}//硬件IIC,就是直接用配好的函数按照IIC传输图敲代码组装就行
//这里就是用封装好的函数按照IIC写格式来组装IIC传输字节模块
void I2C_WriteByte(uint8_t addr,uint8_t data)
{while (I2C_GetFlagStatus(I2C1,  I2C_FLAG_BUSY));  //检查IIC总线是否繁忙,忙为1,继续等待I2C_GenerateSTART(I2C1,  ENABLE);                 //开启I2C1,相当于起始信号while( !I2C_CheckEvent(I2C1,  I2C_EVENT_MASTER_MODE_SELECT)); //检查是否为EV5事件,是就跳出循环(相当于应答信号,有这事件就相当于应答,虽然奇怪,但谁让人家这么规定呢)I2C_Send7bitAddress(I2C1,OLED_ADDRESS, I2C_Direction_Transmitter); //写从机地址+写位while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //检测主机发送事件,相当于应答信号,有(1)为应答,所以检测应答的都加了!I2C_SendData(I2C1,  addr);         //写从机寄存器的地址(就是要往OLED的哪个地方写数据)while(!I2C_CheckEvent(I2C1,  I2C_EVENT_MASTER_BYTE_TRANSMITTING));I2C_SendData(I2C1,  data);         //写入数据while(!I2C_CheckEvent(I2C1,  I2C_EVENT_MASTER_BYTE_TRANSMITTING));I2C_GenerateSTOP( I2C1,  ENABLE);  //关闭IIC总线(相当于结束信号)}//往OLED写命令 或 地址
void WriteCmd(unsigned char I2C_Command)
{I2C_WriteByte(0X00,I2C_Command);  //0x00:OLED放指令的寄存器地址}//往OLED写数据 前提是已经写了OLED的地址和它里面哪个寄存器地址,不然不知道数据存放在OLED的哪里
void WriteDat(unsigned char I2C_Data)
{I2C_WriteByte(0x40,I2C_Data);    //0x40:OLED放数据的寄存器地址}//厂家给的,还挺多
void OLED_Init(void)
{delay_ms(100); WriteCmd(0xAE); //display offWriteCmd(0x20);    //Set Memory Addressing Mode    WriteCmd(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page             Addressing Mode (RESET);11,InvalidWriteCmd(0xb0);   //Set Page Start Address for Page Addressing Mode,0-7WriteCmd(0xc8);    //Set COM Output Scan DirectionWriteCmd(0x00); //---set low column addressWriteCmd(0x10); //---set high column addressWriteCmd(0x40); //--set start line addressWriteCmd(0x81); //--set contrast control registerWriteCmd(0xff); //ÁÁ¶Èµ÷½Ú 0x00~0xffWriteCmd(0xa1); //--set segment re-map 0 to 127WriteCmd(0xa6); //--set normal displayWriteCmd(0xa8); //--set multiplex ratio(1 to 64)WriteCmd(0x3F); //WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM contentWriteCmd(0xd3); //-set display offsetWriteCmd(0x00); //-not offsetWriteCmd(0xd5); //--set display clock divide ratio/oscillator frequencyWriteCmd(0xf0); //--set divide ratioWriteCmd(0xd9); //--set pre-charge periodWriteCmd(0x22); //WriteCmd(0xda); //--set com pins hardware configurationWriteCmd(0x12);WriteCmd(0xdb); //--set vcomhWriteCmd(0x20); //0x20,0.77xVccWriteCmd(0x8d); //--set DC-DC enableWriteCmd(0x14); //WriteCmd(0xaf); //--turn on oled panel
}//设置OLED显示的起点位
void OLED_SetPos(unsigned char x,unsigned char y)
{WriteCmd(0xb0 +y);WriteCmd((x&0xf0)>>4|0x10); //列的高四位,0x10~0x1F为起始列的高四位WriteCmd((x&0x0f)|0x01);    //这里要注意去掉0x01,不然永远无法在第一列开始画显示,0x00~0x0F表示起始列的低四位}//填屏,输入0xff全亮
void OLED_Fill(unsigned char Fill_Data)
{unsigned char m,n;for(m=0;m<8;m++){WriteCmd(0xb0+m);   //页WriteCmd(0x00);       //起点列低四位WriteCmd(0x10);     //起点列高四位for(n=0;n<128;n++){WriteDat(Fill_Data);}}
}//清屏,黑屏
void OLED_CLS(void)
{OLED_Fill(0x00);
}//OLED打开
void OLED_ON(void)
{WriteCmd(0X8D);  //设置电荷泵 (OLED手册有)WriteCmd(0X14);  //开启电荷泵WriteCmd(0XAF);  //OLED唤醒}//OLED关闭
void OLED_OFF(void)
{WriteCmd(0X8D);  //设置电荷泵WriteCmd(0X10);  //关闭电荷泵WriteCmd(0XAE);  //关闭OLED}//OLED显示字符串
//列、页、字符串、字符大小 TextSize = 1和2
void OLED_ShowStr(unsigned char x,unsigned y,unsigned char ch[],unsigned TextSize)
{unsigned char c = 0,i = 0,j = 0;switch(TextSize){case 1:{while(ch[j] != '\0'){c = ch[j] - 32;     //ASCII - 32 = OLED字符库(也可自己定义)对应的字符编码if(x>126)          //OLED屏幕是否装不下了 128%6=2 所以超过126要换行{x = 0;        //列清0  y++;          //换下一页}OLED_SetPos(x,y); //设置OLED显示的起点坐标for(i=0;i<6;i++)WriteDat( F6x8[c][i] );    //二维数组保存了点亮字符所需要的数据(大小为一页6列)x+=6 ;            //OLED 画下一个字符的起始列(一个字符占6列)j++;              //下一个字符}}break;case 2:{while(ch[j] !='\0'){c= ch[j] - 32;if(x >120)        //可以不用铺满一整行OLED换行,美观{x = 0;y+=2 ;    //一个字符占2页,所以满屏时换下2行}OLED_SetPos(x,y);for(i = 0;i<8;i++)WriteDat( F8X16[c*16+i] ); //这一维数组里面,装的字符大小为2页8列OLED_SetPos(x,y+1);for(i = 0;i<8;i++)WriteDat( F8X16[c*16+i+8] );x+=8;j++;}}break;}
}         //显示单个汉字 在软件里复制的汉字库放在codetab.h中
void OLED_ShowCN(unsigned char x,unsigned char y,unsigned char N)
{unsigned char wm=0;unsigned int addr = 32*N; //一个字符要32个数据表示 大小为2页16列if(addr >= 128) {x = 0;y += 2;     }OLED_SetPos(x,y);for(wm=0;wm<16;wm++)      //一个字符占16列{WriteDat( F16X16[addr]);addr += 1;  }OLED_SetPos(x,y+1);   //还要占2页for(wm=0;wm<16;wm++){WriteDat( F16X16[addr]);addr += 1;}
}//显示图片
void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[])
{unsigned int j=0;unsigned char x,y;if(y1%8 == 0) //我是觉得这个if else 多此一举,压根没啥用y = y1/8;elsey = y1/8 +1;for(y=y0;y<y1;y++){OLED_SetPos(x0,y);for(x=x0;x<x1;x++){WriteDat(BMP[j++]);}}
}

(2)oled.h

#ifndef _OLED_H_
#define _OLED_H_
#include "stm32f10x.h"
#define OLED_ADDRESS 0x78void I2C_Configuration(void);
void I2C_WriteByte(uint8_t addr,uint8_t data);
void WriteCmd(unsigned char I2C_Command);
void WriteDat(unsigned char I2C_Data);
void OLED_Init(void);
void OLED_SetPos(unsigned char x,unsigned char y);
void OLED_Fill(unsigned char Fill_Data);
void OLED_ON(void);
void OLED_OFF(void);
void OLED_ShowStr(unsigned char x,unsigned y,unsigned char ch[],unsigned TextSize);
void OLED_ShowCN(unsigned char x,unsigned char y,unsigned char N);
void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[]);#endif

(3)main.c

#include "stm32f10x.h"
#include "delay.h"
#include "oled.h"
extern  const unsigned char BMP1[];int main(void)
{initSysTick();      //滴答定时器初始化I2C_Configuration();  //硬件IIC配置OLED_Init();           //初始化OLEDdelay_ms(2000);OLED_Fill(0XFF);    //全屏亮delay_ms(2000);OLED_Fill(0X00);    //全屏灭delay_ms(2000);while(1){OLED_DrawBMP(0,0,128,8,(unsigned char*) BMP1);}
}

(4)codetab.h

#ifndef   _code_H_
#define   _code_H_
unsigned char F16X16[] =
{0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00,/*"ζÈ",0*/0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,/*"ʪ¶È",1*/
};
const unsigned char F6x8[][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
};
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
};unsigned char BMP1[] =
{ 0X32,0X01,0X00,0X80,0X00,0X3B,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
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,0X80,0X80,0X80,0XC0,0XC0,
0XC0,0XC0,0XC0,0XC0,0XC0,0XE0,0X60,0X60,0X60,0X60,0X70,0X70,0X30,0X30,0X30,0X30,
0X38,0X38,0X60,0X40,0XC0,0XC0,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,0X80,0X80,0X80,0X80,0XC0,0XC0,0XC0,0X40,0X40,
0X60,0X60,0X20,0X20,0X30,0X30,0X10,0X10,0X18,0X18,0X18,0X0C,0X0C,0X0C,0X0E,0X0E,
0X0F,0X87,0XA7,0XA7,0X87,0XDD,0XDD,0XDD,0XDD,0XCD,0XCD,0XCD,0XC9,0XC1,0X41,0X51,
0X11,0X21,0X21,0X09,0X09,0X0D,0X2D,0X25,0X07,0X17,0X17,0X17,0X13,0X1B,0X09,0X09,
0X0C,0X0C,0X0C,0X0E,0X0F,0X0F,0X0F,0X06,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,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,0X00,0X40,0X40,0X20,
0X20,0X20,0X10,0X10,0X18,0X08,0X0F,0X07,0X87,0XC5,0XC1,0X40,0X40,0X40,0X60,0X60,
0X60,0X60,0XF0,0XFC,0XFC,0XFC,0XBC,0XBE,0XBE,0X3E,0X3E,0X3E,0X1E,0X1F,0X0F,0X03,
0X13,0X11,0X11,0X08,0X08,0X0C,0X0C,0X06,0X17,0X17,0X13,0X1B,0X19,0X18,0X18,0X18,
0X18,0X38,0X3C,0X3C,0XFC,0XDC,0XCC,0X84,0X84,0X84,0X04,0X06,0X02,0X02,0X02,0X02,
0X02,0X02,0X02,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X60,0XE0,0XE0,0XE0,0XE0,0XF0,0X70,0X31,0X10,0X10,0X10,0X10,0X30,0X10,
0X08,0X00,0X00,0X00,0X00,0X00,0X00,0X11,0X00,0X20,0X60,0X40,0XC0,0XC0,0XC0,0X90,
0X90,0X91,0X91,0XB1,0XB1,0XA1,0XA0,0XA0,0XA0,0XA0,0XE0,0XE0,0XE0,0XC0,0X40,0X00,
0X20,0X20,0X00,0X00,0X00,0X00,0X00,0X00,0X02,0X02,0X02,0X02,0X02,0X02,0X02,0X02,
0X02,0X03,0X03,0X03,0X03,0X03,0X03,0X03,0X03,0X03,0X01,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,0X0E,0X3F,0X63,0X81,0X00,0X00,0X00,0X00,0X0C,0X0C,0X0C,0X14,0X14,
0X14,0X54,0X54,0X54,0X54,0X54,0X14,0X14,0X14,0X1C,0X0C,0X08,0X08,0X08,0X00,0X01,
0X01,0X01,0X01,0X01,0X83,0X83,0X83,0X83,0X03,0X12,0X12,0X12,0X10,0X10,0X10,0X10,
0X30,0X30,0X30,0X32,0X72,0XF2,0XF2,0XF2,0XF2,0X32,0X32,0X32,0X32,0X22,0X22,0X26,
0X26,0X26,0X06,0X04,0X4C,0X4C,0X0C,0X0C,0X18,0X18,0X18,0X18,0X30,0X30,0X30,0X20,
0X20,0X20,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,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,0X00,0X00,0X02,0X02,0X02,0X00,
0X00,0X00,0X00,0X00,0X01,0X01,0X01,0X01,0X03,0X27,0X43,0X43,0X83,0X83,0X83,0X82,
0X83,0X83,0X83,0X83,0X83,0X83,0X83,0X83,0XC3,0X43,0X42,0X42,0X40,0X40,0X60,0X60,
0X60,0X60,0X60,0X68,0X70,0X71,0X61,0X63,0X43,0X03,0X03,0X03,0X03,0X02,0X02,0X02,
0X02,0X02,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,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,0X03,0X06,0X04,0X08,0X08,0X10,
0X10,0X10,0X20,0X20,0X20,0X30,0X30,0X70,0X60,0X60,0X70,0X70,0X70,0X38,0X38,0X19,
0X0D,0X0D,0X0F,0X07,0X03,0X03,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,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
};
#endif

(5)delay.c

#include "delay.h"
#include "stm32f10x.h"void initSysTick(void)
{SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);   //设置时钟源8分频SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;              //使能中断SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;               //开定时器SysTick->LOAD = 9;                                      //随意设置一个重装载值
}void delay_us(u32 xus)
{SysTick->LOAD = 9 * xus;                               //计9次为1us,xus则重装载值要*9SysTick->VAL = 0;                                      //计数器归0while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); //等待计数完成
}void delay_ms(u32 xms)
{SysTick->LOAD = 9000;                                 //计数9次为1us,9000次为1ms   SysTick->VAL = 0;                                     //计数器归0   while (xms--){while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); //等待单次计数完成}
}

(二)软件IIC配置OLED

(原本OLED是要结合DHT11使用,但也可以用OLED显示字符/数字/图案等验证)
        (注意IIC传输一般都是以字节为单位,数据从高位开始向低位传输)
        模拟IIC就是结合外设所需的IIC传输格式,写出所需的各个部分;OLED用到IIC传输的写格式,按照下面几幅图编写4个部分结合第五幅图把四个部分组装起来就变成一次完整的IIC传输
        组装好IIC传输过程之后就可以编写OLED显示字符、汉字、图像等函数。
        (注:按写格式组装OLED的IIC传输一个字节数据的过程需要连续传输三种数据才能实现[分别是OLED本身的地址OLED写入数据/指令[驱动指令/OLED显示的页地址和列地址]的寄存器地址需要写入的字节数据])

   

(1)起始信号                                                  (2)结束信号

(3)发送字节,连续发送8位数据

(4)响应信号

(5)IIC传输的写格式(灰色部分是MCU发送,白色部分是OLED发送)

#include "stm32f10x.h"
#include "oled.h"
#include "oledfont.h"
#include "delay.h"void OLED_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;  //GPIOB8 和 GPIOB9为SCL、SDAGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  GPIO_Init(GPIOB,&GPIO_InitStructure);   //初始化GPIOB的结构体配置OLED_SCLK_Set();    //时钟线置高OLED_SDIN_Set(); //数据线置高
}/**起始信号**/
static void OLED_IIC_Start(void)
{OLED_SCLK_Set();   //拉高SCKOLED_SDIN_Set(); //拉高SDA,为了保险起见,在写其他IIC时,SDA还是要在SCL之前被置高,确保在SCL置高后的SDA是后面被置低的,不为原来的0,让SDA重新由高电平向低电平转变delay_us(1);OLED_SDIN_CLr();  //拉低SDAdelay_us(1);OLED_SCLK_CLr(); //拉低SCLdelay_us(1);
}/**结束信号**/
static void OLED_IIC_Stop(void)
{OLED_SDIN_CLr();   //在SCL拉高前拉低SDA,确保SCL拉高后,SDA是由低电平向高电平转变,而不是受SDA线原来的数据1影响,本身就是高电平delay_us(1);OLED_SCLK_Set();  //拉高SCLdelay_us(1);OLED_SDIN_Set(); //拉高SDAdelay_us(1);
}//MCU等待响应信号
static unsigned char IIC_Wait_Ack(void)
{unsigned char ack;OLED_SCLK_CLr();         //SCL拉低delay_us(1);OLED_SDIN_Set();         //SDA拉高,MCU释放SDA总线控制[协议规定,总线在空闲状态时为高电平],让SDA线受OLED控制,由OLED发送数据到SDA线上给MCU一个应答/非应答信号delay_us(1);OLED_SCLK_Set();         //拉高SCL,OLED发送应答信号给MCUdelay_us(1);if(OLED_READ_SDIN())       //ׁ判断应答信号ack = IIC_NO_ACK;     //1:非应答elseack = IIC_ACK;           //0:应答OLED_SCLK_CLr();           //拉低SCL,结束响应信号的传输delay_us(1);return ack;
}static void Write_IIC_Byte(unsigned char IIC_Byte)
{unsigned char i;           for(i=0;i<8;i++)              //传输1个字节,IIC传输以字节为单位{OLED_SCLK_CLr();            //拉低SCL准备要发送的一位数据,结束上次的位数据传输delay_us(1);if(IIC_Byte & 0x80)          //ׁ保留最高位,判断发送1/0OLED_SDIN_Set();     elseOLED_SDIN_CLr();        IIC_Byte <<= 1;              //从高位到低位轮流传输delay_us(1);OLED_SCLK_Set();            //SCL线变成上升沿,开始发送数据delay_us(1);}OLED_SCLK_CLr();              //传输字节结束delay_us(1);while(IIC_Wait_Ack());          //等待响应
}/**和硬件IIC不同的是,硬件IIC都是封装好的函数可在配置完外设时钟后,直接进行以下的IIC传输字节函数的编写,软件IIC要手动编写IIC所需的部分**/
/**以上是IIC传输的各个部分,以下是组装成OLED所需的IIC传输部分**/
/**依照IIC写格式来组装代码,集齐4个部分即可(起始信号、传输字节部分、等待响应、结束信号)**//**@brief          往OLED写指令@param         IIC_Command:指令@retval           无*/
static void Write_IIC_Command(unsigned char IIC_Command)
{OLED_IIC_Start();                  //起始信号  Write_IIC_Byte(0x78);               //OLED地址Write_IIC_Byte(0x00);               //OLED存放指令的寄存器地址Write_IIC_Byte(IIC_Command);         //写入指令、地址OLED_IIC_Stop();                      //结束信号
}/**@brief         往OLED写数据@param         IIC_Data:数据@retval          无*/
static void Write_IIC_Data(unsigned char IIC_Data)
{OLED_IIC_Start();Write_IIC_Byte(0x78);             //OLED地址Write_IIC_Byte(0x40);               //OLED存放数据的寄存器地址Write_IIC_Byte(IIC_Data);           //写入数据OLED_IIC_Stop();
}/**@brief         结合了上两个函数,也可一个一个调用@param         dat:数据/指令 cmd:0:往OLED输入指令,1:往OLED输入数据@retval            无*/
void OLED_WR_Byte(unsigned char dat,unsigned char cmd)
{if(cmd) {Write_IIC_Data(dat);    //写数据}else {Write_IIC_Command(dat); //写指令}
}/**以下函数和硬件IIC一样**/
/**@brief          设置OLED显示起点@param           x:起始列,y:起始页@retval          无*/void OLED_Set_Pos(unsigned char x, unsigned char y)
{ OLED_WR_Byte(0xb0+y,OLED_CMD);   //设置页OLED_WR_Byte((x&0x0f),OLED_CMD); //设置列地址低四位地址;0x00~0x0fOLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD); //设置列地址高四位地址; 0x10~0x1f
}                 /*@brief         OLED打开显示@param         无@retval           无*/
void OLED_Display_On(void)
{OLED_WR_Byte(0X8D,OLED_CMD);  //设置OLED电荷泵OLED_WR_Byte(0X14,OLED_CMD);  //打开电荷泵,使能OLED_WR_Byte(0XAF,OLED_CMD);  //开显示
}/*@brief          OLED关闭显示@param         无@retval           无*/
void OLED_Display_Off(void)
{OLED_WR_Byte(0XAE,OLED_CMD);  //关显示OLED_WR_Byte(0X8D,OLED_CMD);  //设置OLED电荷泵OLED_WR_Byte(0X10,OLED_CMD);  //关闭电荷泵,失能
}                    //清屏
void OLED_Clear(void)
{  unsigned char i,n;           for(i=0;i<8;i++)  {  OLED_WR_Byte (0xb0+i,OLED_CMD);    //0~7页依次写入OLED_WR_Byte (0x00,OLED_CMD);      //起始列的低四位地址OLED_WR_Byte (0x10,OLED_CMD);      //起始列的高四位地址for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); //写入0,达到清屏效果}
}
//点亮整块屏幕
void OLED_liang(void)
{  unsigned char i,n;           for(i=0;i<8;i++)  {  OLED_WR_Byte (0xb0+i,OLED_CMD);    OLED_WR_Byte (0x00,OLED_CMD);      OLED_WR_Byte (0x10,OLED_CMD);     for(n=0;n<128;n++)OLED_WR_Byte(0xff,OLED_DATA); //填充屏幕,全亮}
}//显示字符
void OLED_ShouChar(unsigned char x,unsigned char y,unsigned char chr)
{unsigned char c = 0,i=0;c =chr - ' '; if(x>Max_Column)     //是否屏幕越界{x = 0;  y=y+2;           //下2行开始}    if(SIZE == 16)         //2页8列{OLED_Set_Pos(x,y); //设置OLED起始位置,x,y位置开始画点for(i=0;i<8;i++)OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);     //第一页的8列OLED_Set_Pos(x,y+1);for(i=0;i<8;i++)OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);   //第二页的8列}else                 //1页6列 {OLED_Set_Pos(x,y); for(i=0;i<6;i++)OLED_WR_Byte(F6x8[c][i],OLED_DATA);     }}//厂家代码
void OLED_Init(void)
{OLED_GPIO_Init();  delay_ms(200);  OLED_WR_Byte(0xAE,OLED_CMD);    //ژҕДʾOLED_WR_Byte(0x00,OLED_CMD);  //ʨ׃֍ַ֘OLED_WR_Byte(0x10,OLED_CMD); //ʨ׃ַٟ֘OLED_WR_Byte(0x40,OLED_CMD); //ʨ׃ǰʼѐַ֘OLED_WR_Byte(0xB0,OLED_CMD);   //ʨ׃ҳַ֘OLED_WR_Byte(0x81,OLED_CMD);     // ה҈׈ʨ׃ìࠉʨ׃׈OLED_WR_Byte(0xFF,OLED_CMD);   //  265  OLED_WR_Byte(0xA1,OLED_CMD);   //ʨ׃׎èSEGéքǰʼӳʤַ֘ûcolumnք127ַ֘ˇSEG0քַ֘OLED_WR_Byte(0xA6,OLED_CMD);  //ֽӣДʾû0xa7ŦДʾOLED_WR_Byte(0xA8,OLED_CMD);  //ʨ׃Ƚ֯·˽è16~64éOLED_WR_Byte(0x3F,OLED_CMD); //64dutyOLED_WR_Byte(0xC8,OLED_CMD);    //טӳʤģʽìCOM[N-1]~COM0ɨĨOLED_WR_Byte(0xD3,OLED_CMD); //ʨ׃ДʾƫӆOLED_WR_Byte(0x00,OLED_CMD);    //ϞƫӆOLED_WR_Byte(0xD5,OLED_CMD);   //ʨ׃ְմǷؖƵOLED_WR_Byte(0x80,OLED_CMD);   //ʹԃĬɏֵOLED_WR_Byte(0xD9,OLED_CMD); //ʨ׃ Pre-Charge PeriodOLED_WR_Byte(0xF1,OLED_CMD);  //ʹԃڙ׽ΆݶֵOLED_WR_Byte(0xDA,OLED_CMD);   //ʨ׃ com pin configuartionOLED_WR_Byte(0x12,OLED_CMD);  //ʹԃĬɏֵOLED_WR_Byte(0xDB,OLED_CMD); //ʨ׃ Vcomhìࠉַޚ׈èĬɏéOLED_WR_Byte(0x40,OLED_CMD); ʹԃڙ׽ΆݶֵOLED_WR_Byte(0x8D,OLED_CMD); //ʨ׃OLED֧ۉ҃OLED_WR_Byte(0x14,OLED_CMD); //ߪДʾOLED_WR_Byte(0xAF,OLED_CMD);   //ߪǴOLEDĦѥДʾOLED_Clear();        //ȥǁOLED_Set_Pos(0,0);      //ʨ׃˽ߝдɫքǰʼѐb
}  //显示字符串
void OLED_ShowString(unsigned char x, unsigned char y,unsigned char *chr)
{unsigned char j=0;while(chr[j] != '\0')     //字符串未是否结束{OLED_ShouChar(x,y,chr[j]); //显示字符函数x+=8;                 if(x>=128)            //是否越界,一个字符占2页8列{x= 0 ;y += 2;           //越界则换2页}j++; //字符串下一个字符}
}//݆̣计算m^n次方
unsigned int oled_pow(unsigned char m,unsigned char n)
{unsigned int result=1;     while(n--)result*=m;    return result;
}
void OLED_ShowNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len,unsigned char size)
{           unsigned char t,temp;  unsigned char enshow=0;     for(t=0;t<len;t++){temp=(num/oled_pow(10,len-t-1))%10;if(enshow==0&&t<(len-1)) {if(temp==0) {OLED_ShouChar(x+(size/2)*t,y,' ');continue;}else enshow=1; }OLED_ShouChar(x+(size/2)*t,y,temp+'0'); }
} //显示中文
void OLED_ShowCHinese(unsigned char x,unsigned char y,unsigned char no)
{unsigned char t,adder = 0;OLED_Set_Pos(x,y);if(x>=128) //屏幕是否越界{x=0;y+=2;}for(t=0;t<16;t++){ OLED_WR_Byte( Hzk[2*no][t],OLED_DATA);adder+=1;}OLED_Set_Pos(x,y+1);for(t=0;t<16;t++){OLED_WR_Byte( Hzk[2*no+1][t],OLED_DATA);  //HKZ为显示中文所需数据的数组,可以换adder+=1;}
}

IIC通信协议(STM32学习笔记 一)相关推荐

  1. STM32学习笔记(9)——(I2C续)读写EEPROM

    STM32学习笔记(9)--(I2C续)读写EEPROM 一.概述 1. 背景介绍 2. EEPROM简介 二.AT24C02--常用的EEPROM 1. 电路原理图 2. 写操作 (1)按字节写操作 ...

  2. STM32学习笔记之OLED屏

    STM32学习笔记--OLED屏 OLED屏的特点: 1.  模块有单色和双色可选,单色为纯蓝色,双色为黄蓝双色(本人选用双色): 2.  显示尺寸为0.96寸 3.  分辨率为128*64 4.   ...

  3. stm32学习笔记----双串口同时打开时的printf()问题

    stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...

  4. STM32学习笔记 | 引起电源和系统异常复位的原因

    关注+星标公众号,不错过精彩内容 每一块处理器都有复位的功能,不同处理器复位的类型可能有差异,引起复位的原因也可能有多种. STM32的复位功能非常强大,可通过软件.硬件和一些事件触发系统复位,而且通 ...

  5. 《STM32学习笔记》4——核心功能电路与编程(下)

    接上文,文中的图片,大多数来自视频的截图(来自洋桃电子). 欢迎大家批评指正! STM32学习笔记-专栏 文章目录 一.蜂鸣器驱动 1.蜂鸣器介绍 2.蜂鸣器电路 3.蜂鸣器程序 二. MIDI 音乐 ...

  6. 【STM32学习笔记-点亮LED灯】

    STM32学习笔记-点亮LED灯 文章目录 STM32学习笔记-点亮LED灯 一.原理图分析 二.代码分析 1.mian函数 2.led.c函数 3.led.h函数 4.函数文件整理 5.LED_In ...

  7. STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)

    本篇文章包含的内容 一.TIM 定时器 1.1 TIM 定时器简介 1.2 TIM 定时器类型及其工作原理简介 1.2.1 基本定时器工作原理及其结构 1.2.2 通用定时器工作原理及其结构 1.2. ...

  8. 串口通信协议简介—学习笔记

    串口通信协议简介-学习笔记 文章目录 串口通信协议简介-学习笔记 一.串口.COM口.UART口, TTL.RS-232.RS-485区别详解 1.物理接口形式 2.电平标准 2.1 **TTL** ...

  9. STM32学习笔记(六)丨TIM定时器及其应用(输入捕获丨测量PWM波形的频率和占空比)

    本篇文章包含的内容 一.输入捕获 1.1 输入捕获简介 1.2 输入捕获通道的工作原理 1.3 输入捕获的主从触发模式 1.4 输入捕获和PWMI结构 二.频率的测量方法 2.1 测频法 2.2 测周 ...

  10. STM32学习笔记(15)——SPI协议

    STM32学习笔记(15)--SPI协议 一.SPI协议简介 1. 物理层 2. 协议层 (1) 通讯的开始与停止 (2)时钟极性CPOL.时钟相位CPHA 二.STM32的SPI外设 1. 通讯引脚 ...

最新文章

  1. while 小项目练习
  2. 《MINECRAFT我的世界 新手完全攻略(第3版)》一1.4 关于快照版
  3. Silverlight Telerik RadGridView动态增删行及行列操作(转载)
  4. sap 常用事务代码
  5. WPF学习开发客户端软件-任务助手(下 2015年2月4日代码更新)
  6. vue-devtools 的安装
  7. 通过带数据盘的自定义镜像来创建使用应用程序网关的虚拟机规模集
  8. 为什么async/await方法不能有lock或Monitor
  9. bzoj 4300 绝世好题 —— 思路
  10. hp g6服务器安装系统,HPProLiantDL180G6服务器安装图.PDF
  11. sql算术运算符_SQL中的算术运算符
  12. freebsd查询php5的版本,FreeBSD下查看各软件版本命令
  13. 华兴数控g71外圆循环编程_数控车床加工编程典型实例分析(西门子802S数控系统)...
  14. Python中Collections模块的Counter容器类使用教程
  15. windows python安装包_Python-3.9安装包(windows版)
  16. 如何在终端窗口中在Linux中创建文件?
  17. 正确使用Android性能分析工具——TraceView
  18. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 B. Tomb Raider(二进制枚举)
  19. Android自定义LayoutManager第十一式之飞龙在天
  20. VS2015中更改项目名称

热门文章

  1. 手眼标定算法---Navy算法(Robot sensor calibration: solving AX=XB on the Euclidean group)
  2. 电音(3)音色分类和调制
  3. 什么是百度信息流广告?
  4. 晶圆在低温探针台中的安装方式——Cyanoacrylate粘合剂
  5. python3 scrapy爬取智联招聘存mongodb
  6. vijos 、洛谷 —— 珠心算测验(java实现)
  7. “心脏出血”漏洞可导致密码泄露
  8. 「数据库知识」——SQL处理学生表
  9. 回忆詹姆斯·高斯林的Java时代
  10. CTFHUB-WEB-XSS【05】反射型