• GD32F103 硬件 IIC


    1. 硬件IIC 

    1. 硬件IIC的框图 

    如果MCU做为主机SCL就做为输出,做从机SCL就做为输入。

    主机:

    当MCU作为主机发送数据流程从数据缓冲寄存器里拿到移位寄存器。在从移位寄存器一位一位发送。

    当MCU作为主机接收数据流程先放到移位寄存器。在从移位寄存器放到数据缓冲寄存器。然后读取即可。读取的是一个字节。

    从机:对主机发送的地址进行判断。CRC计算/校验。

    2. 7位地址与10位地址。 

    对于10位地址分两次发。7位地址一次就可以了。

     

    3. 多个主机问题。

    CLK2的决定(以低电平为准)线与功能。

     

     主机2SDA发起。主机1靠边站。

     4. 具体的寄存器

     

    2. OLED介绍 

    1. OLED的简介 

     

     2. OLED IIC通信配置。

    首先OLED要选择通信模式。可以IIC,SPI通信。

    把 BS0,BS1,BS2分别设置成 0,1,0就是选择IIC通信。

     

    64行分成8页。相当于一页有8行。 

     

    一页。6行来显色。 

      

    3. dome (硬件IIC读取LM75以及OLED) 

     1. OLED的唯一地址。(查手册)

     

    2. 主机发送的流程。 (数据手册)

    1.   首先,软件应该使能 I2C 外设时钟,以及配置 I2C_CTL1 中时钟相关寄存器来确保正确
    I2C 时序。使能和配置以后, I2C 运行在默认的从机模式状态,等待 START 信号,随

     后等待I2C总线寻址。

    2.  软件将START位置1,在I2C总线上产生一个START信号。
    3. 发送一个START信号后,l2C硬件将I2C_STATO的SBSEND位置1然后进入主机模式。现
    在软件应该读I2C STATO寄存器然后写一个7位地址位或10位地址的地址头到I2C DATA
    寄存器来清除SBSEND位。当SBSEND位被清O时,I2C就开始发送地址或者地址头到I2C
    总线。如果发送的地址是10位地址的地址头,硬件在发送地址头的时候会将ADD10SEND
    位置1,软件应该通过读I2C STATO寄存器然后写10位低地址到I2C DATA来清除
    ADD10SEND位。
    4.  7位或10位的地址位发送出去之后,I2C硬件将ADDSEND位置1,软件通过读I2C_STAT0
    寄存器然后读l2C_STAT1寄存器清除ADDSEND位。
    5.  l2C进入数据发送状态,因为移位寄存器和数据寄存器I2C DATA都是空的,所以硬件将
    TBE位置1。此时软件可以写第一个字节数据到I2C DATA寄存器,但是TBE位此时不会被
    清零,因为写入I2C DATA寄存器的字节会被立即移入内部移位寄存器。当移位寄存器非
    空时,12C就开始发送数据到总线。
    6.  在第一个字节的发送过程中,软件可以写第二个字节到I2C_DATA,此时TBE会被清零,
    因为I2C_DATA寄存器和移位寄存器都不为空。
    7.  任意时刻TBE被置1,软件都可以向I2C_DATA寄存器写入一个字节,只要还有数据待发送。
    8.  在倒数第二个字节发送过程中,软件写入最后一个字节数据到I2C DATA来清除TBE标志
    位,此后就不用关心TBE位的状态。TBE位会在倒数第二个字节发送完成后被置起,直到
    发送STOP信号时被清零。
    最后一个字节发送结束后,I2C主机将BTC位置起,因为移位寄存器和I2C DATA寄存器此时都
    为空。软件此时应该配置STOP来发送一个STOP信号,此后TBE和BTC状态位都将被清0。

    3. 主机接收的流程。 (数据手册) 

    在主机接收模式下,主机需要为最后一个字节接收产生 NACK ,然后发送 STOP 信号。因此,需
    要特别注意以确保最后接收到数据的正确性。
    1.  首先,软件应该使能l2C外设时钟,以及配置I2C_CTL1中时钟相关寄存器来确保正确的
    12C时序。使能和配置以后,I2C运行在默认的从机模式状态,等待START信号,随后等待
    I2C总线寻址。
    2. 软件将START位置1,从而在I2C总线上产生一个START信号。
    3. 发送一个START信号后,I2C硬件将I2C STATO寄存器的SBSEND位置1然后进入主机模
    式。现在软件应该读I2C STATO寄存器然后写一个7位地址位或10位地址的地址头到
    I2C_DATA寄存器来清除SBSEND位。当SBSEND位被清O时,I2C就开始发送地址或者地
    址头到I2C总线。如果发送的地址是10位地址的地址头,硬件在发送地址头的时候会先将
    ADD10SEND 位置 1 ,软件应该通过读 I2C_STAT0 寄存器然后写 10 位低地址到 I2C_DATA
    来清除 ADD10SEND 位。
    4. 7 位或 10 位的地址位发送出去之后, I2C 硬件将 ADDSEND 位置 1 ,软件应该通过读
    I2C_STAT0 寄存器然后读 I2C_STAT1 寄存器清除 ADDSEND 位。如果地址是 10 位格式,软
    件应该再次将 START 位置 1 来重新产生一个 START 。在 START 产生后, SBSEND 位会被置
    1 。软件应该通过先读 I2C_STAT0 然后写地址头到 I2C_DATA 来清除 SBSEND 位,然后地
    址头被发到 I2C 总线, ADDSEND 再次被置 1 。软件应该再次通过先读 I2C_STAT0 然后读
    I2C_STAT1 来清除 ADDSEND 位。
    5.   当接收到第一个字节时,硬件会将 RBNE 位置 1 。此时软件可以从 I2C_DATA 寄存器读取第
    一个字节,之后 RBNE 位被清 0
    6.   此后任何时候 RBNE 被置 1 ,软件就可以从 I2C_DATA 寄存器读取一个字节。
    7.   接收完倒数第二个字节( N-1 )数据之后,软件应该立即将 ACKEN 位清 0 ,并将 STOP 位置
    1 ,这一过程需要在最后一个字节接收完毕之前完成,以确保 NACK 发送给最后一个字节。
    8.   最后一个字节接收完毕后, RBNE 位被置 1 ,软件可以读取最后一个字节。由于 ACKEN
    经在前一步骤中被清 0 I2C 不再为最后一个字节发送 ACK ,并在最后一个字节发送完毕后
    产生一个 STOP 信号。
    以上步骤要求字节数目 N>1 ,如果 N=1 ,步骤 7 应该在步骤 4 之后就执行,且需要在字节接收完
    成之前完成。

    4. 代码实现 

    lm75a_temp.h

    1. #ifndef __LM75A_TEMP_H
    2. #define __LM75A_TEMP_H
    3. #include "gd32f10x.h"
    4. #include "i2c.h"
    5. #define LM75A_I2C_ADDR 0x9E //LM75A的唯一从机地址
    6. #define LM75A_TEMP_REG 0x00 /* 温度寄存器的指针地址 */
    7. #define LM75A_CONF_REG 0x01 /* 配置寄存器(Conf)*/
    8. #define LM75A_THYST_REG 0x10 /* 滞后寄存器(Thyst) */
    9. #define LM75A_TOS_REG 0x11 /* 过热关断寄存器(Tos) */
    10. float lm75a_get_temp(void); //获取温度传感器的温度值
    11. void lm75a_read_temp_reg(uint8_t lm75a_id, uint8_t *p); //读温度寄存器的值
    12. #endif

    lm75a_temp.c

    1. #include "lm75a_temp.h"
    2. // 读温度传感器的温度寄存器的值并转换为温度值
    3. float lm75a_get_temp(void){
    4. float temp_result;
    5. //读温度寄存器值
    6. uint8_t byte_data[2];
    7. lm75a_read_temp_reg(LM75A_I2C_ADDR, byte_data);
    8. //将温度寄存器值转为温度值
    9. uint16_t temp_reg = byte_data[0]<<3 | byte_data[1]>>5;
    10. if((temp_reg & 0x0400) == 0){
    11. temp_result = temp_reg * 0.125;
    12. }else{
    13. temp_reg = (~((temp_reg&0x03ff)-1)) & 0x03ff; //补码到原码转换
    14. temp_result = temp_reg * (-0.125);
    15. }
    16. return temp_result;
    17. }
    18. /***
    19. 功能:读温度寄存器的值
    20. 输入:
    21. uint8_t lm75a_id: lm75a的iic从机地址
    22. uint8_t *p:读取结果存放的位置
    23. 返回:无
    24. *****/
    25. void lm75a_read_temp_reg(uint8_t lm75a_id, uint8_t *p){
    26. /******给LM75A写温度寄存器的指针字节********/ // 使用了I2C0(主模式)写功能,
    27. while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)); // 如果I2C0繁忙,空等
    28. i2c_start_on_bus(I2C0); // 在I2C0上生成一个起始位
    29. while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)); // 如果起始位还没有发送,空等
    30. i2c_master_addressing(I2C0, lm75a_id, I2C_TRANSMITTER); //发送地址,发送模式
    31. while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)); // 如果地址还没有发送,空等
    32. i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); /* 清除I2C_FLAG_ADDSEND标志位 */
    33. while(!i2c_flag_get(I2C0, I2C_FLAG_TBE)); // I2C_FLAG_TBE标志是否空闲
    34. i2c_data_transmit(I2C0, LM75A_TEMP_REG); // 发送温度传感器的地址
    35. while(!i2c_flag_get(I2C0, I2C_FLAG_TBE)); // I2C_FLAG_TBE标志是否空闲
    36. i2c_stop_on_bus(I2C0); // 停止信号
    37. while(I2C_CTL0(I2C0) & 0x20); // 判断STOP是否发送完成
    38. /******读LM75A温度寄存器里面的两个字节的值********/ //使用了I2C0(主模式)读功能
    39. i2c_ackpos_config(I2C0, I2C_ACKPOS_NEXT); //设置应答的位置配置 (下一个)
    40. while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)); // 如果I2C0繁忙,空等
    41. i2c_start_on_bus(I2C0); // 在I2C0上生成一个起始位
    42. while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)); // 如果起始位还没有发送,空等
    43. i2c_master_addressing(I2C0, lm75a_id, I2C_RECEIVER); //发送地址,接收模式
    44. i2c_ack_config(I2C0, I2C_ACK_DISABLE); /* 从机是否发送ACK应答 */
    45. while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)); /* 地址是否发送完成 */
    46. i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); /* 清除I2C_FLAG_ADDSEND标志位 */
    47. //从I2C_DATA读值
    48. while(!i2c_flag_get(I2C0, I2C_FLAG_BTC)); // 字节是否传输完成
    49. while(!i2c_flag_get(I2C0, I2C_FLAG_RBNE)); // 如果I2C_DATA为空,空等
    50. *p = i2c_data_receive(I2C0);
    51. while(!i2c_flag_get(I2C0, I2C_FLAG_RBNE)); // 如果I2C_DATA为空,空等
    52. *(p+1) = i2c_data_receive(I2C0);
    53. i2c_stop_on_bus(I2C0);
    54. while(I2C_CTL0(I2C0) & 0x200);
    55. i2c_ackpos_config(I2C0, I2C_ACKPOS_CURRENT); // 重新设置应答的位置
    56. i2c_ack_config(I2C0, I2C_ACK_ENABLE);
    57. }

    oled_i2c.h

    1. #ifndef __OLED_H
    2. #define __OLED_H
    3. #include "gd32f10x.h"
    4. #include "i2c.h"
    5. #define OLED_I2C_ADDR 0x78
    6. #define OLED_I2C_CMD_ADDR 0x00
    7. #define OLED_I2C_DATA_ADDR 0x40
    8. #define MAX_COLUMN 132
    9. void i2c_write_byte(uint8_t i2c_addr, uint8_t i2c_data);
    10. void oled_write_command(uint8_t oled_cmd);
    11. void oled_write_data(uint8_t oled_data);
    12. void oled_init(void);
    13. void oled_display_white(void); // OLED 白屏显示
    14. void oled_clear_all(void); // OLED 清屏显示
    15. void oled_fill(uint8_t fill_data); // 单一色度填充OLED屏
    16. void oled_set_pos(uint8_t x, uint8_t y); // 设置坐标
    17. void oled_show_char(uint8_t x, uint8_t y, uint8_t chr, uint8_t char_size); // 显示字符
    18. void oled_show_string(uint8_t x, uint8_t y, uint8_t *str, uint8_t char_size); // 显示字符串
    19. void oled_show_error(uint8_t x, uint16_t y, uint8_t *err); // 显示错误提示
    20. #endif

     oled_i2c.c

    1. #include "oled_i2c.h"
    2. #include "oled_font.h"
    3. /**
    4. * 功能:
    5. * 输入:
    6. * 1)uint8_t i2c_addr,
    7. * 2)uint8_t i2c_data
    8. **/
    9. void i2c_write_byte(uint8_t i2c_addr, uint8_t i2c_data){
    10. while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY));
    11. i2c_start_on_bus(I2C0);
    12. while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)); // 进入主机模式
    13. i2c_master_addressing(I2C0, OLED_I2C_ADDR, I2C_TRANSMITTER);
    14. while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)); // 判断地址发送出去
    15. i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); // 清除ADDSEND位
    16. while(SET != i2c_flag_get(I2C0, I2C_FLAG_TBE)); // 进入数据发送状态(命令或者数据地址)
    17. i2c_data_transmit(I2C0, i2c_addr);
    18. while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));
    19. i2c_data_transmit (I2C0, i2c_data); // (要发的命令或者数据指令的具体数据)
    20. while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));
    21. i2c_stop_on_bus (I2C0);
    22. while(I2C_CTL0(I2C0)&0x0200);
    23. }
    24. /**
    25. * 功能:
    26. * 输入:oled_cmd:oled的控制命令
    27. **/
    28. void oled_write_command(uint8_t oled_cmd){
    29. i2c_write_byte(OLED_I2C_CMD_ADDR, oled_cmd);
    30. }
    31. /**
    32. * 功能:
    33. * 输入:oled_data:要发送给oled的数据
    34. **/
    35. void oled_write_data(uint8_t oled_data){
    36. i2c_write_byte(OLED_I2C_DATA_ADDR, oled_data);
    37. }
    38. /**
    39. * 功能:
    40. * 输入:无
    41. **/
    42. void oled_init(void){
    43. oled_write_command(0xAE);// 0xAE:关显示,0xAF:开显示
    44. oled_write_command(0x00);// 设置开始地址的低字节
    45. oled_write_command(0x10);// 设置开始地址的高字节
    46. oled_write_command(0xd5);// 命令头,设置显示时钟分频比/振荡器频率
    47. oled_write_command(0x80);// 设置分割比率,设置时钟为100帧/秒
    48. oled_write_command(0xa8);// 命令头,设置多路复用率(1 to 64)
    49. oled_write_command(0x3f);// --1/64 duty
    50. oled_write_command(0xd3);// 命令头,设置显示偏移移位映射RAM计数器(0x00~0x3F)
    51. oled_write_command(0x00);// 不偏移
    52. oled_write_command(0x00);// 写入页位置(0xB0~7)
    53. oled_write_command(0x40);// 显示开始线
    54. oled_write_command(0x8d);// VCC电源
    55. oled_write_command(0x14);// --set(0x10) disable
    56. oled_write_command(0xa1);// 设置段重新映射
    57. oled_write_command(0xc8);// 设置Y轴扫描方向,0xc0上下反置 ,0xc8正常(上边为0行)
    58. oled_write_command(0xda);// 命令头,--set com pins hardware configuration
    59. oled_write_command(0x12);
    60. oled_write_command(0x81);// 对比度,指令:0x81,数据:0~255(255最高)
    61. oled_write_command(0xff);
    62. oled_write_command(0xd9);// 命令头,--set pre-charge period
    63. oled_write_command(0xf1);// Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
    64. oled_write_command(0xdb);// 命令头,--set vcomh
    65. oled_write_command(0x30);// Set VCOM Deselect Level
    66. oled_write_command(0x20);// 水平寻址设置
    67. oled_write_command(0x00);
    68. oled_write_command(0xa4);// 0xa4:正常显示,0xa5:整体点亮
    69. oled_write_command(0xa6);// 0xa6:正常显示,0xa7:反色显示
    70. oled_write_command(0xAF);// 0xAE:关显示,0xAF:开显示
    71. }
    72. // OLED显示单一色度
    73. void oled_fill(uint8_t fill_data){
    74. uint8_t i=0, n;
    75. for(i = 0; i < 8; i++){
    76. oled_write_command (0xB0+i); //设置页地址(0~7)
    77. oled_write_command (0x00); //设置显示位置—列低地址
    78. oled_write_command (0x10); //设置显示位置—列高地址
    79. for(n = 0; n < 132; n++){
    80. oled_write_data(fill_data);
    81. }
    82. }
    83. }
    84. // OLED 白屏显示
    85. void oled_display_white(void){
    86. oled_fill(0xFF);
    87. }
    88. // OLED 清屏显示
    89. void oled_clear_all(void){
    90. oled_fill(0x00);
    91. }
    92. // OLED打开
    93. void oled_on(){
    94. oled_write_command(0xAF); // 开启显示
    95. oled_write_command(0x8D); // 设置电荷泵
    96. oled_write_command(0x14); // 开启电荷泵
    97. }
    98. // OLED关闭
    99. void oled_off(){
    100. oled_write_command(0xAF); // 开启显示
    101. oled_write_command(0x8D); // 设置电荷泵
    102. oled_write_command(0x10); // 关闭电荷泵
    103. }
    104. // OLED设置显示位置
    105. void oled_set_pos(uint8_t x, uint8_t y){
    106. oled_write_command(0xB0 + y);
    107. oled_write_command((x & 0xf0) >> 4 | 0x10 );
    108. oled_write_command((x & 0x0f) | 0x01 );
    109. }
    110. // 显示char字符
    111. void oled_show_char(uint8_t x, uint8_t y, uint8_t chr, uint8_t char_size){
    112. uint8_t c_index = 0, i = 0;
    113. c_index = chr - ' '; // 获取chr在字模数组中的序号
    114. if(char_size == 16){
    115. if(x > MAX_COLUMN - 8){ //如果超出了屏幕的显示宽度,则换到下一行重新开始
    116. x = 0;
    117. y += 2;
    118. }
    119. oled_set_pos(x, y);
    120. for(i = 0; i < 8; i++){
    121. oled_write_data(F8X16[c_index*16 + i]);
    122. }
    123. oled_set_pos(x, y+1);
    124. for(i = 0; i < 8; i++){
    125. oled_write_data(F8X16[c_index*16 + i + 8]);
    126. }
    127. }else if(char_size == 8){
    128. if(x > MAX_COLUMN - 6){ //如果超出了屏幕的显示宽度,则换到下一行重新开始
    129. x = 0;
    130. y += 1;
    131. }
    132. oled_set_pos(x, y);
    133. for(i = 0; i < 6; i++){
    134. oled_write_data(F6x8[c_index][i]);
    135. }
    136. }else{
    137. oled_show_error(x, y, (uint8_t *)"wrong char_size setted.");
    138. }
    139. }
    140. // 显示字符串
    141. void oled_show_string(uint8_t x, uint8_t y, uint8_t *str, uint8_t char_size){
    142. uint8_t i = 0;
    143. while(str[i] != '\0'){
    144. oled_show_char(x, y, str[i], char_size);
    145. if(char_size == 16){
    146. x += 8;
    147. if(x > MAX_COLUMN - 8){
    148. x = 0;
    149. y += 2;
    150. }
    151. }else if(char_size == 8){
    152. x += 6;
    153. if(x > MAX_COLUMN - 8){
    154. x = 0;
    155. y += 1;
    156. }
    157. }
    158. i++;
    159. }
    160. }
    161. // 在(x,y)处显示“error!”信息
    162. void oled_show_error(uint8_t x, uint16_t y, uint8_t *err){
    163. oled_show_string(x, y, err, 16);
    164. }

    oled_font.h

    1. #ifndef __OLED_FONT_H
    2. #define __OLED_FONT_H
    3. //常用ASCII表
    4. //偏移量32
    5. //ASCII字符集
    6. //偏移量32
    7. //大小:12*6
    8. /************************************6*8的点阵************************************/
    9. const unsigned char F6x8[][6] =
    10. {
    11. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp
    12. 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !
    13. 0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "
    14. 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #
    15. 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $
    16. 0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %
    17. 0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &
    18. 0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '
    19. 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (
    20. 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )
    21. 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *
    22. 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +
    23. 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,
    24. 0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -
    25. 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .
    26. 0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /
    27. 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
    28. 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 1
    29. 0x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 2
    30. 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 3
    31. 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 4
    32. 0x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 5
    33. 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
    34. 0x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 7
    35. 0x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 8
    36. 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 9
    37. 0x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :
    38. 0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;
    39. 0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// <
    40. 0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =
    41. 0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >
    42. 0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?
    43. 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @
    44. 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A
    45. 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B
    46. 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C
    47. 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D
    48. 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E
    49. 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F
    50. 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G
    51. 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H
    52. 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I
    53. 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J
    54. 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K
    55. 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L
    56. 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M
    57. 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N
    58. 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O
    59. 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P
    60. 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
    61. 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R
    62. 0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S
    63. 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T
    64. 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U
    65. 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V
    66. 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W
    67. 0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X
    68. 0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y
    69. 0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z
    70. 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [
    71. 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 55
    72. 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]
    73. 0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^
    74. 0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _
    75. 0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '
    76. 0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a
    77. 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b
    78. 0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c
    79. 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d
    80. 0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e
    81. 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f
    82. 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g
    83. 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h
    84. 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i
    85. 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j
    86. 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k
    87. 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l
    88. 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m
    89. 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n
    90. 0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o
    91. 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p
    92. 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q
    93. 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r
    94. 0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s
    95. 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t
    96. 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u
    97. 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v
    98. 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w
    99. 0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x
    100. 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y
    101. 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z
    102. 0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines
    103. };
    104. /****************************************8*16的点阵************************************/
    105. const unsigned char F8X16[]=
    106. {
    107. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0
    108. 0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1
    109. 0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2
    110. 0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3
    111. 0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4
    112. 0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5
    113. 0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6
    114. 0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7
    115. 0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8
    116. 0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9
    117. 0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 10
    118. 0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11
    119. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12
    120. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13
    121. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14
    122. 0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15
    123. 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16
    124. 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17
    125. 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18
    126. 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19
    127. 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20
    128. 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21
    129. 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22
    130. 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23
    131. 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24
    132. 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25
    133. 0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26
    134. 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27
    135. 0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28
    136. 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29
    137. 0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30
    138. 0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31
    139. 0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 32
    140. 0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33
    141. 0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34
    142. 0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35
    143. 0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36
    144. 0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37
    145. 0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38
    146. 0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39
    147. 0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40
    148. 0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41
    149. 0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42
    150. 0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43
    151. 0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44
    152. 0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45
    153. 0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46
    154. 0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47
    155. 0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48
    156. 0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49
    157. 0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50
    158. 0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51
    159. 0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52
    160. 0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53
    161. 0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54
    162. 0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55
    163. 0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56
    164. 0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57
    165. 0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58
    166. 0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59
    167. 0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60
    168. 0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61
    169. 0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62
    170. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 63
    171. 0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64
    172. 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65
    173. 0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66
    174. 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67
    175. 0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68
    176. 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69
    177. 0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70
    178. 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71
    179. 0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72
    180. 0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73
    181. 0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74
    182. 0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75
    183. 0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76
    184. 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77
    185. 0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78
    186. 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79
    187. 0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80
    188. 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81
    189. 0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82
    190. 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83
    191. 0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84
    192. 0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85
    193. 0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86
    194. 0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87
    195. 0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88
    196. 0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89
    197. 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90
    198. 0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91
    199. 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92
    200. 0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93
    201. 0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
    202. };
    203. #endif

     main.c

    1. #include
    2. #include "systick.h"
    3. #include "usart_comm.h"
    4. #include "i2c.h"
    5. #include "lm75a_temp.h"
    6. #include "oled_i2c.h"
    7. int main(){
    8. systick_config();
    9. i2c_init();
    10. oled_init();
    11. oled_clear_all();
    12. oled_show_string(24, 0, (uint8_t *)"hello", 16);
    13. float temp_result = 0.0;
    14. char temp_string[80];
    15. while(1){
    16. temp_result = lm75a_get_temp(); /* 获取温度 */
    17. sprintf(temp_string, "temperature is: %.3f C.", temp_result);
    18. oled_show_string(0, 2, (uint8_t *)temp_string, 16); /* 显示到OLED */
    19. delay_1ms(1000); //等待1s
    20. }
    21. }

    OLED具体初始化设置看手册。

  • 相关阅读:
    第七十天学习记录:高等数学:微分(宋浩板书)
    微生物学检验试剂——博迈伦
    HCIA-实验命令基础学习:
    基于数字孪生的城市地下智慧管网
    glb数据介绍
    架构问题自查
    队列【Java】
    手把手带你学NLP
    怎样分配vlan联通全过程
    .NET RulesEngine(规则引擎)
  • 原文地址:https://blog.csdn.net/qq_41328470/article/details/133552351