void OLED_WrDat(unsigned char IIC_Data) { IIC_Start(); Write_IIC_Byte(0x78); Write_IIC_Byte(0x40); //write data Write_IIC_Byte(IIC_Data); IIC_Stop(); }
void OLED_WrCmd(unsigned char IIC_Command) { IIC_Start(); Write_IIC_Byte(0x78); //Slave address,SA0=0 Write_IIC_Byte(0x00); //write command Write_IIC_Byte(IIC_Command); IIC_Stop(); }
/********************************************** // IIC Write Data **********************************************/ void Write_IIC_Data(unsigned char IIC_Data) { IIC_Start(); Write_IIC_Byte(0x78); //D/C#=0; R/W#=0 Write_IIC_Byte(0x40); //write data Write_IIC_Byte(IIC_Data); IIC_Stop(); }
//IIC写命令 -- 命令操作很少,对速度影响不大 void CN_SSD1306::Write_IIC_Command(unsigned char IIC_Command) { IIC_Start(); Write_IIC_Byte(0x78); //Slave address,SA0=0 Write_IIC_Byte(0x00); //write command Write_IIC_Byte(IIC_Command); IIC_Stop(); }
//设置起始点坐标 void CN_SSD1306::IIC_SetPos(unsigned char x, unsigned char y) { IIC_Start(); Write_IIC_Byte(0x78); //Slave address,SA0=0 Write_IIC_Byte(0x00); //write command Write_IIC_Byte(0xb0+y); Write_IIC_Byte(((x&0xf0)>>4)|0x10);//|0x10 Write_IIC_Byte((x&0x0f)|0x01);//|0x01 IIC_Stop();//SetPos函数经常被使用,所以采用了这种发送一组命令再关闭IIC总线的方式 }
/********************************************** // IIC Write Data **********************************************/ void Write_IIC_Data(unsigned char IIC_Data) { #ifndef USE_I2C_LIB IIC_Start(); Write_IIC_Byte(0x78); //D/C#=0; R/W#=0 IIC_Wait_Ack(); Write_IIC_Byte(0xC0); //write data IIC_Wait_Ack(); Write_IIC_Byte(IIC_Data); IIC_Wait_Ack(); IIC_Stop(); #else IIC_Start(); Write_IIC_Addr7(0x78); Write_IIC_Byte(0xC0); //write command Write_IIC_Byte(IIC_Data); IIC_Stop(); #endif }
void CN_SSD1306::ShowCN(unsigned char x, unsigned char y, unsigned char N) { unsigned char wm=0; unsigned int adder=32*N; IIC_SetPos(x , y); Begin_IIC_Data(); for(wm = 0;wm < 16;wm++) { Write_IIC_Byte(CN16x16[adder]); adder += 1; } IIC_Stop(); IIC_SetPos(x,y + 1); Begin_IIC_Data(); for(wm = 0;wm < 16;wm++) { Write_IIC_Byte(CN16x16[adder]); adder += 1; } IIC_Stop(); }
/********************************************** // IIC Write Command **********************************************/ void Write_IIC_Command(unsigned char IIC_Command) { #ifndef USE_I2C_LIB IIC_Start(); Write_IIC_Byte(0x78); //Slave address,SA0=0 IIC_Wait_Ack(); Write_IIC_Byte(0x80); //write command IIC_Wait_Ack(); Write_IIC_Byte(IIC_Command); IIC_Wait_Ack(); IIC_Stop(); #else IIC_Start(); Write_IIC_Addr7(0x78); Write_IIC_Byte(0x80); //write command Write_IIC_Byte(IIC_Command); IIC_Stop(); #endif }
//全屏显示 -- Fill_Screen(0x00)可用作清屏 void CN_SSD1306::Fill_Screen(unsigned char fill_Data) { unsigned char m,n; for(m=0;m<8;m++) { Write_IIC_Command(0xb0+m); //page0-page1 Write_IIC_Command(0x00); //low column start address Write_IIC_Command(0x10); //high column start address Begin_IIC_Data(); for(n=0;n<128;n++) { Write_IIC_Byte(fill_Data); } IIC_Stop(); } }
void OLED_WR_Byte(uint8_t dat,uint8_t cmd) { #if (FB_OLED && FB_IIC_OLED) if(cmd) { IIC_Start(); Write_IIC_Byte(0x78); //D/C#=0; R/W#=0 Write_IIC_Byte(0x40); //write data Write_IIC_Byte(dat); IIC_Stop(); } else { IIC_Start(); Write_IIC_Byte(0x78); //Slave address,SA0=0 Write_IIC_Byte(0x00); //write command Write_IIC_Byte(dat); IIC_Stop(); } #endif #if (FB_OLED && FB_SPI_OLED) //uint8_t i; uint8_t buffer[1]; buffer[0] = dat; if(cmd) OLED_DC_Set(); else OLED_DC_Clr(); OLED_CS_Clr(); spi_write(QN_SPI1, buffer, 1, oled_write_done); delay(100); OLED_CS_Set(); OLED_DC_Set(); #endif }
//开始IIC写数据 -- 这样可以让一组数据发送完成后再关闭IIC,能很大程度提速 void CN_SSD1306::Begin_IIC_Data() { IIC_Start(); Write_IIC_Byte(0x78); Write_IIC_Byte(0x40); //write data }