STC89C52驱动SH1106芯片点亮OLED问题点总结

发布者:BlossomBeauty最新更新时间:2022-11-04 来源: csdn关键字:STC89C52  驱动 手机看文章 扫描二维码
随时随地手机看文章

主芯片:STC89C52


OLED驱动芯片:SH1106

OLED屏大小为1.3寸,像素点是128X64(8页X8),通信方式有IIC和SPI两种方式。


烧录软件:STC-ISP

在这里插入图片描述

文字图片取模软件:PCtoLCD2002

在这里插入图片描述

选择阳码:屏黑字白(使用这个)

选择阴码:屏白字黑

阳码亮点为0,阴码亮点为1,代码中0XFF为白,0x00为黑。


一个简单的延时毫秒代码:


void delay_ms(unsigned int ms)

{                         

unsigned int a;

while(ms)

{

a=100;

while(a--);

ms--;

}

return;

}


下边简单介绍利用SPI通信点亮OLED:


//引脚定义

sbit OLED_SCL=P1^7;//SCL

sbit OLED_SDA=P1^6;//MOSI

sbit OLED_RES =P1^5;//RES

sbit OLED_DC =P1^4;//DC

sbit OLED_CS=P1^3; //CS


#define OLED_CMD  0 //写命令

#define OLED_DATA 1 //写数据


//MCU写一个字节的数据

void OLED_WR_Byte(u8 dat,u8 cmd)

{

u8 i;   

if(cmd)

  OLED_DC=1;

else 

  OLED_DC=0;   

  OLED_CS=0;

for(i=0;i<8;i++)

{   

OLED_SCL=0;

if(dat&0x80)

{

OLED_SDA=1;

}

else

{

OLED_SDA=0;

}

    OLED_SCL=1;

dat<<=1;   

}   

OLED_CS=1;

OLED_DC=1;   

}   

//坐标设置

void OLED_Set_Pos(u8 x, u8 y) 

x+=2;

OLED_WR_Byte(0xb0+y,OLED_CMD);

OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);

OLED_WR_Byte((x&0x0f),OLED_CMD);

//开启OLED显示    

void OLED_Display_On(void)

{

OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令

OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON

OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON

}

//关闭OLED显示     

void OLED_Display_Off(void)

{

OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令

OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF

OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF

}      

//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!   

void OLED_Clear(void)  

{  

u8 i,n;     

for(i=0;i<8;i++)  

{  

OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)

OLED_WR_Byte (0x02,OLED_CMD);      //设置显示位置—列低地址

OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   

for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); 

} //更新显示

}


//显示汉字 

void OLED_ShowChinese(u8 x,u8 y,u8 no,u8 sizey)

{

u16 i,size1=(sizey/8+((sizey%8)?1:0))*sizey;

for(i=0;i {

if(i%sizey==0) OLED_Set_Pos(x,y++);

if(sizey==16) OLED_WR_Byte(MP3_16X16[no][i],OLED_DATA);//16x16字号,用取模取16x16的汉子存在二维数组MP3_16X16中

else if(sizey==12) OLED_WR_Byte(MP3_12X12[no][i],OLED_DATA);//12x12字号,用取模取12x12的汉子存在二维数组MP3_12X12中

else return;

}

}



//显示图片

//x,y显示坐标

//sizex,sizey,图片长宽

//BMP:要显示的图片

void OLED_DrawBMP(u8 x,u8 y,u8 sizex, u8 sizey,u8 BMP[])

{

  u16 j=0;

u8 i,m;

sizey=sizey/8+((sizey%8)?1:0);

for(i=0;i {

OLED_Set_Pos(x,i+y);

    for(m=0;m {      

OLED_WR_Byte(BMP[j++],OLED_DATA);    

}

}

}


//屏初始化

void OLED_Init(void)

{

OLED_RES_Clr();

    delay_ms(200);

OLED_RES_Set();

OLED_WR_Byte(0xAE,OLED_CMD); /*display off*/ 

OLED_WR_Byte(0x02,OLED_CMD); /*set lower column address*/ 

OLED_WR_Byte(0x10,OLED_CMD); /*set higher column address*/ 

OLED_WR_Byte(0x40,OLED_CMD); /*set display start line*/ 

OLED_WR_Byte(0xB0,OLED_CMD); /*set page address*/

OLED_WR_Byte(0x81,OLED_CMD); /*contract control*/ 

OLED_WR_Byte(0xcf,OLED_CMD); /*128*/ 

OLED_WR_Byte(0xA1,OLED_CMD); /*set segment remap*/ 

OLED_WR_Byte(0xA6,OLED_CMD); /*normal / reverse*/ 

OLED_WR_Byte(0xA8,OLED_CMD); /*multiplex ratio*/ 

OLED_WR_Byte(0x3F,OLED_CMD); /*duty = 1/64*/ 

OLED_WR_Byte(0xad,OLED_CMD); /*set charge pump enable*/ 

OLED_WR_Byte(0x8b,OLED_CMD); /* 0x8B 内供 VCC */ 

OLED_WR_Byte(0x33,OLED_CMD); /*0X30---0X33 set VPP 9V */ 

OLED_WR_Byte(0xC8,OLED_CMD); /*Com scan direction*/ 

OLED_WR_Byte(0xD3,OLED_CMD); /*set display offset*/ 

OLED_WR_Byte(0x00,OLED_CMD); /* 0x20 */ 

OLED_WR_Byte(0xD5,OLED_CMD); /*set osc division*/ 

OLED_WR_Byte(0x80,OLED_CMD); 

OLED_WR_Byte(0xD9,OLED_CMD); /*set pre-charge period*/ 

OLED_WR_Byte(0x1f,OLED_CMD); /*0x22*/ 

OLED_WR_Byte(0xDA,OLED_CMD); /*set COM pins*/ 

OLED_WR_Byte(0x12,OLED_CMD); 

OLED_WR_Byte(0xdb,OLED_CMD); /*set vcomh*/ 

OLED_WR_Byte(0x40,OLED_CMD);

OLED_Clear();

OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/

}


//主函数

void main()

{

OLED_Init();//初始化OLED

while(1)

{

OLED_ShowChinese(0,0,0,16);//在坐标0,0显示二维数组MP3_16X16中的第一个元素。大小为16

delay_ms(2000);//延时2S

OLED_DrawBMP(0,0,128,64,BMP);//全屏显示BMP这张图片

delay_ms(2000);

}

}

关键字:STC89C52  驱动 引用地址:STC89C52驱动SH1106芯片点亮OLED问题点总结

上一篇:51单片机-STC89C52系列学习第三篇之中断学习
下一篇:51单片机-STC89C52系列学习第二篇之寄存器学习

推荐阅读最新更新时间:2024-11-06 14:44

基于AP3706的隔离式AC/DC LED驱动电路
  近年来,大功率高亮度LED发展迅速,在发光效率不断提高的同时,其价格不断下降。这使得LED照明成为未来绿色照明的希望。但LED驱动电路的设计仍然面临许多困难。由于LED需要低压直流电源驱动,在交流电网输入条件下,需要AC/DC转换器将交流电压转变成低压直流电,同时控制LED的电流恒定,输入和输出的电气隔离也是一项安全要求。开发高可靠性、体积小、低成本的LED驱动电路成为LED照明能否得到大规模应用的关键因素之一。   本文将介绍基于BCD公司最新LED驱动电路控制芯片AP3706开发的一款高性价比的隔离式AC/DC LED驱动电路,该方案仅采用极少的元件就实现了宽电压范围输入、恒流输出,并能满足LED驱动电路的各项要求。
[电源管理]
基于AP3706的隔离式AC/DC LED<font color='red'>驱动</font>电路
车窗 天窗驱动原理解析
 我们日常生活中,在外力操纵的车窗里常用电机驱动系统。而电机驱动系统有两种形式,即铰节式连杆传动机构和拉索式传动机构。而在一辆车上到底选用哪种传动机构,除了另外的一些准则以外,很大程度上其实是取决于车门内可供使用的安装空间。 首先我们介绍一下什么是铰节式连杆传动机构(齿轮式升降机构),当驱动电机通过小齿轮驱动与铰节式连杆传动机构相啮合的扇形齿轮。这种传动机构可以正、反向工作。另外一个拉索式传动机构(拉索式升降机机构)则是驱动电机通过拉索鼓轮驱动拉索升降机构。 车窗驱动电机:在车门内的空间里只能采用扁平式电机。减速传动机构为自锁式蜗轮蜗杆传动机构,并可防止意外和强制开启车窗。组合在传动系统中的阻尼元件可保证车窗在两极限位置时
[嵌入式]
带有PFC的初级端调节反激式LED驱动
  消费电子市场(特别是LED驱动市场)最近几年发展迅速。这些市场需要功耗低、尺寸小且成本超低的电源/驱动。另外,由于对电能质量要求不断提高,在这些设备上使用功率因数校正(PFC)电路几乎是必须的。今天,在多种不同电路中,反激因为简单而成为对这些应用最具吸引力的拓扑。它使用一个开关提供绝缘、启动以及各种其他保护。在非连续导通模式下工作时,通过简单的恒定导通时间控制,可使功率因数为1。   传统上,用于LED的恒流LED驱动使用隔离反激式转换器实施,该转换器具有输出电流调节电路,如图1所示。实际LED电流使用感测电阻测量,然后与与参考电压进行比较,生成误差电压。误差电压通过 光电耦合器 传输到初级端,并用于控制初级端开关器件的占空比
[电源管理]
带有PFC的初级端调节反激式LED<font color='red'>驱动</font>
51单片机编程 第五节:键盘驱动
第五节:键盘驱动 指提供一些函数给任务调用,获取按键信息,或读取按键值。 定义一个头文档 KEY.H ,描述可用函数,如下: 代码 1. #ifndef _KEY_H_ //防止重复引用该文档,如果没有定义过符号 _KEY_H_,则编译下面语句 2. #define _KEY_H_ //只要引用过一次,即 #include key.h ,则定义符号 _KEY_H_ 3. unsigned char keyHit( void ); //如果按键,则返回非0,否则返回0 4. unsigned char keyGet( void ); //读取按键值,如果没有按键则等待到按键为止 5.
[单片机]
NS推出具有温度管理控制功能的高亮度LED驱动
  美国国家半导体公司 (National Semiconductor Corporation)日前宣布推出一款具有温度管理控制功能的全新LED驱动器,并推出相应的在线设计支持工具。这款型号为LM3424的LED驱动器是美国国家半导体PowerWise 系列高能效系列芯片中一款新品,其特点是可以驱动高亮度的LED,适用于多种不同的室内/户外照明系统以及汽车照明应用。LM3424芯片除了可获得美国国家半导体WEBENCH LED Designer 的设计工具支持之外,还具有称为热能回折的温度管理控制功能。 系统设计工程师只要采用这款芯片,便可轻易快速地设计一组稳定可靠的热能监控系统。   受实际操作环境的影响,LED的内部温度可
[电源管理]
DAC7611驱动程序
#include reg52.h  //单片机控制PWM输出工程芯片测试20120301 #include intrins.h #define uint unsigned int sbit CS =P4^3; //输出片选信号 sbit CLK=P1^6; //输出时钟 sbit SDI=P1^7; //输出数据 sbit LD=P1^5; //输出数/模转换过程启动信号 /******初始化DAC7611******************/ void init_da(void) { LD=0; // 装载引脚置低 CS=1; //片选置高 CLK=1; //时钟置高 SDI=0; }
[单片机]
直流马达驱动芯片、低压、大电流、单全桥驱动-瑞盟MS31211
产品简述 MS31211 是一款低压、大电流、单全桥驱动。它可应用于低电压及电池供电的运动控制场合,并且内置电荷泵来提供内部功率 NMOS 所需的栅驱动电压。 MS31211 可以提供最高 3.2A 的峰值电流,其功率电源供电范围从 1.8V 到 10V,逻辑电源供电范围从1.8V 到 6V。 两个输入脚可以控制直流电机工作在正转、反转、刹车以及滑行模式。全桥由 IN1/IN2 逻辑控制,并且当所有的 INx=0V 超过 3ms 时,进入待机模式。 主要特点 ①单个全桥驱动器,低输出导通电阻,240m (HS+LS) ②3.2A 峰值电流能力 ③功率电源供电范围:1.8V 到 10V ④逻辑电源供电范围:1.8V 到 6V ⑤IN
[机器人]
直流马达<font color='red'>驱动</font><font color='red'>芯片</font>、低压、大电流、单全桥<font color='red'>驱动</font>-瑞盟MS31211
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved