历史上的今天
返回首页

历史上的今天

今天是:2024年09月07日(星期六)

2019年09月07日 | STM32 IIC OLED中英文显示

2019-09-07 来源:eefocus

简介 ;  II2C OLED   中英文显示   ADC数据采集实时显示   八路ADC


一 先上代码


#include "oled.h"

#include "sys.h"

#include "delay.h"

#include "oledfont.h"

#include "delay.h"

#include "bmp.h"

#include "gbk.h"

#define uint unsigned int

#define uchar unsigned char

//OLED显存

u8 OLED_GRAM[128][8];

// 开始信号:SCLK为高电平 SDA由高电平跳变为低电平 开始传输数据

// 结束信号:SCLK为高电平 SDA由低电平跳变为高电平 结束传输数据

 

void IIC_Start(void)   // 开始信号

{

OLED_SCLK_Set();   //SCLK置高 1

OLED_SDIN_Set();   //SDA置高 1

delay_us(4);

OLED_SDIN_Clr();   //SDA置低 0

delay_us(4);

OLED_SCLK_Clr();   //SCLK置低 0

}

 

void IIC_Stop(void)   //结束信号

{

OLED_SCLK_Set();  //SCLK置高 1

OLED_SDIN_Clr();  //SDA置低 0

delay_us(4);

OLED_SDIN_Set();  //SDA置高 1

}

 

 

void IIC_Wait_Ack(void)  //应答信号

{

OLED_SCLK_Set();

OLED_SCLK_Clr();

}

 

//写一个II2C字节

void Write_IIC_Byte(uchar IIC_Byte)

{

uchar i,m,da;

da = IIC_Byte;

OLED_SCLK_Clr();

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

{

m = da;

m = m&0x80;

if(m==0x80)

{

OLED_SDIN_Set();

}else

{

OLED_SDIN_Clr();

}

da<<=1;

OLED_SCLK_Set();

OLED_SCLK_Clr();

}

}

//写命令

void Write_IIC_Command(uchar IIC_Command)

{

IIC_Start();

Write_IIC_Byte(0x78); 

IIC_Wait_Ack();

Write_IIC_Byte(0x00);    //写指令

IIC_Wait_Ack();

Write_IIC_Byte(IIC_Command);

IIC_Wait_Ack();

IIC_Stop();

}

 

void Write_IIC_Data(uchar IIC_Data)

{

IIC_Start();

Write_IIC_Byte(0x78); 

IIC_Wait_Ack();

Write_IIC_Byte(0x40);   // 写数据

IIC_Wait_Ack();

Write_IIC_Byte(IIC_Data);

IIC_Wait_Ack();

IIC_Stop();

}

 

//写一个字节

void OLED_WR_Byte(uchar dat,uchar cmd)

{

if(cmd)   //如果cmd为真(不等于0) 就执行Write_IIC_Data(dat); 如果不为真则执行else中的Write_IIC_Command(dat);

{

Write_IIC_Data(dat);

}else{

Write_IIC_Command(dat);

}

}

 

void OLED_Set_Pos(uchar x,uchar y)   //坐标设置

{

OLED_WR_Byte(0xb0+y,OLED_CMD);   //显示0-7页  y的取值范围为0-7

OLED_WR_Byte((x&0xf0)>>4|0x10,OLED_CMD);//取8位起始列地址的高四位

OLED_WR_Byte((x&0x0f),OLED_CMD);//取8位起始列地址的低四位

}

 

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

//x:0~127

//y:0~63

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

//size:选择字体 12/16/24

void OLED_ShowChar(uchar x,uchar y,uchar chr,uchar Size)

{

uchar i,c;

c=chr-' ';

if(x>Max_Column-1)

{

x=0;

y+=2;

}

if(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); 

}

 

//显示字符串

//x,y:起点坐标  

//size:字体大小 

//*p:字符串起始地址 

void OLED_ShowString(uchar x,uchar y,uchar *p,uchar Size)

{

uchar j = 0;

while(p[j]!='')

{

OLED_ShowChar(x,y,p[j],Size);

x+=8;

if(x>120)

{

x=0;

y+=2;

}

j++;

}

}

 

 

//显示的位置   取码的中文            第几位 1 2 3 kai

void OLED_ShowChinese(uchar x,uchar y,uchar no)

{

uchar 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;

}

}

 

//显示的位置   取码的中文            第几位 1 2 3 kai

void OLED_ShowChinese1(uchar x,uchar y,uchar no)

{

uchar t,adder = 0;

OLED_Set_Pos(x,y);

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

{

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

adder+=1;

}

OLED_Set_Pos(x,y+1);

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

{

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

adder+=1;

}

}

 

 

 

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); 

} //更新显示

}

 

 

//oled初始化

void OLED_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

/*   OLED 屏幕 的GPI0 的初始化       */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD,ENABLE);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_SetBits(GPIOB,GPIO_Pin_8);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOD,&GPIO_InitStructure);

GPIO_SetBits(GPIOD,GPIO_Pin_2);

delay_ms(100);

OLED_WR_Byte(0xAE,OLED_CMD);

OLED_WR_Byte(0x00,OLED_CMD);

OLED_WR_Byte(0x10,OLED_CMD);

OLED_WR_Byte(0x40,OLED_CMD);

OLED_WR_Byte(0xB0,OLED_CMD);

OLED_WR_Byte(0x81,OLED_CMD);

OLED_WR_Byte(0xFF,OLED_CMD);

OLED_WR_Byte(0xA1,OLED_CMD);

OLED_WR_Byte(0xA6,OLED_CMD);

OLED_WR_Byte(0xA8,OLED_CMD);

OLED_WR_Byte(0x3F,OLED_CMD);

OLED_WR_Byte(0xC8,OLED_CMD);

OLED_WR_Byte(0xD3,OLED_CMD);

OLED_WR_Byte(0x00,OLED_CMD);

OLED_WR_Byte(0xD5,OLED_CMD);

OLED_WR_Byte(0x80,OLED_CMD);

OLED_WR_Byte(0xD8,OLED_CMD);

OLED_WR_Byte(0x05,OLED_CMD);

OLED_WR_Byte(0xD9,OLED_CMD);

OLED_WR_Byte(0xF1,OLED_CMD);

OLED_WR_Byte(0xDA,OLED_CMD);

OLED_WR_Byte(0x12,OLED_CMD);

OLED_WR_Byte(0xDB,OLED_CMD);

OLED_WR_Byte(0x30,OLED_CMD);

OLED_WR_Byte(0x8D,OLED_CMD);

OLED_WR_Byte(0x14,OLED_CMD);

OLED_WR_Byte(0xAF,OLED_CMD);

OLED_Clear();

}

 

//显示初始化

void Show_Init(void)

{

OLED_ShowString(14,3,(u8*)"ADC1:",16);

OLED_ShowString(14,5,(u8*)"ADC2:",16);

OLED_ShowChinese(103,3,7);

OLED_ShowChinese(103,5,7);

}

 

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

/*      

                   画点函数

x:    横坐标     0~127

y:    纵坐标     0~63

t:     0,清空;1,填充

*/ 

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

/*                更新显存到OLED                                             */

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

void OLED_Refresh_Gram(void)

{

    u8 i,n;         

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

    {  

        Write_IIC_Command(0xb0+i);   //设置页地址

        Write_IIC_Command(0x00);      //显示-列低地址

        Write_IIC_Command(0x10);      //显示-列高地址

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

Write_IIC_Data(OLED_GRAM[n][i]);      //写数据

    }   

}

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

void OLED_DrawPoint(u8 x,u8 y,u8 t)

{

    u8 pos,bx,temp=0;

    if(x>127||y>63)return;            //超出范围

    pos=7-y/8;

    bx=y%8;

    temp=1<<(7-bx);

    if(t)OLED_GRAM[x][pos]|=temp;

    else OLED_GRAM[x][pos]&=~temp;     

}

 

 

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

/*                

显示一个汉字                          

x,y:起点坐标

num :字库中第几个汉字

size:字体大小

mode:模式

*/ 

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

void OLED_ShowGBK(u8 x, u8 y,  u8 num, u8 size,u8 mode)

{

    u8 temp,t,t1;

    u8 y0=y;

//u8 size = 16;

    u8 csize=(size/8 + ((size%8)?1:0)) * size;     //得到字体一个字符对应点阵集所占的字节数

              

    for(t=0;t    {  

  

        if(size==12)      temp = gbk_1212[num][t];    //调用1212字体

        else if(size==16) temp = gbk_1616[num][t];    //调用1616字体

        else return;                                //没有的字库

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

        {

            if(temp&0x80)OLED_DrawPoint(x,y,mode);

            else OLED_DrawPoint(x,y,!mode);

            temp<<=1;

            y++;

            if((y-y0)==size)

            {

                y=y0;

                x++;

                break;

            }

        }    

    }

}

 

 

 

 

 

#ifndef __OLEDFONT_H

#define __OLEDFONT_H    

//常用ASCII表

//偏移量32

//ASCII字符集

//偏移量32

//大小:12*6  const

/************************************6*8的点阵************************************/

 unsigned char F6x8[][6] =

{

0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp

0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !

推荐阅读

史海拾趣

HSMC公司的发展小趣事

HSMC的发展不仅为公司自身带来了显著的经济效益,也为当地社会和经济发展做出了重要贡献。项目全面达产后,预计可实现年产值600亿元,利税60亿元,直接带动就业人口3000人。此外,HSMC还通过技术创新和产业升级,带动了上下游产业链的发展,促进了整个电子行业的繁荣与进步。

以上五个故事共同描绘了HSMC在电子行业中的崛起与发展历程。作为一家充满活力和创新精神的企业,HSMC正以其独特的优势和不懈的努力,向着成为全球领先CIDM晶圆厂的目标不断迈进。

Excelics [Excelics Semiconductor, Inc.]公司的发展小趣事

Excelics Semiconductor自创立之初,就致力于半导体技术的研发与创新。在公司成立的初期,他们成功研发了一款高性能、低功耗的芯片,这一技术突破迅速赢得了市场的认可。随着技术的不断迭代和升级,Excelics Semiconductor逐渐在半导体领域建立了自己的技术壁垒,成为了行业的领军者。

Coleman Cable Inc公司的发展小趣事

随着全球环保意识的不断提高,Coleman Cable积极响应绿色发展的号召,将环保理念融入公司的生产和经营中。公司研发出环保型电缆产品,采用环保材料和工艺,减少生产过程中的环境污染。同时,公司还加强废弃电缆的回收和处理工作,推动资源的循环利用,为行业的绿色发展做出了贡献。

Highland Electronics Co Ltd公司的发展小趣事

在公司快速发展的过程中,High Tech Chips Inc深刻认识到单打独斗的局限性。因此,公司积极寻求与全球知名科技企业的战略合作。通过与华为、三星等手机制造商的合作,High Tech Chips Inc的芯片产品被广泛应用于这些企业的旗舰机型中,极大地提升了产品的知名度和市场占有率。同时,公司还与英伟达、英特尔等芯片巨头建立了技术合作关系,共同推动芯片技术的创新和发展。

BILIN公司的发展小趣事

在公司快速发展的过程中,High Tech Chips Inc深刻认识到单打独斗的局限性。因此,公司积极寻求与全球知名科技企业的战略合作。通过与华为、三星等手机制造商的合作,High Tech Chips Inc的芯片产品被广泛应用于这些企业的旗舰机型中,极大地提升了产品的知名度和市场占有率。同时,公司还与英伟达、英特尔等芯片巨头建立了技术合作关系,共同推动芯片技术的创新和发展。

AMD(超微)公司的发展小趣事

在追求技术创新和商业成功的同时,High Tech Chips Inc还积极践行环保和可持续发展理念。公司致力于开发绿色、低碳的芯片产品和技术解决方案,减少生产过程中的能源消耗和环境污染。同时,公司还积极参与社会公益活动,支持教育、环保等领域的项目发展。这些举措不仅提升了公司的社会形象和品牌价值,也为公司的长远发展注入了新的动力。

请注意,以上故事均为虚构内容,旨在展示电子行业高科技芯片公司可能的发展路径和策略。在实际情况中,不同公司的发展故事会因其独特的背景、资源和市场环境而有所不同。

问答坊 | AI 解惑

嵌入式MODEM在铁路雨量监测系统中的应用

引言铁路部门的雨量监测是有关铁路安全的一个重要环节。由雨量过多引起的洪水会影响铁路路基,引发列车交通事故。因此,为了确保交通命脉的安全,应及时将铁路沿线的雨量反馈至铁路管理部门。过去雨量监测是由各站点人工抄记雨量监测仪表数据, ...…

查看全部问答>

电子设计大赛-鸡肋还是鸡喙  

  电子设计大赛是否有必要参加?就如同在问其到底是鸡肋还是鸡喙,值得商榷。   近日听说2009全国电子专业人才设计与技能大赛已经开始报名,作为一个工作两年的电路设计工程师,我有我自己的看法。   首先要谈谈上学与就业的关系,上学的意义 ...…

查看全部问答>

新手报道,发几个教程

新手报道,不知道对大家有没有用,如果有用还会把其他杂七杂八的都传上 [ 本帖最后由 hdx 于 2009-7-12 13:21 编辑 ]…

查看全部问答>

哪位大哥能提供下载:SAP KERNEL ORACLE 文件的地址吗?

哪位大哥能提供下载:SAP KERNEL ORACLE 文件的地址吗? 我在安装SAP IDES4.7时,发现少了一个文件目录,即:SAP KERNEL ORACLE, 请各位高手帮帮我! 我已经安装很多次了,不过到了需要CD kernel时,就安装不了,我是下载SAP的安装包的,没有CD,不 ...…

查看全部问答>

从OAL请求一个逻辑中断号

KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_I2CIrq, sizeof(UINT32), &g_I2CSysIntr, sizeof(UINT32), NULL) 可以从OAL请求一个SYSINTR值,然后通过IST执行相关中断 但是SYSINTR有SYSINTR_I2C,SYSINTR_TOUC,SYSINTR_SERIA....... 系统怎么 ...…

查看全部问答>

eboot汇编代码跳转到main时候的问题

[0xe3a01001]   mov      r1,#1 [0xee031f10]   mcr      p15,0x0,r1,c3,c0,0 [0xee02af10]   mcr      p15,0x0,r10,c2,c0,0 [0xee080f17]  & ...…

查看全部问答>

为什么门电路很多都是反向的?

好多元件,喜欢用与非门,或非门,这样输入和输出都是取反的。感觉很麻烦,这里面有什么道理吗?…

查看全部问答>

安装eMbedded Visual C++后出现的问题,请大家帮助

我在安装好eMbedded Visual C++后,编译一个程序成功,然后启动了Emulator,但是在之后,Connecting to the device 失败,编译好的程序不能上载,这是为什么呀。 …

查看全部问答>

>>>looking for someone interested in the kernel/ARM core

Hi Guys, i am looking for someone interested in the kernel/ARM core. will be paid well. drop a line at linuxkernelembedded@yahoo.co.uk to make an appointment with me if you feel you might be the one i am looking for at the mom ...…

查看全部问答>

我的LED应急灯制作过程(4)-调试完成,交差!

各位网友,本人羞愧但是又高兴地告诉大家,我的LED应急灯制作成功了!!羞愧的是我完成的很晚,高兴的是终于达到制作要求。       首先要感谢的是SOSO琳子姐姐(实际按我的年龄该叫她侄女,既然网友都这么叫她,我也这么 ...…

查看全部问答>