|
本帖最后由 leonard 于 2013-9-11 12:59 编辑
话说楼主的OLED终于到了,简单调试了一下之前准备好的代码就发上来了。
楼主的OLED是0.96的128*64,主控SSD1306,买来时已经是IIC的连接方式了,改SPI有点麻烦,就用IIC了。
先上图:
桌子上还有一块IIC通信的MPU6050,在写完OLED的代码后,楼主的1602就可以退休了。
先是硬件连线:
请无视楼主的其他连线,要用是只有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:
#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, 下载次数: 92)
|
|