• C51单片机IIC协议的应用


    总述:

    IIC总线在传输数据的过程中一共有三种类型信号,分别为:开始信号、结束信号和应答信号

    1.起始信号

    1. void IIC_Start()
    2. {
    3. sda = 1;
    4. scl = 1;
    5. _nop_();
    6. sda = 0;
    7. _nop_();
    8. }

    2.终止信号

    1. void IIC_Stop()
    2. {
    3. sda = 0;
    4. scl = 1;
    5. _nop_();
    6. sda = 1;
    7. _nop_();
    8. }

    3.应答信号

    发送器每发送一个字节( 8 bit ),就在时钟脉冲 9 期间释放数据线,由接收器反馈一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK ,简称应答位),表示接收器已经成功地接收了该字 节;
    1. char IIC_ACK()
    2. {
    3. char flag;//????为什么这个位置要用char
    4. sda = 1;//就在时钟脉冲9期间释放数据线
    5. _nop_();
    6. scl = 1;
    7. _nop_();
    8. flag = sda;
    9. _nop_();
    10. scl = 0;
    11. _nop_();
    12. return flag;
    13. }

    3.IIC协议发送一个字节封装。

    1. void IIC_Send_Byte(char dataSend)
    2. {
    3. int i;
    4. for(i = 0;i<8;i++){
    5. scl = 0;//scl拉低,让sda做好数据准备
    6. sda = dataSend & 0x80;//1000 0000获得dataSend的最高位,给sda ??为什么字符串可以进行&运算
    7. _nop_();//发送数据建立时间
    8. scl = 1;//scl拉高开始发送
    9. _nop_();//数据发送时间
    10. scl = 0;//发送完毕拉低
    11. _nop_();//
    12. dataSend = dataSend << 1;//????搞不懂为什么dataSend << 1就是左移
    13. }
    14. }

    2.OLED写命令,可以参考ssd1306手册和叁议电子oled说明书。

    3.OLED寻址模式:页地址模式、水平地址模式、垂直地址模式。;页地址模式和水平地址模式用的比较多。

    页地址模式:

    写入0x08b00001000),显示如下

    首先进行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_Write_Cmd(char dataCmd)
    2. {
    3. // 1. start()
    4. IIC_Start();
    5. // 2. 写入从机地址 b0111 1000 0x78
    6. IIC_Send_Byte(0x78); //???这个0x78是怎么得出来的
    7. // 3. ACK
    8. IIC_ACK();
    9. // 4. cotrol byte: (0)(0)000000 写入命令 (0)(1)000000写入数据
    10. IIC_Send_Byte(0x00);
    11. // 5. ACK
    12. IIC_ACK();
    13. //6. 写入指令/数据
    14. IIC_Send_Byte(dataCmd);
    15. //7. ACK
    16. IIC_ACK();
    17. //8. STOP
    18. IIC_Stop();
    19. }

    清屏函数

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

    4.利用OLED来显示文字。

    1. void main()
    2. {
    3. unsigned char i;
    4. //1. OLED初始化
    5. Oled_Init();
    6. //2. 选择一个位置
    7. //2.1 确认页寻址模式
    8. Oled_Write_Cmd(0x20);
    9. Oled_Write_Cmd(0x02);
    10. Oled_Clear();
    11. //2.2 选择PAGE0 1011 0000
    12. // 0xB0
    13. Oled_Write_Cmd(0xB0);
    14. Oled_Write_Cmd(0x00);
    15. Oled_Write_Cmd(0x10);
    16. for(i=0;i<16;i++){
    17. Oled_Write_Data(l1[i]);
    18. }
    19. for(i=0;i<16;i++){
    20. Oled_Write_Data(p1[i]);
    21. }
    22. for(i=0;i<16;i++){
    23. Oled_Write_Data(j1[i]);
    24. }
    25. for(i=0;i<16;i++){
    26. Oled_Write_Data(s1[i]);
    27. }
    28. for(i=0;i<16;i++){
    29. Oled_Write_Data(g1[i]);
    30. }
    31. Oled_Write_Cmd(0xB1);
    32. Oled_Write_Cmd(0x00);
    33. Oled_Write_Cmd(0x10);
    34. for(i=0;i<16;i++){
    35. Oled_Write_Data(l2[i]);
    36. }
    37. for(i=0;i<16;i++){
    38. Oled_Write_Data(p2[i]);
    39. }
    40. for(i=0;i<16;i++){
    41. Oled_Write_Data(j2[i]);
    42. }
    43. for(i=0;i<16;i++){
    44. Oled_Write_Data(s2[i]);
    45. }
    46. for(i=0;i<16;i++){
    47. Oled_Write_Data(g2[i]);
    48. }
    49. while(1);
    50. }

    5.利用OLED来传入图片信息

    1. void Oled_Show_Image(unsigned char *image)
    2. {
    3. unsigned char i; //-128 --- 127
    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. }

  • 相关阅读:
    JavaWeb之Mybatis进阶
    复旦教授报告400多个安卓漏洞,历时16个月谷歌终于修复,此前曾立flag
    Python之hello, world
    闪电连接算法之Python实现
    so-vits-svc:AI翻唱,语音克隆
    Vuex基本流程及 mapState mapMutations mapActions 简写形式
    MATLAB中M文件编写
    vue3使用less与scss
    Uncaught TypeError: Cannot use ‘in‘ operator to search for ‘path‘ in undefined
    六、c++代码中的安全风险-fopen
  • 原文地址:https://blog.csdn.net/GoodtimeGood/article/details/133783460