欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

使用89C51微控制器的OLED屏幕显示技术实现

最编程 2024-07-28 09:40:37
...
/********************************************** //IIC Start **********************************************/ void IIC_Start() { SCL = high; SDA = high; _nop_(); SDA = low; _nop_();_nop_(); SCL = low; } /********************************************** //IIC Stop **********************************************/ void IIC_Stop() { SDA = low; _nop_(); SCL = high; _nop_();_nop_(); SDA = high; } /********************************************** // IIC Write byte **********************************************/ bit Write_IIC_Byte(unsigned char IIC_Byte) { unsigned char i; bit Ack_Bit; //应答信号 for(i=0;i<8;i++) { if(IIC_Byte & 0x80) //1?0? SDA=high; else SDA=low; //Delay_us(1); SCL=high; _nop_();_nop_(); SCL=low; //Delay_us(1); IIC_Byte<<=1; //loop } SDA = high; //释放IIC SDA总线为主器件接收从器件产生应答信号 _nop_();_nop_(); SCL = high; //第9个时钟周期 _nop_();_nop_(); Ack_Bit = SDA; //读取应答信号 SCL = low; return Ack_Bit; } /********************************************** // IIC Write Command **********************************************/ void 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(); } /********************************************** // IIC Write Data **********************************************/ void Write_IIC_Data(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_Init(void) { Delay_50ms(2); //这里的延时很重要 Write_IIC_Command(0xAE); //关显示 Write_IIC_Command(0x20); //设置内存寻址模式 Write_IIC_Command(0x10); //00,水平寻址模式;01,垂直寻址模式;10,页面寻址模式(重置);11,无效 Write_IIC_Command(0xb0); //为页面寻址模式设置页面开始地址,0-7 Write_IIC_Command(0xc8); //设置COM输出扫描方向 Write_IIC_Command(0x00); //---设置低列地址 Write_IIC_Command(0x10); //---设置高列地址 Write_IIC_Command(0x40); //--设置起始行地址 Write_IIC_Command(0x81); //--set contrast control register Write_IIC_Command(0xff); //亮度调节 0x00~0xff Write_IIC_Command(0xa1); //--设置段重新映射0到127 Write_IIC_Command(0xa6); //--设置正常显示 Write_IIC_Command(0xa8); //--设置复用比(1 ~ 64) Write_IIC_Command(0x3F); // Write_IIC_Command(0xa4); //0xa4,输出遵循RAM内容;0xa5,Output忽略RAM内容 Write_IIC_Command(0xd3); //-设置显示抵消 Write_IIC_Command(0x00); //-not offset Write_IIC_Command(0xd5); //--设置显示时钟分频/振荡器频率 Write_IIC_Command(0xf0); //--设置分率 Write_IIC_Command(0xd9); //--设置pre-charge时期 Write_IIC_Command(0x22); // Write_IIC_Command(0xda); //--设置com大头针硬件配置 Write_IIC_Command(0x12); Write_IIC_Command(0xdb); //--设置vcomh Write_IIC_Command(0x20); //0x20,0.77xVcc Write_IIC_Command(0x8d); //--设置DC-DC Write_IIC_Command(0x14); //--打开电荷泵 Write_IIC_Command(0xaf); //--打开oled面板 } void OLED_SetPos(unsigned char x, unsigned char y) //设置起始点坐标 { Write_IIC_Command(0xb0+y); Write_IIC_Command(((x&0xf0)>>4)|0x10); Write_IIC_Command((x&0x0f)|0x01); } void OLED_Fill(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 for(n=0;n<128;n++) { Write_IIC_Data(fill_Data); } } } void OLED_CLEAR(void)//清屏 { OLED_Fill(0x00); } //-------------------------------------------------------------- //让OLED休眠 – 休眠模式下,OLED功耗不到10uA void OLED_OFF(void) { Write_IIC_Command(0X8D); //设置电荷泵 Write_IIC_Command(0X10); //关闭电荷泵 Write_IIC_Command(0XAE); //OLED休眠 } void OLED_ON(void) { Write_IIC_Command(0X8D); //设置电荷泵 Write_IIC_Command(0X14); //打开电荷泵 Write_IIC_Command(0XAF); //OLED启动 }

推荐阅读