查看: 6626|回复: 7

PSoC4实验:IIC点亮OLED

[复制链接]

该用户从未签到

发表于 2013-9-11 00:14:11 | 显示全部楼层 |阅读模式
分享到:
本帖最后由 leonard 于 2013-9-11 12:59 编辑

话说楼主的OLED终于到了,简单调试了一下之前准备好的代码就发上来了。
楼主的OLED是0.96的128*64,主控SSD1306,买来时已经是IIC的连接方式了,改SPI有点麻烦,就用IIC了。
先上图:
IMG_20130910_192908.jpg
桌子上还有一块IIC通信的MPU6050,在写完OLED的代码后,楼主的1602就可以退休了。

先是硬件连线:
Top_IIC.jpg
ports.jpg
请无视楼主的其他连线,要用是只有SCL和SDA两条线。

OLED2864 硬件连线
请注意oled是3.3v的电源,所以要把PSoC4的板上电源选择为3.3v
SCL--SCL;
SDA--SDA;
D/C为地址末尾,楼主选择接地。(D/C=0,Address=0x3c);
RES接低复位,正常操作接高(RES=1);
CS=0;
GND=0;
VCC=3.3v;

代码部分
楼主目前完成的是基础的驱动部分,并没有写完绘图语句。目前能做到的是初始化(OLED_Init())和清屏(clearDisplay())和
绘制点(drawpixel()),其他如绘制直线、圆等API将很快完成。

由于楼主工程很大一部分与本题无关,就没打算上传工程,一下是楼主自用的API:
1.按照I2C-bus data format写命令
ssd1306 I2C-bus data format:
I2C_bus.jpg

#define CONTROL   0x00 //写入命令
#define DATA          0x40 //写入数据
#define OLED_ADDR  0x3c
int status=0                     //保存IIC_BUS状态
/**************************************************************/
void writeCommand(uint8 command)             //SSD1306命令操作函数
{
I2C_Start();                                                    //启动I2Cstatus=I2C_I2CMasterClearStatus();               //清除之前状态
status=I2C_I2CMasterSendStart(OLED_ADDR,I2C_I2C_WRITE_XFER_MODE);   //校验地址+写入模式
while(status!=I2C_I2C_MSTR_NO_ERROR)      
{printline(1,"Error");}                                      //校验status状态,请大家自定义函数
status=I2C_I2CMasterWriteByte(CONTROL);  //进入命令模式
status=I2C_I2CMasterWriteByte(command);  //写入命令         
I2C_Stop();
}
/**************************************************************/
void writeData(uint8 dat)                                //SSD1306数据操作函数
{
I2C_Start();                                                    //启动I2Cstatus=I2C_I2CMasterClearStatus();               //清除之前状态
status=I2C_I2CMasterSendStart(OLED_ADDR,I2C_I2C_WRITE_XFER_MODE);   //校验地址+写入模式
while(status!=I2C_I2C_MSTR_NO_ERROR)      
{printline(1,"Error");}                                      //校验status状态,请大家自定义函数
status=I2C_I2CMasterWriteByte(DATA);         //进入数据模式
status=I2C_I2CMasterWriteByte(dat);            //写入数据         
I2C_Stop();
}
/**************************************************************/
void OLED_Init()                                            //这里的command()就是上文的writeCommand()函数,楼主懒的改了
{
        command(0xAE); //关闭显示
        command(0xD5); //设置时钟分频因子,震荡频率
        command(0x80); //[3:0],分频因子;[7:4],震荡频率
        command(0xA8); //设置驱动路数
        command(0X3F); //默认0X3F(1/64)
        command(0xD3); //设置显示偏移
        command(0X00); //默认为0
        command(0x40); //设置显示开始行 [5:0],行数.                                                                                                         
        command(0x8D); //电荷泵设置
        command(0x14); //bit2,开启/关闭
        command(0xd8); //设置内存地址模式
        command(0x05); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
        command(0xA1); //段重定义设置,bit0:0,0->0;1,0->127;
        command(0xC8); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
        command(0xDA); //设置COM硬件引脚配置
        command(0x12); //[5:4]配置
        command(0x81); //对比度设置
        command(0x7F); //1~255;默认0X7F (亮度设置,越大越亮)
        command(0xD9); //设置预充电周期
        command(0xf1); //[3:0],PHASE 1;[7:4],PHASE 2;
        command(0xDB); //设置VCOMH 电压倍率
        command(0x40); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;
        command(0xA4); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
        command(0xA6); //设置显示方式;bit0:1,反相显示;0,正常显示        
        command(0xAF); //开启显示   
}

以上是一些关键性的代码,其他可见楼主上传的OLED.h文件。

附件
OLED2864.zip (4.02 KB, 下载次数: 89)
回复

使用道具 举报

  • TA的每日心情
    慵懒
    2019-7-13 19:58
  • 签到天数: 1818 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2013-9-11 08:36:41 | 显示全部楼层
    好样的~~~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2013-9-23 14:24
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2013-9-11 08:49:29 | 显示全部楼层
    顶你!!!!1
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-5-12 14:30
  • 签到天数: 1730 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2013-9-11 09:00:07 | 显示全部楼层
    好详细呀,这就是传说中的源代码吗?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-3-15 10:18
  • 签到天数: 1027 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2013-9-11 09:06:31 | 显示全部楼层
    OLED显示效果很好呀
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-12 10:32
  • 签到天数: 295 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-9-11 09:51:08 | 显示全部楼层
    给力啊~~~~~~~~~~~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2013-9-11 10:45:05 | 显示全部楼层
    dushanwu 发表于 2013-9-11 09:06
    OLED显示效果很好呀

    那当然,又小有细腻,很适合在飞控板上绘制飞行姿态!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2013-9-11 11:12:00 | 显示全部楼层
    powerdruy 发表于 2013-9-11 11:09
    OLED哪里买的,多少钱

    TB上搜oled模块会有很多,包括飞思卡尔和一些其他厂商的,参考价30~40,1.3略贵
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-5-20 20:18 , Processed in 0.153751 second(s), 29 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.