OpenEdv-开源电子网

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

移植OLED程序部分,显示出的字符倒了

[复制链接]

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
发表于 2016-3-31 12:05:25 | 显示全部楼层 |阅读模式
10金钱
如图,因为我用的是别的液晶屏,和原子的不一样,指令我也截图了下面的代码是OLED自带的地址设置:
void s_LcdAddress(u8 page, u8 column)
{
        column -= 1;                         
//  column=column+3;                                                          //MOOER_GE100_V00_MAIN
        page -= 1;
        s_TransferCommand(0xb0+page); //设置页地址。每页是8行。一个画面的64行被分成8个页。我们平常所说的第1页,在LCD驱动IC里是第0页,所以在这里减去1*/
        s_TransferCommand(((column>>4)&0x0f)+0x10);        //设置列地址的高4位
        s_TransferCommand(column&0x0f);                                //设置列地址的低4位
}

然后这个是原子的:
//¸üDÂÏÔ′æμ½LCD                 
void OLED_Refresh_Gram(void)
{
        u8 i,n;                    
        for(i=0;i<8;i++)  
        {  
                OLED_WR_Byte (0xb0+i,OLED_CMD);    //éè&#214;&#195;ò3μ&#216;&#214;·£¨0~7£&#169;
                OLED_WR_Byte (0x00,OLED_CMD);      //éè&#214;&#195;&#207;&#212;ê&#190;&#206;&#187;&#214;&#195;&#161;aáDμíμ&#216;&#214;·
                OLED_WR_Byte (0x10,OLED_CMD);      //éè&#214;&#195;&#207;&#212;ê&#190;&#206;&#187;&#214;&#195;&#161;aáD&#184;&#223;μ&#216;&#214;·   
                for(n=0;n<128;n++)OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA);
        }   
}

我在想是不是这里出现了问题
/**********************************分割线**********************************************************/
下面是我的OLED所有源码:
//*************Display Drive***************/
/*=======写指令========*/
void s_TransferCommand(int Data)   
{
        char i;
        DS_RSLow();
        for(i=0;i<8;i++)
        {
                DS_CLKLow();
                if(Data&0x80)
                        DS_DATAHigh();
                else
                        DS_DATALow();
                DS_CLKHigh();
                Data=Data<<=1;
        }
}

/*--------写数据------------*/
void s_TransferData(int Data)
{
        char i;
        DS_RSHigh();
        for(i=0;i<8;i++)
        {
                DS_CLKLow();
                if(Data&0x80)
                        DS_DATAHigh();
                else
                        DS_DATALow();
                DS_CLKHigh();
                Data=Data<<=1;
        }
}

//============initial
void g_InitialLcd(void)
{
        //DSP_REST_High();       
        DS_RESETHigh();
        DS_CLKHigh();
        DS_RSHigh();
        DS_DATAHigh();
        g_DelayNms(20);
        DSP_REST_Low();
        DS_RESETLow();                 /*低电平复位*/
        g_DelayNms(20);
        //DSP_REST_High();
        DS_RESETHigh();                 /*复位完毕*/
        s_TransferCommand(0xe2);         /*软复位*/
        g_DelayNms(5);
        s_TransferCommand(0x2c);  /*升压步聚1*/
        g_DelayNms(5);
        s_TransferCommand(0x2e);  /*升压步聚2*/
        g_DelayNms(5);
        s_TransferCommand(0x2f);  /*升压步聚3*/
        g_DelayNms(5);
        s_TransferCommand(0x24);  /*粗调对比度,可设置范围0x20~0x27*/
        s_TransferCommand(0x81);  /*微调对比度*/
        s_TransferCommand(0x1B);  /*微调对比度的值,可设置范围0x00~0x3f*/  //1C
        s_TransferCommand(0xa2);  /*1/9偏压比(bias)*/
//        s_TransferCommand(0xc0);  /*行扫描顺序:从上到下*/
//        s_TransferCommand(0xa1);  /*列扫描顺序:从左到右*/
//        s_TransferCommand(0x40);  /*起始行:第一行开始*/
//        s_TransferCommand(0xaf);  /*开显示*/
        s_TransferCommand(0xc8);  /*行扫描顺序:从上到下*/
        s_TransferCommand(0xa0);  /*列扫描顺序:从左到右*/
        s_TransferCommand(0x40);  /*起始行:第一行开始*/
        s_TransferCommand(0xaf);  /*开显示*/
}

void s_LcdAddress(u8 page, u8 column)
{
        column -= 1;                         
//  column=column+3;                                                          //MOOER_GE100_V00_MAIN
        page -= 1;
        s_TransferCommand(0xb0+page); //设置页地址。每页是8行。一个画面的64行被分成8个页。我们平常所说的第1页,在LCD驱动IC里是第0页,所以在这里减去1*/
        s_TransferCommand(((column>>4)&0x0f)+0x10);        //设置列地址的高4位
        s_TransferCommand(column&0x0f);                                //设置列地址的低4位
}

//===============clear all dot martrics=============
void g_ClearScreen(void)
{
        unsigned char i, j;
        for(i=1;i<9;i++)
        {
                s_LcdAddress(i, 1);
                for(j=0; j<129; j++)
                {
                        s_TransferData(0x00);
                }
        }
}

/*显示128x64点阵图像*/
void s_DisplayGrphic_128x64(u8 page, u8 column, u8 *dp)
{
        int i,j;
        for(j=0;j<8;j++)
        {
                s_LcdAddress(page+j, column);
                for(i=0; i<128; i++)
                {
                        s_TransferData(*dp);   
                        dp++;
                }
        }
}

/*显示32x32点阵图像、汉字、生僻字或32x32点阵的其他图标*/
void display_graphic_32x32(u8 page, u8 column, u8 *dp)
{
        u8  i,j;
        for(j=0;j<4;j++)
        {
                s_LcdAddress(page+j, column);
                for (i=0;i<31;i++)
                {
                        s_TransferData(*dp);                /*写数据到LCD,每写完一个8位的数据后列地址自动加1*/
                        dp++;
                }
        }
}

/*显示16x16点阵图像、汉字、生僻字或16x16点阵的其他图标*/
//这个函数是字体反白显示
void s_DisplayGraphic_16x16(u8 reveDS_RSe, u8 page, u8 column, u8 *dp)
{
        u8  i,j;
        for(j=0;j<2;j++)
        {
                s_LcdAddress(page+j, column);
                for (i=0;i<16;i++)
                {       
                        if(reveDS_RSe==1)
                                s_TransferData(~*dp);                /*写数据到LCD,每写完一个8位的数据后列地址自动加1*/
                        else
                                s_TransferData(*dp);                /*写数据到LCD,每写完一个8位的数据后列地址自动加1*/
                        dp++;
                }
        }
}

// page: y
// column: x
// text: Display content
void g_DisplayString_8x16(u16 page, u16 column, u8 *text)
{
        u16 i=0,j,k,n;

        while(text[i]>0x00)
        {
                if((text[i]>=0x20)&&(text[i]<=0x7e))
                {
                        j=text[i]-0x20;
                        for(n=0;n<2;n++)
                        {                       
                                s_LcdAddress(page+n,column);

                                DS_RSHigh();
                                for(k=0;k<8;k++)
                                {
                                        s_TransferData(AsciiTable_8x16[j][k+8*n]);/*显示5x7的ASCII字到LCD上,y为页地址,x为列地址,最后为数据*/
                                }
                        }
                        i++;
                        column+=8;
                }
                else
                i++;
        }
}


void g_DisplayString_5x8(u16 page,u16 column,u8 *text)
{
      u16 i=0,j,k;

      while(text[i]>0x00)
    {
        if((text[i]>=0x20)&&(text[i]<0x7e))
      {
         j=text[i]-0x20;
         s_LcdAddress(page,column);
            for(k=0;k<5;k++)
          {
              s_TransferData(ascii_table_5x8[j][k]);
          }
               i++;
               column+=6;
      }
       else
        i++;
    }
}

/**************************分割线***********************/
下面是我自己把原子的加进去的代码:
void OLED_Refresh_Gram(void)
{
        u8 i,n;                    
        for(i=0;i<8;i++)  
        {  
                s_TransferCommand(0xb0+i);    //éè&#214;&#195;ò3μ&#216;&#214;·£¨0~7£&#169;
                s_TransferCommand(0x00);      //éè&#214;&#195;&#207;&#212;ê&#190;&#206;&#187;&#214;&#195;&#161;aáD&#184;&#223;μ&#216;&#214;·
                s_TransferCommand(0x10);     //éè&#214;&#195;&#207;&#212;ê&#190;&#206;&#187;&#214;&#195;&#161;aáDμíμ&#216;&#214;·
                  
                for(n=0;n<128;n++)s_TransferData(DisplayBuffer[n][i]);
        }   
//        s_LcdAddress(i,n);
//        s_TransferData(DisplayBuffer[n][i]);
}
//*************Display Drive***************/
/*=======D′&#214;&#184;á&#238;========*/
void s_TransferCommand(int Data)   
{
        char i;
        DS_RSLow();
        for(i=0;i<8;i++)
        {
                DS_CLKLow();
                if(Data&0x80)
                        DS_DATAHigh();
                else
                        DS_DATALow();
                DS_CLKHigh();
                Data=Data<<=1;
        }
}

/*--------D′êy&#190;Y------------*/
void s_TransferData(int Data)
{
        char i;
        DS_RSHigh();
        for(i=0;i<8;i++)
        {
                DS_CLKLow();
                if(Data&0x80)
                        DS_DATAHigh();
                else
                        DS_DATALow();
                DS_CLKHigh();
                Data=Data<<=1;
        }
}
void OLED_Clear(void)  //&#199;&#229;&#198;á
{  
        u8 i,n;  
        for(i=0;i<8;i++)for(n=0;n<128;n++)DisplayBuffer[n][i]=0X00;  
        OLED_Refresh_Gram();//&#184;üD&#194;&#207;&#212;ê&#190;
}

void OLED_DrawPoint(u8 x,u8 y,u8 t)//&#187;-μ&#227;,x:0~127,t=1,ì&#238;3&#228;
{
        u8 pos,bx,temp=0;
        if(x>127||y>63)return;//3&#172;3&#246;·&#182;&#206;§á&#203;.
        pos=7-y/8;
        bx=y%8;
        temp=1<<(7-bx);
        if(t)DisplayBuffer[x][pos]|=temp;
        else DisplayBuffer[x][pos]&=~temp;            
}

//&#212;ú&#214;&#184;&#182;¨&#206;&#187;&#214;&#195;&#207;&#212;ê&#190;ò&#187;&#184;&#246;×&#214;·&#251;,°üà¨2&#191;·&#214;×&#214;·&#251;£&#172;size×&#214;ì&#229;&#184;&#241;ê&#189;£&#172;mode=1£&#172;&#207;&#212;ê&#190;
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode)
{                                  
        u8 temp,t,t1;
        u8 y0=y;
        u8 csize=(size/8+((size%8)?1:0))*(size/2);//μ&#195;μ&#189;×&#214;ì&#229;ò&#187;&#184;&#246;×&#214;·&#251;&#182;&#212;ó|μ&#227;&#213;ó&#188;ˉ&#203;ù&#213;&#188;μ&#196;×&#214;&#189;úêy
        chr=chr-' ';//μ&#195;μ&#189;&#198;&#171;ò&#198;oóμ&#196;&#214;μ                 
    for(t=0;t<csize;t++)
    {   
                if(size==12)temp=asc2_1206[chr][t];                  //μ÷ó&#195;1206×&#214;ì&#229;
                else if(size==16)temp=asc2_1608[chr][t];        //μ÷ó&#195;1608×&#214;ì&#229;
                //else if(size==24)temp=asc2_2412[chr][t];        //μ÷ó&#195;2412×&#214;ì&#229;
                else return;                                                                //&#195;&#187;óDμ&#196;×&#214;&#191;a
        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;
                        }
                }           
    }         
}

//&#207;&#212;ê&#190;×&#214;·&#251;′&#174;
//x,y:&#198;eμ&#227;×&#248;±ê  
//size:×&#214;ì&#229;′óD&#161;
//*p:×&#214;·&#251;′&#174;&#198;eê&#188;μ&#216;&#214;·
void OLED_ShowString(u8 x,u8 y,const u8 *p,u8 size)
{       
    while((*p<='~')&&(*p>=' '))//&#197;D&#182;&#207;ê&#199;2&#187;ê&#199;·&#199;·¨×&#214;·&#251;!
    {      
        if(x>(128-(size/2))){x=0;y+=size;}
        if(y>(64-size)){y=x=0;OLED_Clear();}
        OLED_ShowChar(x,y,*p,size,1);         
        x+=size/2;
        p++;
    }  
       
}          




刚学STM32,希望大家能帮帮我

IMG_2414.JPG
RLLPVXT~0H3CW5379BUJRIF.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-3-31 12:30:58 | 显示全部楼层
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-3-31 12:44:29 | 显示全部楼层
原子哥
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-3-31 13:29:37 | 显示全部楼层
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-3-31 13:41:51 | 显示全部楼层
yklstudent 发表于 2016-3-31 13:34
这个你把字符的取摸方式更改下,匹配下液晶扫描方式

我改了取模方式,直接不显示了
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-3-31 13:42:50 | 显示全部楼层
yklstudent 发表于 2016-3-31 13:34
这个你把字符的取摸方式更改下,匹配下液晶扫描方式

纠正一下,不是不显示,而是乱码的那种显示,看不出来是什么字符
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-3-31 13:59:49 | 显示全部楼层
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-3-31 14:23:21 | 显示全部楼层
帮帮我
回复

使用道具 举报

12

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
529
金钱
529
注册时间
2014-10-9
在线时间
145 小时
发表于 2016-3-31 14:24:40 | 显示全部楼层
换个字符的取模方式试试
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-3-31 14:53:41 | 显示全部楼层
小丶胖 发表于 2016-3-31 14:24
换个字符的取模方式试试

我换了,然后不显示或者显示乱码
回复

使用道具 举报

33

主题

481

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
5075
金钱
5075
注册时间
2013-10-4
在线时间
654 小时
发表于 2016-3-31 14:59:40 | 显示全部楼层
取模方式与程序不对应
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-3-31 15:06:12 | 显示全部楼层
2449164582 发表于 2016-3-31 14:59
取模方式与程序不对应

我换了取模方式还是不对
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-3-31 15:45:39 | 显示全部楼层
yklstudent 发表于 2016-3-31 15:13
说明你的取摸还是有问题,需要继续修改调整

我换了取模的字体大小,结果就不显示了
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-3-31 15:48:47 | 显示全部楼层
yklstudent 发表于 2016-3-31 15:13
说明你的取摸还是有问题,需要继续修改调整

我用原子的12*12或者16*16的字库可以显示,但是是倒的,然后我自己取模12*12的字体,不显示了
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-3-31 15:59:55 | 显示全部楼层
字符显示到了 更改画点方向即可
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-3-31 17:08:28 | 显示全部楼层
ricefat 发表于 2016-3-31 15:59
字符显示到了 更改画点方向即可

改了还是不行,我觉得是程序问题
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-3-31 17:22:17 | 显示全部楼层
ricefat 发表于 2016-3-31 15:59
字符显示到了 更改画点方向即可

改了还是不行,我觉得是程序问题
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2016-3-31 17:33:42 | 显示全部楼层
你需要修改这两句设置:  
s_TransferCommand(0xc0);  /*行扫描顺序:从上到下*/
s_TransferCommand(0xa1);  /*列扫描顺序:从左到右*/

0xa0左右互反  0xa1正常
0xc0上下互反  0xc8正常
原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2016-3-31 17:36:21 | 显示全部楼层
如果你不修改这两句设置指令:
那就要改取模方式或者改字符显示函数。
原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-3-31 17:42:07 | 显示全部楼层
fanghuiopenedv 发表于 2016-3-31 17:36
如果你不修改这两句设置指令:
那就要改取模方式或者改字符显示函数。

谢谢,我先试试
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-3-31 17:54:45 | 显示全部楼层
fanghuiopenedv 发表于 2016-3-31 17:36
如果你不修改这两句设置指令:
那就要改取模方式或者改字符显示函数。

我改了你说的那两个设置就显示正常了,我改取模方式就不显示,可能我取模设置不对,第一次用,不会设置
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2016-3-31 18:05:37 | 显示全部楼层
loliko 发表于 2016-3-31 17:54
我改了你说的那两个设置就显示正常了,我改取模方式就不显示,可能我取模设置不对,第一次用,不会设置

嘿嘿,帮到你就行。
原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-3-31 18:17:38 | 显示全部楼层
fanghuiopenedv 发表于 2016-3-31 18:05
嘿嘿,帮到你就行。

//16*16
u8 asc2_1609[5][16]={

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0x08,0x04,0x08,0x04,0x1F,0xFC,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00},/*"1",1*/
{0x00,0x00,0x0E,0x0C,0x10,0x14,0x10,0x24,0x10,0x44,0x11,0x84,0x0E,0x0C,0x00,0x00},/*"2",2*/
{0x00,0x00,0x0C,0x18,0x10,0x04,0x11,0x04,0x11,0x04,0x12,0x88,0x0C,0x70,0x00,0x00},/*"3",3*/
{0x00,0x00,0x60,0x00,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x20,0x00},/*"~",4*/

};


这是我按照原子的取模方式取得16*16的5个字符,最小的是空格符,最大的是~,应该是满足条件的,但是我调用之后不显示
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-3-31 18:54:20 | 显示全部楼层
@正点原子
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-3-31 19:34:47 | 显示全部楼层
@正点原子
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-4-1 08:50:15 | 显示全部楼层
@正点原子
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-4-1 09:28:10 | 显示全部楼层
@正点原子
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-4-1 10:56:14 | 显示全部楼层
@正点原子
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-4-1 11:30:24 | 显示全部楼层
@正点原子
回复

使用道具 举报

8

主题

51

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-20
在线时间
25 小时
 楼主| 发表于 2016-4-2 10:41:10 | 显示全部楼层
@正点原子
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 03:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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