//向SSD1106写入一个字节。 //dat:要写入的数据/命令 //cmd:数据/命令标志 0,表示命令;1,表示数据; void OLED_WR_Byte(u8 dat,u8 cmd) { OSStatus err = kUnknownErr; platform_spi_message_segment_t oled_spi_msg = { &dat, NULL, (unsigned long) 1 }; OLED_DC_INIT(); // incase SPI is re-init by other work // u8 i; if(cmd) OLED_DC_Set(); else OLED_DC_Clr(); //OLED_CS_Clr(); // for(i=0;i<8;i++) // { // OLED_SCLK_Clr(); // if(dat&0x80) // OLED_SDIN_Set(); // else // OLED_SDIN_Clr(); // OLED_SCLK_Set(); // dat<<=1; // } // *((uint8_t*)oled_spi_msg.tx_buffer) = dat; // oled_spi_msg.length = 1; err = MicoSpiTransfer(&micokit_spi_oled, &oled_spi_msg, 1); UNUSED_PARAMETER(err); // OLED_CS_Set(); OLED_DC_Set(); }
//向SSD1106写入一个字节。 //dat:要写入的数据/命令 //cmd:数据/命令标志 0,表示命令;1,表示数据; void OLED_WR_Byte(u8 dat,u8 cmd) { DATAOUT(dat); if(cmd) OLED_DC_Set(); else OLED_DC_Clr(); OLED_CS_Clr(); OLED_WR_Clr(); OLED_WR_Set(); OLED_CS_Set(); OLED_DC_Set(); }
/* *@功能:0:4线串行模式,向SSD1106写入一个字节。 *@输入:dat:要写入的数据/命令 * cmd:数据/命令标志 0,表示命令;1,表示数据; */ void OLED_WR_Byte(uint8_t dat,uint8_t cmd) { uint8_t i; if(cmd) OLED_DC_Set(); else OLED_DC_Clr(); OLED_CS_Clr(); for(i=0;i<8;i++) //从高位开始传送 { OLED_SCLK_Clr(); if(dat&0x80) OLED_SDIN_Set(); else OLED_SDIN_Clr(); //上升沿锁数据 OLED_SCLK_Set(); dat<<=1; } OLED_CS_Set(); OLED_DC_Set(); }
//向SSD1106写入一个字节。 //dat:要写入的数据/命令 //cmd:数据/命令标志 0,表示命令;1,表示数据; void OLED_WR_Byte(u8 dat,u8 cmd) { u8 i; if(cmd) OLED_DC_Set(); else OLED_DC_Clr(); OLED_CS_Clr(); for(i=0;i<8;i++) { OLED_SCLK_Clr(); if(dat&0x80) OLED_SDIN_Set(); else OLED_SDIN_Clr(); OLED_SCLK_Set(); dat<<=1; } OLED_CS_Set(); OLED_DC_Set(); }
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 }
//初始化SSD1306 void OLED_Init(void) { /* GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE); //使能PC,D,G端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_3|GPIO_Pin_8; //PD3,PD6推挽输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化GPIOD3,6 GPIO_SetBits(GPIOD,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_3|GPIO_Pin_8); //PD3,PD6 输出高 #if OLED_MODE==1 GPIO_InitStructure.GPIO_Pin =0xFF; //PC0~7 OUT推挽输出 GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_SetBits(GPIOC,0xFF); //PC0~7输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //PG13,14,15 OUT推挽输出 GPIO_Init(GPIOG, &GPIO_InitStructure); GPIO_SetBits(GPIOG,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PG13,14,15 OUT 输出高 #else GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //PC0,1 OUT推挽输出 GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1); //PC0,1 OUT 输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PG15 OUT推挽输出 RST GPIO_Init(GPIOG, &GPIO_InitStructure); GPIO_SetBits(GPIOG,GPIO_Pin_15); //PG15 OUT 输出高 #endif */ // MicoGpioInitialize( (mico_gpio_t)OLED_SPI_SCK, OUTPUT_PUSH_PULL ); // MicoGpioInitialize( (mico_gpio_t)OLED_SPI_DIN, OUTPUT_PUSH_PULL ); // MicoGpioInitialize( (mico_gpio_t)OLED_SPI_DC, OUTPUT_PUSH_PULL ); // MicoGpioInitialize( (mico_gpio_t)OLED_SPI_CS, OUTPUT_PUSH_PULL ); // // OLED_CS_Set(); OSStatus err = kUnknownErr; err = MicoSpiInitialize(&micokit_spi_oled); UNUSED_PARAMETER(err); MicoGpioInitialize( (mico_gpio_t)OLED_SPI_DC, OUTPUT_PUSH_PULL ); OLED_DC_Clr(); OLED_RST_Clr(); OLED_RST_Set(); delay_ms(100); OLED_RST_Clr(); delay_ms(100); OLED_RST_Set(); OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel OLED_WR_Byte(0x00,OLED_CMD);//---set low column address OLED_WR_Byte(0x10,OLED_CMD);//---set high column address OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F) OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常 OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64) OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F) OLED_WR_Byte(0x00,OLED_CMD);//-not offset OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration OLED_WR_Byte(0x12,OLED_CMD); OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02) OLED_WR_Byte(0x02,OLED_CMD);// OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5) OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7) OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/ OLED_Clear(); OLED_Set_Pos(0,0); }