OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3333|回复: 5

stm32f103c8 模拟SPI OLED 求助

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-11-2
在线时间
5 小时
发表于 2017-11-2 18:23:44 | 显示全部楼层 |阅读模式
1金钱
显示出错,6X8显示没问题  8X16只能显示下面半部分 求助,    显示程序应该没问题??

void OLED_SPI_Init(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;         
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);       
}
//---------------                                           
#define OLED_SCL_L         GPIO_ResetBits(GPIOA,GPIO_Pin_7)  
#define OLED_SCL_H         GPIO_SetBits(GPIOA,GPIO_Pin_7)   

#define OLED_SDA_L         GPIO_ResetBits(GPIOA,GPIO_Pin_6)
#define OLED_SDA_H         GPIO_SetBits(GPIOA,GPIO_Pin_6)

#define OLED_RST_L         GPIO_ResetBits(GPIOA,GPIO_Pin_5)
#define OLED_RST_H         GPIO_SetBits(GPIOA,GPIO_Pin_5)

#define OLED_DC_L           GPIO_ResetBits(GPIOA,GPIO_Pin_4)
#define OLED_DC_H           GPIO_SetBits(GPIOA,GPIO_Pin_4)


#define XLevelL                0x00
#define XLevelH                0x10
#define XLevel                ((XLevelH&0x0F)*16+XLevelL)
#define Max_Column        128
#define Max_Row                  64
#define        Brightness        0xCF

#define X_WIDTH 128
#define Y_WIDTH 64


void OLED_WrDat(uint8_t data)
{
        uint8_t i=8;
        //LCD_CS=0;;
        OLED_DC_H;
  OLED_SCL_L;
  //asm("nop");
  while(i--)
  {
    if(data&0x80){OLED_SDA_H;}
    else{OLED_SDA_L;}
    OLED_SCL_H;
    //asm("nop");;
                //asm("nop");
    OLED_SCL_L;
    data<<=1;
  }
        //LCD_CS=1;
}

void OLED_WrCmd(uint8_t cmd)
{
        uint8_t i=8;

        //LCD_CS=0;;
        OLED_DC_L;
  OLED_SCL_L;
  //asm("nop");
  while(i--)
  {
    if(cmd&0x80){OLED_SDA_H;}
    else{OLED_SDA_L;}
    OLED_SCL_H;
    //asm("nop");
                //asm("nop");
    OLED_SCL_L;
    cmd<<=1;;
  }
}

void OLED_Set_Pos(uint8_t x, uint8_t y)
{
  OLED_WrCmd(0xb0+(y>>3));
  OLED_WrCmd(((x&0xf0)>>4)|0x10);
  OLED_WrCmd((x&0x0f)|0x01);
}

void OLED_Fill(uint8_t bmp_data)
{
        uint8_t y,x;
        for(y=0;y<8;y++)
        {
                OLED_WrCmd(0xb0+y);
                OLED_WrCmd(0x01);
                OLED_WrCmd(0x10);
                for(x=0;x<X_WIDTH;x++)
                        OLED_WrDat(bmp_data);
        }
}

void OLED_CLS(void)
{
        uint8_t y,x;
        for(y=0;y<8;y++)
        {
                OLED_WrCmd(0xb0+y);
                OLED_WrCmd(0x01);
                OLED_WrCmd(0x10);
                for(x=0;x<X_WIDTH;x++)
                        OLED_WrDat(0);
        }
}
void OLED_DLY_ms(uint16_t ms)
{
  uint16_t a;
  while(ms)
  {
    a=1335;  //1335
    while(a--);
    ms--;
  }
  return;
}

void OLED_Init(void)
{
  OLED_SPI_Init();
       
  OLED_SCL_H;
  //LCD_CS=1;       
  OLED_RST_L;
  OLED_DLY_ms(50);
  OLED_RST_H;

  OLED_WrCmd(0xae);
  OLED_WrCmd(0x00);
  OLED_WrCmd(0x10);
  OLED_WrCmd(0x40);
  OLED_WrCmd(0x81);
  OLED_WrCmd(0xcf);
  OLED_WrCmd(0xa1);
  OLED_WrCmd(0xc8);
  OLED_WrCmd(0xa6);
  OLED_WrCmd(0xa8);
  OLED_WrCmd(0x3f);  
  OLED_WrCmd(0xd3);
  OLED_WrCmd(0x00);//-not offset
  OLED_WrCmd(0xd5);
  OLED_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
  OLED_WrCmd(0xd9);
  OLED_WrCmd(0xf1);
  OLED_WrCmd(0xda);
  OLED_WrCmd(0x12);
  OLED_WrCmd(0xdb);//--set vcomh
  OLED_WrCmd(0x40);//Set VCOM Deselect Level
  OLED_WrCmd(0x20);
  OLED_WrCmd(0x02);//
  OLED_WrCmd(0x8d);
  OLED_WrCmd(0x14);
  OLED_WrCmd(0xa4);
  OLED_WrCmd(0xa6);
  OLED_WrCmd(0xaf);
  OLED_Fill(0x00);  

}
/*==============================================================
void OLED_PutPixel(u8 x,u8 y)  
定点
==============================================================*/
void OLED_PutPixel(uint8_t x,uint8_t y)
{
     uint8_t data1;
     // OLED_Set_Pos(x,y);
      data1 = 0x01<<(y%8);
        OLED_WrCmd(0xb0+(y>>3));
        OLED_WrCmd(((x&0xf0)>>4)|0x10);
        OLED_WrCmd((x&0x0f)|0x00);
        OLED_WrDat(data1);
}
/*========================================
void OLED_P6x8Char(char x,char y,char ch);

6X8字符
========================================*/
void OLED_P6x8Char(uint8_t x,uint8_t y,char ch)
{
        char c=0,i=0;               
        c =ch-32;
        if(x>122)
        {
           x=0;
           y++;
        }
        OLED_Set_Pos(x,y);   
        for(i=0;i<6;i++)
        {     
           OLED_WrDat(F6x8[c]);  
        }
}

//6X8字符串
void OLED_P6x8Str(uint8_t x,uint8_t y,uint8_t ch[])  
{
  uint8_t c=0,i=0,j=0;
  while (ch[j]!='\0')
  {
    c =ch[j]-32;
    if(x>126){x=0;y++;}
    OLED_Set_Pos(x,y);
          for(i=0;i<6;i++)
            OLED_WrDat(F6x8[c]);
          x+=6;
          j++;
  }
}
/*===========================================
void OLED_P8x16Char(u8 x,u8 y,char ch);

8X16字符
===============================================*/
void OLED_P8x16Char(uint8_t x,uint8_t y,char ch)
{
        char c=0,i=0;               
        c =ch-32;
        if(x>120)
        {
           x=0;
           y++;
        }
        OLED_Set_Pos(x,y);   
        for(i=0;i<8;i++)
        {
          OLED_WrDat(F8X16[(c<<4)+i]);
        }
        OLED_Set_Pos(x,y+1);   
        for(i=0;i<8;i++)
        {
          OLED_WrDat(F8X16[(c<<4)+i+8]);
        }
}
//8X16字符串
void OLED_P8x16Str(uint8_t x,uint8_t y,uint8_t ch[])
{
  uint8_t c=0,i=0,j=0;

  while (ch[j]!='\0')
  {
    c =ch[j]-32;
    if(x>120){x=0;y++;}
    OLED_Set_Pos(x,y);
          for(i=0;i<8;i++)
            OLED_WrDat(F8X16[c*16+i]);
          OLED_Set_Pos(x,y+1);
          for(i=0;i<8;i++)
            OLED_WrDat(F8X16[c*16+i+8]);
          x+=8;
          j++;
  }
}

都是显示B 8X16只能显示一半

都是显示B  8X16只能显示一半

最佳答案

查看完整内容[请看2#楼]

从图片上看,你的扫描方向应该是从下往上的,顶部显示空间是不是不够了; 另外你的显示机制我不是很了解,你的void OLED_P8x16Char(uint8_t x,uint8_t y,char ch)中 OLED_Set_Pos(x,y+1); 另一半显示的起点是不是有问题,为什么y+1呢?而不是y+8
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

153

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1323
金钱
1323
注册时间
2016-12-27
在线时间
156 小时
发表于 2017-11-2 18:23:45 | 显示全部楼层
从图片上看,你的扫描方向应该是从下往上的,顶部显示空间是不是不够了;
另外你的显示机制我不是很了解,你的void OLED_P8x16Char(uint8_t x,uint8_t y,char ch)中
OLED_Set_Pos(x,y+1); 另一半显示的起点是不是有问题,为什么y+1呢?而不是y+8
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-11-2
在线时间
5 小时
 楼主| 发表于 2017-11-2 19:59:30 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-11-3 01:22:37 | 显示全部楼层
我们例程就支持SPI模式驱动哦,参考下我们代码吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-11-2
在线时间
5 小时
 楼主| 发表于 2017-11-3 17:20:37 | 显示全部楼层
大瓶子凌凌漆 发表于 2017-11-2 18:23
从图片上看,你的扫描方向应该是从下往上的,顶部显示空间是不是不够了;
另外你的显示机制我不是很了解, ...

解决了,谢谢
回复

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2016-3-4
在线时间
9 小时
发表于 2017-11-4 08:47:11 | 显示全部楼层
原子的例程挺好的,可以自己改一下啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 05:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表