cafppla1 发表于 2013-8-15 17:50:10

求助ssd1306驱动的oled打点问题

驱动一个1306,80总线,调试了蛮几天,画点函数出来了,但是有点问题,始终找不出来
读时序如下:
unsigned char Read_Data()
{
    unsigned char temp;
        DC=1;
        CS=0;
        WR_oled=1;
        xData=0xff;
        RD_oled=0;
           uDelay(20);
                temp=xData;
           uDelay(20);
        RD_oled=1;
       uDelay(20);
        CS=1;
        DC=1;

        return temp;
}

设置地址函数如下:
void LCD_Set_Pos(unsigned char x, unsigned char y)
{
Write_Command(0xb0+y);
Write_Command(((x&0xf0)>>4)|0x10);
Write_Command((x&0x0f)|0x01);
}
画点函数如下:
void Dra_Point(unsigned char x, unsigned char y)
{
unsigned char a;
    LCD_Set_Pos(x,(63-y)/8);
   a=Read_Data();//丢弃第一字节
    a=Read_Data();
   LCD_Set_Pos(x,(63-y)/8);
   Write_Data(a|(1<<((63-y)%8)));   
}
划线函数
DrawLine(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2)
{                           //x1,y1起点坐标;x2,y2终点坐标;
    unsigned char x,y;
    unsigned char d_x,d_y;          
    char err=0;
    unsigned char temp=0;

    if(y2<y1){x=x1;y=y1;x1=x2;y1=y2;x2=x;y2=y;}
    d_y=y2-y1;
    if (d_y==0)
      {
      if (x1>x2) {x=x1;x1=x2;x2=x;}
      for ( x=x1;x<=x2;x++ ) Dra_Point(x,y1);
      }
    else
      {
    if(x2>=x1){temp=1;d_x=x2-x1;}else d_x=x1-x2;
    x=x1;y=y1;Dra_Point(x,y);
    if(temp&&(d_y<=d_x))
      while(x!=x2)
            {if(err<0){x=x+1;err=err+(y2-y);}
            else {x=x+1;y=y+1;err=err+(y2-y)-(x2-x);}
         Dra_Point(x,y);
            }
    else if(temp&&(d_y>d_x))
      while(y!=y2)
            {d_x=x2-x;d_y=y2-y;
            if(err<0){x=x+1;y=y+1;err=err+d_y-d_x;}
            else {y=y+1;err=err-d_x;}
            Dra_Point(x,y);
            }
    else if(!temp&&(d_y<=d_x))
      while(x!=x2)
            {d_x=x-x2;d_y=y2-y;
            if(err<0){x=x-1;err=err+d_y;}
            else {x=x-1;y=y+1;err=err+d_y-d_x;}
            Dra_Point(x,y);
            }
    else if(!temp &&(d_y>d_x))
      while(y!=y2)
            {d_x=x-x2;d_y=y2-y;
            if(err<0){x=x-1;y=y+1;err=err+d_y-d_x;}
            else {y=y+1;err=err-d_x;}
            Dra_Point(x,y);
            }
      }   
}                                 


现在的问题是x坐标有些点画不出来,比如Dra_Point(21,10),然后再打一个点(22,10),他这2个点中间会隔开一个点,并列打上5、6个点,他只显示出来3、4个,总之,画一条水平线DrawLine(1,1,100,1),两点中间是隔了一个点的,但是画垂直线没问题,由于单片机ram有限,不能开辟一块显存,只能采用读取的方式,请教各位,程序问题在哪?

zhaoqiwen 发表于 2013-8-16 17:05:16

你试试这个

cafppla1 发表于 2013-8-16 17:14:50

zhaoqiwen 发表于 2013-8-16 17:05 static/image/common/back.gif
你试试这个

谢谢,参考下

cafppla1 发表于 2013-8-16 17:21:19

zhaoqiwen 发表于 2013-8-16 17:05 static/image/common/back.gif
你试试这个

你那个不是80总线的,刚在pudn上找了一个,移植后改了下可以了

chenjuan_119 发表于 2013-8-19 16:37:24

楼主,SSD1306的驱动程序,能不能在你的帖子里上传一下哟!!谢谢

cafppla1 发表于 2013-8-19 20:56:55

chenjuan_119 发表于 2013-8-19 16:37 static/image/common/back.gif
楼主,SSD1306的驱动程序,能不能在你的帖子里上传一下哟!!谢谢

80总线的哦,需要的话明天吧,记得提醒我…

chenjuan_119 发表于 2013-8-20 10:14:51

我也是用8080总线的,你能上传一下最好了,谢谢…………
对了,那个28脚VCC不用外接电源的哈??

cafppla1 发表于 2013-8-20 12:23:58

chenjuan_119 发表于 2013-8-20 10:14 static/image/common/back.gif
我也是用8080总线的,你能上传一下最好了,谢谢…………
对了,那个28脚VCC不用外接电源的哈?? ...

用内部dc就不要接

cafppla1 发表于 2013-8-21 09:42:52

chenjuan_119 发表于 2013-8-19 16:37 static/image/common/back.gif
楼主,SSD1306的驱动程序,能不能在你的帖子里上传一下哟!!谢谢

给你参考void Write_Command(unsigned char Data)
{
        DC=0;
        CS=0;
        WR_oled=0;

                xData=Data;

        WR_oled=1;
        CS=1;
        DC=1;
}


void Write_Data(unsigned char Data)
{
        DC=1;
        CS=0;
        WR_oled=0;

                xData=Data;
       
        WR_oled=1;
        CS=1;
        DC=1;

}

unsigned char Read_Data()
{
    unsigned char temp;
        DC=1;
        CS=0;
        WR_oled=1;
        xData=0xff;
        RD_oled=0;
           uDelay(20);
                temp=xData;
           uDelay(20);
        RD_oled=1;
       uDelay(20);
        CS=1;
        DC=1;

        return temp;
}
void LcdXset(unsigned char x)
{
        Write_Command(0xb0 + (x&0x07));
}

void LcdYset(unsigned char y)
{
    y+=2;
    Write_Command(0x10 | (y>>4));        // Set column at 2
    Write_Command(0x00 | (y & 0x0F));
}

void lcd_gotoxy(unsigned char x, unsigned char y)
{
   
    LcdYset(x);
    LcdXset(y>>3);
}




   ///////////////////////////////////////////






void LCD_Set_Pos(unsigned char x, unsigned char y)
{
Write_Command(0xb0+y);
Write_Command(((x&0xf0)>>4)|0x10);
Write_Command((x&0x0f)|0x01);
}

void Dra_Point(unsigned char x, unsigned char y)
{

    unsigned char b;
        y=63-y;
    lcd_gotoxy(x, y);
    b = Read_Data();
        b = Read_Data();
    b |= 0x01 << (y&0x07);                                // set dot
    lcd_gotoxy(x, y);
    Write_Data(b);

}

chenjuan_119 发表于 2013-8-21 11:01:25

好的,谢谢~~{:smile:}

2k_man 发表于 2013-10-17 10:58:33

标记一个,回家要去弄弄

njchenmin 发表于 2013-10-27 16:39:43

一直用SPI口

lzzd0918 发表于 2014-10-20 14:33:55

正好在做这个。看一下

Okar 发表于 2016-8-29 16:52:31

本帖最后由 Okar 于 2016-8-29 17:02 编辑

cafppla1 发表于 2013-8-21 09:42
给你参考

感谢分享,最近也是用80总线调打点函数,也碰到了画水平线有间隔的问题,楼主给的例子完全解决了这个问题!
顺便也贴上我的读显存函数,给需要的朋友参考一下。

unsigned char OLED_RdDat(void)
{

    P2DIR &= ~0X80;   //设置端口方向为输入
    P4DIR &= ~0XEF;
        OLED_CS_0;//打开片选
    OLED_DC_1;//选择传输数据
   
    unsigned char dat = 0;
       
        OLED_RD_0;//按低Rd线开始读取
        delay_us(2);//等待数据稳定
        OLED_RD_1;//释放RD线
       
        OLED_DATAIN(dat);//读入数据
   
    OLED_CS_1;//关闭片选

    return dat;
}

willlijie 发表于 2017-11-16 10:22:27

地址设置错了 void LCD_Set_Pos(unsigned char x, unsigned char y)
{
  Write_Command(0xb0+y);
  Write_Command(((x&0xf0)>>4)|0x10);
  Write_Command((x&0x0f));   // |0x01会只能定位到奇数列。
}
页: [1]
查看完整版本: 求助ssd1306驱动的oled打点问题