查看: 2843|回复: 5

[原创] LPC11U68(九)IIC+OLED

[复制链接]
  • TA的每日心情
    开心
    2020-1-12 00:23
  • 签到天数: 745 天

    [LV.9]以坛为家II

    27

    主题

    1万

    帖子

    26

    金牌会员

    Rank: 6Rank: 6

    积分
    6868
    最后登录
    2020-7-15
    发表于 2018-11-28 15:43:14 | 显示全部楼层 |阅读模式
    本帖最后由 lising 于 2018-11-28 15:51 编辑

       本次实验是驱动IIC接口的0.69寸OLED模块。
    一、实验资源
    1、LPC11U68(OM13058)开发板;
    2、KEIL V5.25.2.0;
    3、lpcopen_3_03_keil_iar_lpcxpresso_11u68;
    4、0.69寸OLED模块;

    二、实验过程
    1、硬件制作、连接:0.69寸的OLED模块是热转印PCB自制的,当时觉得0.96与0.69相比没差多少,结果到手后才知道有多小。这个OLED内的主控是SSD1307Z,与常见的0.96寸OLED所用的SSD1306差不多。96*16个像素,能同时显示6个16*16点阵汉字。这个OLED非常小巧可爱,做点小东西用处还是挺多的,唯一的遗憾就是要有升压电路。我这里用了SX1308做升压,PCB有点大、布线有点乱还能再优化。PCB上引出了SDA、SCL、RST、VCC、GND分别与开发板上的PIO0_5、PIO0_4、PIO0_8及VCC、GND相连接;
    IMG_20181128_140621.jpg
    QQ截图20181128143257.png
    IMG_20181128_135555.jpg
    QQ截图20181128142527.png

    2、程序实现。第一次驱动IIC接口的OLED,程序是参考了网上很多朋友的程序而稼接成的。程序其它部分都大致相同,在这个程序中由于0.96和0.69OLED的行、列地址有些差别,造成与0.96OLED驱动程序上小的区别。下面是0.96和0.69OLED的厂家数据手册截图:
    QQ截图20181128144221.png
    QQ截图20181128143741.png
    从上面图中可以看出,0.96OLED的列是从0~127;行是从0~63,构成128*64;0.69OLED的列是从32~127;行是从8~23,构成96*16;刚开始测试写入字符串时发现会从第5个字符开始显示,前面4个不知道跑哪里去了。后面尝试对程序做了一些调整后可以显示了,如:
    1. //显示汉字
    2. void OLED_ShowHZ(uint8_t x,uint8_t y,uint8_t no)
    3. {                                 
    4.         uint8_t t, adder = 0;
    5.         x += 32;//这里相当于将显示列地址向后移32列
    6.         setPos(x,y);        
    7.         for(t=0; t<16; t++)
    8.         {
    9.                 writeData(Hzk[2 * no][t]);
    10.                 adder += 1;
    11.         }        
    12.         setPos(x, y+1);        
    13.         for(t=0; t<16; t++)
    14.         {        
    15.                 writeData(Hzk[2 * no + 1][t]);
    16.                 adder += 1;
    17.         }                                       
    18. }
    复制代码
    1. //显示字符串
    2. void showString(uint8_t x, uint8_t y, uint8_t* str, FONT_SIZE f_size)
    3. {
    4.         x+=32;//这里相当于将显示列地址向后移32列
    5.         while(*str)
    6.         {
    7.                 showChar(x,y,*str++,f_size);        
    8.                 x += f_size;                //增加横坐标,移到下一个汉字位置
    9.         }
    10. }
    复制代码


    OLED的初始化直接采用了手册里提供的:
    1. void OLED_Init(void)
    2. {
    3.         OLED_RESPort_Init();
    4.         /////////////////////以下为SSD1307手册////////////////////////////
    5.         writeCommand(0xae);          //display off
    6.         writeCommand(0xd5);          //Set Display ClocDivide Ratio/Oscillator Frequency
    7.         writeCommand(0xc4);          //100HZ  
    8.         writeCommand(0xa8);          //Set Multiplex Ratio
    9.         writeCommand(0x0f);          //set 16mux
    10.         writeCommand(0xd9);         //Set Pre-charge Period  
    11.         writeCommand(0x22);         //
    12.         writeCommand(0x20);          //Set Memory Addressing Mode
    13.         writeCommand(0x02);
    14.         writeCommand(0xa0);          //seg re-map 0->127
    15.         writeCommand(0xc8);          //COM scan direction COM(N-1)-->COM0
    16.         writeCommand(0xda);          //Set COM Pins Hardware Configuration  
    17.         writeCommand(0x10);            
    18.         writeCommand(0x81);         //Set Contrast Control
    19.         writeCommand(0x10);          //
    20.         writeCommand(0xb0);         //Set Page Start Address for Page Addressing Mode
    21.         writeCommand(0xd3);         //Set Display offset
    22.         writeCommand(0x1f);          //
    23.         writeCommand(0xa6);          //Display Normal
    24.         writeCommand(0xa4);          //Entire Display Off
    25.         writeCommand(0xdb);         //Set VCOMH Level  
    26.         writeCommand(0x30);          //0.83*VCC
    27.         writeCommand(0xaf);          //display on
    28. }
    复制代码


    下面是主函数:
    1. int main(void)
    2. {
    3.         SystemCoreClockUpdate();
    4.         
    5.         delay_init();        
    6.         IIC_Init();
    7.         OLED_Init();
    8.         
    9.         formatScreen(0xff);//0xff全屏点亮
    10.         delay_ms(600);delay_ms(600);delay_ms(600);
    11.         formatScreen(0x00);//0x00全屏熄灭
    12.         
    13.         //SetScreenDir(SCREEN_DOWN);
    14.   //SetScreenReverse(SCREEN_REVERSE);//反白显示
    15.         OLED_ShowHZ(0,0,0);//依次显示“NXP社区!”
    16.         OLED_ShowHZ(16,0,1);
    17.         OLED_ShowHZ(32,0,2);
    18.         OLED_ShowHZ(48,0,3);
    19.         OLED_ShowHZ(64,0,4);
    20.         OLED_ShowHZ(80,0,5);
    21.         
    22.         delay_ms(600);delay_ms(600);delay_ms(600);
    23.         formatScreen(0x00);//0x00全屏熄灭
    24.         
    25.         showString(8,0,(uint8_t *)"LPCXpresso",FONT_16_EN);
    26.         delay_ms(600);delay_ms(600);delay_ms(600);
    27.         formatScreen(0x00);//0x00全屏熄灭
    28.         
    29.         showString(28,0,(uint8_t *)"Board",FONT_16_EN);//
    30.         delay_ms(600);delay_ms(600);delay_ms(600);
    31.         formatScreen(0x00);//0x00全屏熄灭
    32.         
    33.         showString(16,0,(uint8_t *)"LPC11U68",FONT_16_EN);
    34.         
    35.         while(1)
    36.         {        

    37.         }
    38. }
    复制代码


    三、实验结果(模特PDIP8)
    1、整体
    IMG_20181128_135245.jpg

    2、近照
    IMG_20181128_135236.jpg
    IMG_20181128_133114.jpg
    IMG_20181128_133158.jpg
    IMG_20181128_133011.jpg

    3、反白显示效果
    IMG_20181128_135403.jpg
    IMG_20181128_135421.jpg

    4、全屏显示
    IMG_20181128_135957.jpg

    四、实验总结
          看手册非常重要。另外,IIC的SDA端口在改变输入、输出状态时要置高电平:
    1. void Set_SDA_OUT(void)
    2. {
    3.         Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_GPIO);//GPIO时钟使能
    4.         Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 5);//设置PIO0_5端口为输出SDA
    5.         Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 5, (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
    6.         Chip_GPIO_WritePortBit(LPC_GPIO, 0, 5, 1);//拉高SDA
    7. }
    复制代码
    IIC初始化时SDA、SCL均设置为了输出状态,这两个端口也要置为高电平:
    1. void IIC_Init(void)
    2. {
    3.         Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_GPIO);//GPIO时钟使能
    4.         
    5.         Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 4);//设置PIO0_4端口为输出SCL        
    6.         Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 5);//设置PIO0_5端口为输出SDA

    7.         Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 4, (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
    8.         Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 5, (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));

    9.         Chip_GPIO_WritePortBit(LPC_GPIO, 0, 4, 1);//拉高SCL
    10.         Chip_GPIO_WritePortBit(LPC_GPIO, 0, 5, 1);//拉高SDA
    11. }
    复制代码
    开始时没有进行置高平处理,显示汉字会有乱码出现,加入置高平语句后显示正常了。

    顺便把手册传上来有需要的可以看看。
    M00240_VGM096016A1B01_A01.rar (588.56 KB, 下载次数: 35)
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 20:47
  • 签到天数: 1485 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    93126
    最后登录
    2024-5-8
    发表于 2018-11-28 19:26:32 | 显示全部楼层
    支持一下。
    那个0.96的OLED,你用硬件SPI测试了没有?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-1-12 00:23
  • 签到天数: 745 天

    [LV.9]以坛为家II

    27

    主题

    1万

    帖子

    26

    金牌会员

    Rank: 6Rank: 6

    积分
    6868
    最后登录
    2020-7-15
     楼主| 发表于 2018-11-29 09:08:30 | 显示全部楼层
    stm1024 发表于 2018-11-28 19:26
    支持一下。
    那个0.96的OLED,你用硬件SPI测试了没有?

    还没有,后面想测试下包括IIC。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 20:47
  • 签到天数: 1485 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    93126
    最后登录
    2024-5-8
    发表于 2018-11-29 20:55:26 | 显示全部楼层
    lising 发表于 2018-11-29 09:08
    还没有,后面想测试下包括IIC。

    我手上也有一个,但是现在资料还没给清楚,到底哪个是MOSI,哪个是MISO
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-1-12 00:23
  • 签到天数: 745 天

    [LV.9]以坛为家II

    27

    主题

    1万

    帖子

    26

    金牌会员

    Rank: 6Rank: 6

    积分
    6868
    最后登录
    2020-7-15
     楼主| 发表于 2018-11-29 21:36:45 | 显示全部楼层
    stm1024 发表于 2018-11-29 20:55
    我手上也有一个,但是现在资料还没给清楚,到底哪个是MOSI,哪个是MISO

    先用其它器件把SPI调通后再试哪个是MOSI、MISO也行吧。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2019-4-4 13:42
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    3

    主题

    19

    帖子

    0

    注册会员

    Rank: 2

    积分
    94
    最后登录
    2019-10-8
    发表于 2019-3-11 16:03:40 | 显示全部楼层
    能不能贴上代码,全部的
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-9 05:35 , Processed in 0.130239 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表