• STM32 IIC 实验


    1.

     可以选择I2C1,也可以选择I2C2,或者同时选择,同时运行

     

    配置时钟信号

    为节约空间,选择这两个,然后选择GENERATE CODE

    二、HAL_I2C_Mem_Write

    I2C_HandleTypeDef *hi2c:I2C设备句柄
    uint16_t DevAddress:目标器件的地址,七位地址必须左对齐
    uint16_t MemAddress:目标器件的目标寄存器地址
    uint16_t MemAddSize:目标器件内部寄存器地址数据长度
    uint8_t *pData:待写的数据首地址
    uint16_t Size:待写的数据长度
    uint32_t Timeout:超时时间
    返回值: HAL_StatusTypeDef HAL 状态( OK busy ERROR TIMEOUT
    向OLED写入命令的封装:
    1. void Oled_Write_Cmd(uint8_t dataCmd)
    2. {
    3. HAL_I2C_Mem_Write(&hi2c1,0x78,0x00,I2C_MEMADD_SIZE_8BIT,
    4. &dataCmd,1,0xff);
    5. }
    OLED 写数据的封装:最大的区别是目标器件的目标寄存器地址变成了0x40
    1. void Oled_Write_Data(uint8_t dataData)
    2. {
    3. HAL_I2C_Mem_Write(&hi2c1,0x78,0x40,I2C_MEMADD_SIZE_8BIT,
    4. &dataData,1,0xff);
    5. }

     三、初始化Oled(官方手册上面有),清屏函数,调入图片的亮点到数组,显示函数。

    初始化Oled:

    1. void Oled_Init(void){
    2. Oled_Write_Cmd(0xAE);//--display off
    3. Oled_Write_Cmd(0x00);//---set low column address
    4. Oled_Write_Cmd(0x10);//---set high column address
    5. Oled_Write_Cmd(0x40);//--set start line address
    6. Oled_Write_Cmd(0xB0);//--set page address
    7. Oled_Write_Cmd(0x81); // contract control
    8. Oled_Write_Cmd(0xFF);//--128
    9. Oled_Write_Cmd(0xA1);//set segment remap
    10. Oled_Write_Cmd(0xA6);//--normal / reverse
    11. Oled_Write_Cmd(0xA8);//--set multiplex ratio(1 to 64)
    12. Oled_Write_Cmd(0x3F);//--1/32 duty
    13. Oled_Write_Cmd(0xC8);//Com scan direction
    14. Oled_Write_Cmd(0xD3);//-set display offset
    15. Oled_Write_Cmd(0x00);//
    16. Oled_Write_Cmd(0xD5);//set osc division
    17. Oled_Write_Cmd(0x80);//
    18. Oled_Write_Cmd(0xD8);//set area color mode off
    19. Oled_Write_Cmd(0x05);//
    20. Oled_Write_Cmd(0xD9);//Set Pre-Charge Period
    21. Oled_Write_Cmd(0xF1);//
    22. Oled_Write_Cmd(0xDA);//set com pin configuartion
    23. Oled_Write_Cmd(0x12);//
    24. Oled_Write_Cmd(0xDB);//set Vcomh
    25. Oled_Write_Cmd(0x30);//
    26. Oled_Write_Cmd(0x8D);//set charge pump enable
    27. Oled_Write_Cmd(0x14);//
    28. Oled_Write_Cmd(0xAF);//--turn on oled panel
    29. }

    清屏函数

    1. void Oled_Screen_Clear(void){
    2. char i,n;
    3. Oled_Write_Cmd (0x20); //set memory addressing mode
    4. Oled_Write_Cmd (0x02); //page addressing mode
    5. for(i=0;i<8;i++){
    6. Oled_Write_Cmd(0xb0+i); //éè??ò3μ??·£¨0~7£?
    7. Oled_Write_Cmd(0x00); //éè????ê??????aáDμíμ??·
    8. Oled_Write_Cmd(0x10); //éè????ê??????aáD??μ??·
    9. for(n=0;n<128;n++)Oled_Write_Data(0x00);
    10. }
    11. }

    设置图片的点阵,可以通过电脑画图软件画

    通过取模软件生成数据将图片的亮点放到数组:

    1. unsigned char bmpImager[] = {/*-- 调入了一幅图像:E:\丁1.bmp --*/
    2. /*-- 宽度x高度=128x64 --*/
    3. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    4. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    5. 0x00,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
    6. 0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    7. 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xE0,0xE0,
    8. 0xE0,0xE0,0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    9. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    10. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    11. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    12. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xFC,
    13. 0xFF,0x3F,0x0F,0x03,0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,
    14. 0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x0F,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x1E,0x1F,
    15. 0x1F,0x1F,0x1F,0x3F,0x3F,0x3F,0x3F,0x7B,0x73,0x73,0xF1,0xE1,0xC1,0xC1,0x81,0x80,
    16. 0x10,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x3C,0x1C,0x1C,0x1C,
    17. 0x1C,0x1E,0x0C,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,
    18. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    19. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    20. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFC,0xFF,0x3F,0x07,
    21. 0x00,0x00,0x02,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x87,0xC7,0xC7,0x87,0x07,0x07,
    22. 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x87,0xFF,0xFF,0xFF,0x07,0x07,0x07,0x07,0x07,
    23. 0x07,0x07,0x07,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x03,0x03,0x07,
    24. 0x07,0x0F,0x1E,0x1E,0x1C,0x3C,0x38,0x78,0xF0,0xF0,0xE0,0xC0,0xC8,0x1C,0x1C,0x1C,
    25. 0x1C,0x1C,0x1C,0x1C,0x1E,0x0E,0x0F,0x0F,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x00,
    26. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    27. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    28. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x01,0x00,0x00,
    29. 0x00,0x00,0x00,0x00,0xF0,0xFC,0xFE,0x9F,0xC6,0xF0,0xFF,0x7F,0x1F,0x01,0x00,0x00,
    30. 0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0xE0,
    31. 0xF0,0xF8,0x7E,0x3F,0x0F,0x07,0x87,0xCF,0xEE,0xFE,0xFE,0x3C,0x00,0x00,0x00,0x00,
    32. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x00,0x00,
    33. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    34. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    35. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    36. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xF0,0x80,0x00,
    37. 0x00,0x00,0x00,0x00,0x03,0x07,0x07,0x07,0x07,0x03,0x01,0x00,0x00,0x80,0xC0,0x80,
    38. 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
    39. 0x07,0x0F,0x0E,0x0E,0x0F,0x07,0x07,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
    40. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xF8,0xFF,0x7F,0x0F,0x00,0x00,
    41. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    42. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    43. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    44. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0F,0x1F,0x7E,
    45. 0xF8,0xF0,0xE0,0xC0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,
    46. 0x0F,0x1F,0x3E,0x7C,0xF8,0xF8,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    47. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,
    48. 0xC0,0xE0,0xF0,0x70,0x78,0x3C,0x1E,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00,
    49. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    50. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    51. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    52. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    53. 0x00,0x01,0x01,0x03,0x07,0x07,0x07,0x07,0x0F,0x0E,0x0E,0x0E,0x1E,0x1C,0x1C,0x1C,
    54. 0x1C,0x1C,0x1C,0x3C,0x38,0x39,0x39,0x39,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,
    55. 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x3C,0x1E,0x1F,0x0F,0x07,0x03,0x01,
    56. 0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    57. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    58. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    59. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    60. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    61. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    62. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    63. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    64. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    65. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    66. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    67. };

    显示函数:

    1. void Oled_Show_Image(unsigned char *image)
    2. {
    3. unsigned char i;
    4. unsigned int j;
    5. for(i=0;i<8;i++){
    6. Oled_Write_Cmd(0xB0 + i);//page0--page7
    7. //每个page从0列
    8. Oled_Write_Cmd(0x00);
    9. Oled_Write_Cmd(0x10);
    10. //0到127列,依次写入0,每写入数据,列地址自动偏移
    11. for(j = 128 * i; j<(128 * (i+1));j++){
    12. Oled_Write_Data(image[j]);
    13. }
    14. }
    15. }

    四、主函数

    直接在while(1)循环之前添加即可。

    1. //1. OLED初始化
    2. Oled_Init();
    3. //2. 选择一个位置
    4. //2.1 确认页寻址模式
    5. Oled_Write_Cmd(0x20);
    6. Oled_Write_Cmd(0x02);
    7. Oled_Screen_Clear();
    8. Oled_Show_Image(bmpImager);

  • 相关阅读:
    重生之 SpringBoot3 入门保姆级学习(16、函数式 Web 编程)
    【加密社】深入理解TON智能合约 (FunC语法)
    linux查看修改文件权限命令
    如何在 Linux 中管理用户
    一个分布在多次Softmax后,会趋于相同
    unity sdk -AppLovin MAX 广告聚合平台接入+Firebase统计
    10.1 调试事件读取寄存器
    设计模式-建造者模式
    远程互动会议平台是什么?
    hystart++ 出炉
  • 原文地址:https://blog.csdn.net/GoodtimeGood/article/details/134247068