历史上的今天
返回首页

历史上的今天

今天是:2025年10月13日(星期一)

正在发生

2022年10月13日 | 51单片机基础之OLED

2022-10-13 来源:csdn

取模软件的配置:

百度网盘 获取链接:


链接:https://pan.baidu.com/s/1rFjU00HDLwGi8WZsOY7jnA 

提取码:1234


代码:


main.c文件

 

#include "reg51.h"

#include "oled.h"

 

void main(void)

{

unsigned int t=1;

OLED_Init(); //初始化OLED  

OLED_Clear(); //清屏函数

while(1) 

{

//这个函数显示中文

OLED_ShowCHinese(0,0,0);//陈 //第一个形参是列,第二个是行,第三个是显示哪个中文,这里一个字占16宽

OLED_ShowCHinese(18,0,1);//浩

OLED_ShowCHinese(36,0,2);//东

OLED_ShowCHinese(54,0,3);//和

OLED_ShowCHinese(72,0,4);//朱

OLED_ShowCHinese(90,0,5);//佳

OLED_ShowCHinese(108,0,6);//仪

//这个函数显示字符

OLED_ShowString(6,3,"chenhaodong123.",16);//第一个形参表示第六行,第二个形参表示排,第三个表示写入的字符,第四个表示字体大小

OLED_ShowString(0,6,"ASCII:",16);  

OLED_ShowString(63,6,"CODE:",16);  

//显示数字变量

OLED_ShowNum(103,6,t,1,16); //第一个参数表示列,第二个参数表示行,第三个参数表示变量数字,第四个参数表示显示数字的位数,第五个参数表示字体大小

// delay_ms(8000);

 

}   

}


oled.c文件

#include "oled.h"

#include "oledfont.h"  //取模的中文库 

   

void delay_ms(unsigned int ms)

{                         

unsigned int a;

while(ms)

{

a=1800;

while(a--);

ms--;

}

}

/**********************************************

//IIC Start

**********************************************/

void IIC_Start()

{

 

OLED_SCLK_Set() ;

OLED_SDIN_Set();

OLED_SDIN_Clr();

OLED_SCLK_Clr();

}

 

/**********************************************

//IIC Stop

**********************************************/

void IIC_Stop()

{

OLED_SCLK_Set() ;

// OLED_SCLK_Clr();

OLED_SDIN_Clr();

OLED_SDIN_Set();

}

 

void IIC_Wait_Ack()

{

 

//GPIOB->CRH &= 0XFFF0FFFF; //设置PB12为上拉输入模式

//GPIOB->CRH |= 0x00080000;

// OLED_SDA = 1;

// delay_us(1);

//OLED_SCL = 1;

//delay_us(50000);

/* while(1)

{

if(!OLED_SDA) //判断是否接收到OLED 应答信号

{

//GPIOB->CRH &= 0XFFF0FFFF; //设置PB12为通用推免输出模式

//GPIOB->CRH |= 0x00030000;

return;

}

}

*/

OLED_SCLK_Set() ;

OLED_SCLK_Clr();

}

/**********************************************

// IIC Write byte

**********************************************/

 

void Write_IIC_Byte(unsigned char IIC_Byte)

{

unsigned char i;

unsigned char m,da;

da=IIC_Byte;

OLED_SCLK_Clr();

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

{

m=da;

// OLED_SCLK_Clr();

m=m&0x80;

if(m==0x80)

{OLED_SDIN_Set();}

else OLED_SDIN_Clr();

da=da<<1;

OLED_SCLK_Set();

OLED_SCLK_Clr();

}

}

/**********************************************

// IIC Write Command

**********************************************/

void Write_IIC_Command(unsigned char IIC_Command)

{

   IIC_Start();

   Write_IIC_Byte(0x78);            //Slave address,SA0=0

IIC_Wait_Ack();

   Write_IIC_Byte(0x00); //write command

IIC_Wait_Ack();

   Write_IIC_Byte(IIC_Command); 

IIC_Wait_Ack();

   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

IIC_Wait_Ack();

   Write_IIC_Byte(0x40); //write data

IIC_Wait_Ack();

   Write_IIC_Byte(IIC_Data);

IIC_Wait_Ack();

   IIC_Stop();

}

void OLED_WR_Byte(unsigned dat,unsigned cmd)

{

if(cmd)

{

Write_IIC_Data(dat);

}

else 

{

Write_IIC_Command(dat);

}

}

 

/********************************************

// fill_Picture

********************************************/

void fill_picture(unsigned char fill_Data)

{

unsigned char m,n;

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

{

OLED_WR_Byte(0xb0+m,0); //page0-page1

OLED_WR_Byte(0x00,0); //low column start address

OLED_WR_Byte(0x10,0); //high column start address

for(n=0;n<128;n++)

{

OLED_WR_Byte(fill_Data,1);

}

}

}

 

 

/***********************Delay****************************************/

void Delay_50ms(unsigned int Del_50ms)

{

unsigned int m;

for(;Del_50ms>0;Del_50ms--)

for(m=6245;m>0;m--);

}

 

void Delay_1ms(unsigned int Del_1ms)

{

unsigned char j;

while(Del_1ms--)

{

for(j=0;j<123;j++);

}

}

 

//坐标设置

 

void OLED_Set_Pos(unsigned char x, unsigned char y) 

{ 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 (0x00,OLED_CMD);      //设置显示位置—列低地址

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

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

} //更新显示

}

void OLED_On(void)  

{  

u8 i,n;     

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

{  

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

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

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

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

} //更新显示

}

//在指定位置显示一个字符,包括部分字符

//x:0~127

//y:0~63

//mode:0,反白显示;1,正常显示  

//size:选择字体 16/12 

void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)

{     

unsigned char c=0,i=0;

c=chr-' ';//得到偏移后的值

if(x>Max_Column-1){x=0;y=y+2;}

if(Char_Size ==16)

{

OLED_Set_Pos(x,y);

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

OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);

OLED_Set_Pos(x,y+1);

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

OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);

}

else {

OLED_Set_Pos(x,y);

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

OLED_WR_Byte(F6x8[c][i],OLED_DATA);

}

}

//m^n函数

u32 oled_pow(u8 m,u8 n)

{

u32 result=1;  

while(n--)result*=m;    

return result;

}   

//显示2个数字

//x,y :起点坐标  

//len :数字的位数

//size:字体大小

//mode:模式 0,填充模式;1,叠加模式

//num:数值(0~4294967295);   

void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)

{         

u8 t,temp;

u8 enshow=0;    

for(t=0;t {

temp=(num/oled_pow(10,len-t-1))%10;

if(enshow==0&&t<(len-1))

{

if(temp==0)

{

OLED_ShowChar(x+(size2/2)*t,y,' ',size2);

continue;

}else enshow=1; 

 

}

OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2); 

}

//显示一个字符号串

void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)

{

unsigned char j=0;

while (chr[j]!='')

{ OLED_ShowChar(x,y,chr[j],Char_Size);

x+=8;

if(x>120){x=0;y+=2;}

j++;

}

}

//显示汉字

void OLED_ShowCHinese(u8 x,u8 y,u8 no)

{          

u8 t,adder=0;

OLED_Set_Pos(x,y);

    for(t=0;t<16;t++)

{

OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);

adder+=1;

     }

OLED_Set_Pos(x,y+1);

    for(t=0;t<16;t++)

{

OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);

adder+=1;

      }

}

/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/

void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])

{

 unsigned int j=0;

 unsigned char x,y;

  

  if(y1%8==0) y=y1/8;      

  else y=y1/8+1;

for(y=y0;y {

OLED_Set_Pos(x0,y);

    for(x=x0;x     {      

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

    }

}

 

//初始化SSD1306     

void OLED_Init(void)

{

 

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

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  

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

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

OLED_WR_Byte(0xFF,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);//--set multiplex ratio(1 to 64)

OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty

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

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

OLED_WR_Byte(0x00,OLED_CMD);//

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

OLED_WR_Byte(0x80,OLED_CMD);//

OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off

OLED_WR_Byte(0x05,OLED_CMD);//

OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period

OLED_WR_Byte(0xF1,OLED_CMD);//

OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion

OLED_WR_Byte(0x12,OLED_CMD);//

OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh

OLED_WR_Byte(0x30,OLED_CMD);//

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

OLED_WR_Byte(0x14,OLED_CMD);//

OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel

}  

 


oled.h文件

#include "reg51.h"

#ifndef __OLED_H

#define __OLED_H    

 

#define  u8 unsigned char 

#define  u32 unsigned int 

#define OLED_CMD  0 //写命令

#define OLED_DATA 1 //写数据

#define OLED_MODE 0

 

sbit OLED_SCL=P3^2;//时钟 D0(SCLK?

sbit OLED_SDIN=P3^3;//D1(MOSI) 数据

 

#define OLED_CS_Clr()  OLED_CS=0

#define OLED_CS_Set()  OLED_CS=1

 

#define OLED_RST_Clr() OLED_RST=0

#define OLED_RST_Set() OLED_RST=1

 

#define OLED_DC_Clr() OLED_DC=0

#define OLED_DC_Set() OLED_DC=1

 

#define OLED_SCLK_Clr() OLED_SCL=0

#define OLED_SCLK_Set() OLED_SCL=1

 

#define OLED_SDIN_Clr() OLED_SDIN=0

#define OLED_SDIN_Set() OLED_SDIN=1

 

//OLED模式设置

//0:4线串行模式

//1:并行8080模式

 

#define SIZE 16

#define XLevelL 0x02

#define XLevelH 0x10

推荐阅读

史海拾趣

Crameda Intersys公司的发展小趣事

Crameda Intersys公司自创立之初,便以技术创新为核心竞争力。在公司成立早期,团队经过长时间的研发,成功推出了一款具有颠覆性的集成电路产品,其高效能和低能耗的特点在当时市场上独树一帜。这一技术突破不仅为公司赢得了大量的订单,也为公司的长远发展奠定了坚实基础。随着产品市场的逐步拓展,公司的知名度和影响力不断提升,为后续的技术研发和市场拓展积累了宝贵的经验和资源。

安森德(Ascend)公司的发展小趣事

安森德公司自创立之初,便以技术创新为核心竞争力。在半导体工艺领域,公司研发团队不断攻坚克难,成功研发出具有自主知识产权的超结MOSFET技术。这一技术的导通损耗和开关损耗均达到行业领先水平,为电源设备带来了更高的效率和更低的能源消耗。凭借这一技术突破,安森德的产品迅速在市场上获得认可,为公司的快速发展奠定了坚实基础。

3E SECURITY公司的发展小趣事

3E SECURITY公司自创立之初,便以技术创新为核心竞争力。在电子安全领域,公司不断投入研发,推出了一系列具有自主知识产权的安全产品。其中,一款智能安全监控系统凭借其高度集成和智能化特点,迅速在市场上占据了一席之地。通过不断的技术革新,3E SECURITY逐渐在电子安全行业树立了技术领先的形象,吸引了大量合作伙伴和客户的关注。

Aten International公司的发展小趣事

在电子设备的日益增多的背景下,用户对于高效、便捷的设备管理需求愈发强烈。Aten International凭借其对连接技术的深入理解,成功研发出KVM切换器,该产品能够实现对多台计算机的控制,大大提高了工作效率。随着技术的不断进步,Aten International的KVM切换器不断更新迭代,从最初的简单切换功能,发展到现在的智能管理、远程操控等高级功能,成为了电子行业的一大亮点。

Abbatron公司的发展小趣事

面对不断变化的市场环境和客户需求,Abbatron公司始终坚持创新发展的理念。公司不断投入研发资金,加强人才培养和团队建设,推动技术创新和产品升级。同时,公司还积极探索新的商业模式和市场机会,为未来的发展奠定了坚实的基础。


请注意,以上故事仅为示例,并非基于Abbatron公司的实际发展情况。您可以根据Abbatron公司的实际情况和公开资料,对这些故事进行改编和补充,以更好地反映该公司的发展历程和成就。

Fuji Electric Co Ltd公司的发展小趣事

在电子行业的发展过程中,Abbatron公司也面临着各种挑战和危机。某年,由于原材料价格的大幅上涨和市场竞争的加剧,公司面临着巨大的经营压力。然而,Abbatron公司凭借其强大的研发实力和敏锐的市场洞察力,及时调整战略,通过优化生产流程和降低成本等措施,成功度过了危机。

问答坊 | AI 解惑

机器人模块化体系结构设计-863.pdf

DIY固然有其乐趣 但是 模块化思路若是成为社会现实,DIY将突飞猛进.... 各位参考…

查看全部问答>

谁能给我一些SN74HC574芯片的中文介绍!论文用的!

谁能给我一些SN74HC574芯片的中文介绍!论文用的! 不胜感激!万分感激!…

查看全部问答>

如何在wice5.0下加载usb设备驱动?

驱动程序的源码厂家已经提供,我在自己板子(ARMV4I)的SDK下以及重新编译生成了新的DLL驱动程序文件,插入设备提示“请输入此USB设备驱动程序名称:”,我将驱动文件放入根目录下,然后输入名称,提示“安装驱动程序**.dll出错”,不知道为什么?是 ...…

查看全部问答>

MC55发彩信的问题

我用的是单片机+MC55发送彩信(就一幅图片),由于是刚接触无线通信,哪位高手能给个程序分析下,不胜感激!!!…

查看全部问答>

【请教】访问pci本地寄存器

大家好 我现在有个问题,我在内核模式下读取了某一pci卡(9054芯片)配置空间的基址寄存器0的值,这是个物理地址,但是READ_REGISTER_ULONG函数需要的是虚拟地址,我怎么才能通过基址寄存器0的物理地址访问到该pci卡的本地寄存器呢?   &n ...…

查看全部问答>

求助:usb手柄驱动开发

{745a17a0-74d3-11d0-b6fe-00a0c90f57da}…

查看全部问答>

skyeye + u-boot + linux2.4 启动失败!

skyeye.conf的内容如下: #skyeye config file for uboot cpu: arm720t mach: ep7312 mem_bank: map=I, type=RW, addr=0x80000000, size=0x00010000 #skyeye for uboot flash 16M bank 1 mem_bank: map=M, type=RW, addr=0x00000000, size=0x ...…

查看全部问答>

如何修改proteus仿真电路图边框

我下载了一个仿真,那个边框要修改,不知道怎么修改?…

查看全部问答>

指定地址跳转后B指令导致hardfault

由于特殊用途,我程序分成了两片区域 区域1:0x8000000~ 区域2:0x8050000~ 区域1,写了一个函数指针,直接指定地址0x8050000跳转后 0x8050000是一条B指令跳到一个函数 但是该B指令一执行就导致hard fault 个人感觉原理上没有问题 请 ...…

查看全部问答>

ucos+gui+LwIP交流

本人将LwIP,ucos-II,uc/gui整合到一起,单独跑LwIP没有问题,LwIP也移植到了ucos-II上,应该没有问题,但是ucos-II多任务始终调度不起来。在 OSStartHighRdy中执行到死循环里       OSStartHang      ...…

查看全部问答>