历史上的今天
返回首页

历史上的今天

今天是:2025年04月19日(星期六)

2019年04月19日 | 基于MSP430G2253的OLED驱动(SPI)

2019-04-19 来源:eefocus

本例OLED通过SPI与开发板建立连接(编辑器是IAR FOR MSP):


这个是OLED驱动:


//12864.c

#include"MSP430G2553.h"

#include"12864.h"

#include"qumo.h"

#include"stdio.h"

void delay(int ms)//延时

{

   int ii,jj;

   if (ms<1) ms=1;

   for(ii=0;ii   for(jj=0;jj<500;jj++);  





//向LCD写入地址     

void LCD_WrDat(unsigned char dat)

{

   unsigned char i=8;

     DC_SET;

     SCL_CLR;   

  while(i--)

  {

    if(dat&0x80)

      {SDA_SET;}

    else

      {SDA_CLR;}      

        SCL_SET ;        

        SCL_CLR;    

        dat<<=1;    

  }

}

//向LCD屏中写入命令

void LCD_WrCmd(unsigned char cmd)

{

    unsigned char i=8;

    DC_CLR;

    SCL_CLR;  

  while(i--)

  {

    if(cmd&0x80)

    {SDA_SET;}

    else{SDA_CLR;}

    SCL_SET;

    SCL_CLR;    

    cmd<<=1;   

  }     

}

//延时函数

void LCD_DLY_ms(unsigned int ms)

{                         

  unsigned int a;

  while(ms)

  {

    a=1335;

    while(a--);

    ms--;

  }

  return;

//LCD屏清屏

void LCD_CLS(void)

{

    unsigned char y,x;  

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

    {

        LCD_WrCmd(0xb0+y);

        LCD_WrCmd(0x01);

        LCD_WrCmd(0x10); 

        for(x=0;x            LCD_WrDat(0);

    }

}

//清屏操作

void LCD_Fill(unsigned char bmp_dat)

{

    unsigned char y,x;


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

    {

        LCD_WrCmd(0xb0+y);

        LCD_WrCmd(0x01);

        LCD_WrCmd(0x10);

        for(x=0;x            LCD_WrDat(bmp_dat);

    }

}


void LCD_Set_Pos(unsigned char x, unsigned char y)//设置坐标

  LCD_WrCmd(0xb0+y);

  LCD_WrCmd(((x&0xf0)>>4)|0x10);

  LCD_WrCmd((x&0x0f)|0x00); 

//LCD液晶屏初始化

void LCD_Init(void)        

{  

        SCL_SET;

        RST_CLR;

    LCD_DLY_ms(50);

        RST_SET;


    //从上电到下面开始初始化要有足够的时间,即等待RC复位完毕   


  LCD_WrCmd(0xae);//--turn off oled panel

  LCD_WrCmd(0x00);//---set low column address

  LCD_WrCmd(0x10);//---set high column address

  LCD_WrCmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)

  LCD_WrCmd(0x81);//--set contrast control register

  LCD_WrCmd(0xcf); // Set SEG Output Current Brightness

  LCD_WrCmd(0xa1);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常

  LCD_WrCmd(0xc8);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常

  LCD_WrCmd(0xa6);//--set normal display

  LCD_WrCmd(0xa8);//--set multiplex ratio(1 to 64)

  LCD_WrCmd(0x3f);//--1/64 duty

  LCD_WrCmd(0xd3);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)

  LCD_WrCmd(0x00);//-not offset

  LCD_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency

  LCD_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec

  LCD_WrCmd(0xd9);//--set pre-charge period

  LCD_WrCmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock

  LCD_WrCmd(0xda);//--set com pins hardware configuration

  LCD_WrCmd(0x12);

  LCD_WrCmd(0xdb);//--set vcomh

  LCD_WrCmd(0x40);//Set VCOM Deselect Level

  LCD_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)

  LCD_WrCmd(0x02);//

  LCD_WrCmd(0x8d);//--set Charge Pump enable/disable

  LCD_WrCmd(0x14);//--set(0x10) disable

  LCD_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)

  LCD_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7) 

  LCD_WrCmd(0xaf);//--turn on oled panel

  LCD_Fill(0x00);  //初始清屏

  LCD_Set_Pos(0,0);     


//==============================================================

//函数名:LCD_P6x8Str(unsigned char x,unsigned char y,unsigned char *p)

//功能描述:写入一组标准ASCII字符串

//参数:显示的位置(x,y),y为页范围0~7,要显示的字符串

//返回:无

//==============================================================  

void LCD_P6x8Str(unsigned char x,unsigned char y,unsigned char ch[])

{

  unsigned char c=0,i=0,j=0;      

  while (ch[j]!='')

  {    

    c =ch[j]-32;

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

    LCD_Set_Pos(x,y);    

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

      LCD_WrDat(F6x8[c][i]);  

    x+=6;

    j++;

  }

}


//==============================================================

//函数名:LCD_P6x8num(unsigned char x,unsigned char y,unsigned char *p)

//功能描述:写入number

//参数:显示的位置(x,y),y为页范围0~7,要显示的字符串

//返回:无

//==============================================================  

void LCD_P6x8num(unsigned char x,unsigned char y,float num)

{

     char ch[20];


    char c=0,i=0,j=0; 

    sprintf(ch, "%2.4f", num);

  while (ch[j]!='')

  {    

    c =ch[j]-32;

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

    LCD_Set_Pos(x,y);    

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

      LCD_WrDat(F6x8[c][i]);  

    x+=6;

    j++;

  }

}

//==============================================================

//函数名:LCD_P8x16Str(unsigned char x,unsigned char y,unsigned char *p)

//功能描述:写入一组标准ASCII字符串

//参数:显示的位置(x,y),y为页范围0~7,要显示的字符串

//返回:无

//============================================================== 


void LCD_P8x16Str(unsigned char x,unsigned char y,unsigned char *ch)

{

  unsigned char c=0,i=0,j=0;


  while (ch[j]!='')

  {    

    c =ch[j]-32;

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

    LCD_Set_Pos(x,y);    

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

      LCD_WrDat(F8X16[c*16+i]);

    LCD_Set_Pos(x,y+1);    

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

      LCD_WrDat(F8X16[c*16+i+8]);  

    x+=8;

    j++;

  }

}


void LCD_P16x16Ch(unsigned char x,unsigned char y,unsigned char count)

{

    unsigned char wm=0;

    unsigned int adder=32*count;        

    LCD_Set_Pos(x , y);

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

    {

        LCD_WrDat(F14x16[adder]);   

        adder += 1;

    }      

    LCD_Set_Pos(x,y + 1); 

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

    {

        LCD_WrDat(F14x16[adder]);

        adder += 1;

    }       

}


void Draw_LibLogo(void)

{   

    word ii=0;

    byte x,y;       


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

    {

        LCD_Set_Pos(34,y);              

        for(x=34;x<94;x++)     

            LCD_WrDat(LIBLOGO60x58[ii++]);          


    }



void Draw_BMP(byte x0,byte y0,byte x1,byte y1)

{   

  word ii=0;

  byte x,y;


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

  else y=y1/8+1;

    for(y=y0;y<=y1;y++)

    {

        LCD_Set_Pos(x0,y);              

    for(x=x0;x        {      

            LCD_WrDat(yangfeng[ii++]);          

        }

    }

}


头文件:


//12864.h

#ifndef _12864_H_

#define _12864_H_

#include"stdio.h"

//管教定义;

#define byte  unsigned char

#define word  unsigned int

#define dword unsigned long 


#define DC_CLR P2OUT &=~BIT0

#define DC_SET P2OUT |=BIT0


#define RST_CLR P2OUT &=~BIT1

#define RST_SET P2OUT |=BIT1


#define SDA_CLR P2OUT &=~BIT2

#define SDA_SET P2OUT |=BIT2


#define SCL_CLR P2OUT &=~BIT3

#define SCL_SET P2OUT |=BIT3


#define X_WIDTH 128

#define Y_WIDTH 64

//函数声明



void delay(int ms);//延时

 void LCD_WrCmd(unsigned char cmd);

 void LCD_WrDat(unsigned char dat);

 void LCD_Init(void);

 void LCD_CLS(void);

 void LCD_P6x8Str(byte x,byte y,byte ch[]);

 void LCD_P6x8num(unsigned char x,unsigned char y,float num);

 void LCD_P8x16Str(byte x,byte y,byte *ch);

 void LCD_P16x16Ch(byte x,byte y,byte count);     

 void LCD_Fill(byte dat);

 void Draw_LibLogo(void);

 void Draw_BMP(byte x0,byte y0,byte x1,byte y1);

#endif



主函数:


//main.c

#include"MSP430G2553.h"

#include"12864.h"

//#include"adc.h" 

#define IDLE 0

#define BUSY 1


void main(void) 

{


 WDTCTL = WDTPW + WDTHOLD;//停止看门狗

  P2DIR |=BIT0+BIT1+BIT2+BIT3;  


  LCD_Init();


  //显示初始化成功

      LCD_P16x16Ch(0,0,0); //系    //汉字是16*16的大小所以x方向的距离是14

      LCD_P16x16Ch(16,0,1); //统

      LCD_P16x16Ch(32,0,2); //初

      LCD_P16x16Ch(48,0,3); //始

      LCD_P16x16Ch(64,0,4); //化

推荐阅读

史海拾趣

ABB公司的发展小趣事

ABB公司是一家全球性的工程技术公司,提供电力和自动化技术解决方案。以下是该公司发展的五个相关故事:

  1. 公司成立和早期发展: ABB公司成立于1883年,最初名为“Brown, Boveri & Cie”,总部位于瑞士苏黎世。公司的创始人是查尔斯·布朗和沃尔夫冈·鲍弗里。在早期,ABB专注于电力系统和电机的研发与制造,为当时的工业革命提供了关键的技术支持。

  2. 国际化战略和全球扩张: 随着技术的进步和市场的变化,ABB积极推动国际化战略,加速在全球范围内的扩张。公司通过收购和合并,逐步建立了全球化的生产和销售网络。截至2022年,ABB已在100多个国家设有分支机构和办事处。

  3. 技术创新和产品多样化: ABB一直致力于技术创新,不断推出新产品和解决方案,以满足不同行业和领域的需求。公司在电力输送、工业自动化、机器人技术等方面处于行业领先地位,为客户提供了全面的电力和自动化解决方案。

  4. 可持续发展和环保责任: ABB积极推动可持续发展和环保责任,在产品设计、生产和运营过程中注重减少能源消耗和减排,促进清洁能源的应用和利用。公司致力于推动能源效率和环境保护,为全球可持续发展做出贡献。

  5. 未来展望和发展方向: ABB将继续致力于技术创新和市场拓展,加强在电力和自动化领域的领先地位。公司将加大在数字化技术和人工智能领域的投入,推动工业智能化和数字化转型,为客户提供更智能、更高效的解决方案。

FCT Electronics公司的发展小趣事

随着电子行业的快速发展,市场竞争日益激烈。为了应对挑战,FCT Electronics不断加大研发投入,推出了一系列具有自主知识产权的新产品。同时,公司还加强了与高校、研究机构的合作,引进了一批高素质的人才,为公司的持续发展注入了新的活力。

Crocus Technology公司的发展小趣事

在成立初期,Crocus Technology专注于IP存储模块的研发与销售。这一时期,公司通过不断的技术创新和市场调研,成功开发出了一系列具有竞争力的产品。这些产品不仅满足了市场对高性能存储解决方案的需求,还为公司积累了宝贵的市场经验和客户资源。

FINDER公司的发展小趣事

在成立初期,Crocus Technology专注于IP存储模块的研发与销售。这一时期,公司通过不断的技术创新和市场调研,成功开发出了一系列具有竞争力的产品。这些产品不仅满足了市场对高性能存储解决方案的需求,还为公司积累了宝贵的市场经验和客户资源。

Alliance Memory公司的发展小趣事

在成立初期,Crocus Technology专注于IP存储模块的研发与销售。这一时期,公司通过不断的技术创新和市场调研,成功开发出了一系列具有竞争力的产品。这些产品不仅满足了市场对高性能存储解决方案的需求,还为公司积累了宝贵的市场经验和客户资源。

Fabrimex AG公司的发展小趣事

1979年,Fabrimex AG接管了ARCO-Solar(美国)的代表处,标志着公司正式进入光伏领域。这一举措为公司带来了新的增长点,并推动了相关产品的研发和生产。随着光伏技术的不断发展,Fabrimex AG在光伏领域逐渐取得了显著的成绩,为公司带来了可观的收益。

问答坊 | AI 解惑

汽车行驶记录仪中USB HOST技术

1. USB 总线的简介USB(Universal Serial Bus )是一种通用串行总线,是一种标准的连接接口。在与外面的USB 从结构和USB HOST连接时,不必重新配置系统和调节接口,USB HOST 自动识别这些接口设备,并配置适当的驱动程序,因此实现了即插即用 ...…

查看全部问答>

自制PIC单片机编程器.

自制PIC单片机编程器.…

查看全部问答>

CDMA模块

CDMA模块基于CDMA平台的通信模块,它将通信芯片、存储芯片等集成在一块电路板上,使其具有发送通过CDMA平台收发短消息、语音通话、数据传输等功能。CDMA模块可以实现普通CDMA手机的主要通信功能,也可以说是一个“精简版”的手机。电脑、单片机、AR ...…

查看全部问答>

基于ARM的SD主控制器的设计与实现.pdf

基于ARM的SD主控制器的设计与实现.pdf…

查看全部问答>

编译uclinux内核时候遇到的问题,帮我看看吧。

由于毕业设计需要和本身兴趣,要构造ARM+uclinux,本机Linux版本:UBUNTU6 .06. 在本机上安装了www.uclinux.org上下的arm-elf-tools, 然后arm-elf-gcc-v,显示如下 Reading specs from /usr/local/lib/gcc-lib/arm-elf/2.95.3/specs gcc ver ...…

查看全部问答>

DriverWized生成的应用程序

用DS3.2的DriverWized生成一个驱动程序后. 生成的win32 console应用程序无法打开和运行.exe文件. 错误提示: Could not execute: Bad executable format (Win32 error 193) Cannot execute program 为什么我的应用程序无法运行? 另外如何直接在D ...…

查看全部问答>

有谁做过 BF532 的视频开发吗?

有项目要做,自己想从头学。…

查看全部问答>

怎样程序烧写到指定的flash地址里?

在项目中遇到一个问题:需要将一个变量放到一个指定的flash地址里,即flash的绝对地址中。我查看了IAR的complier手册,上面的例子说以下面的方式定义即可。const int bootKey @ 0x0801FFFC = 3; /* O ...…

查看全部问答>

谁来做一次9B96的使用教程?

期待EEWORLD和TI能够为我们这些菜鸟提供一些学习的方法和使用介绍!我想以后使用这个9B96但是这个入门貌似还不懂!…

查看全部问答>