搜索
bottom↓
回复: 14

求助ssd1306驱动的oled打点问题

[复制链接]

出0入0汤圆

发表于 2013-8-15 17:50:10 | 显示全部楼层 |阅读模式
驱动一个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有限,不能开辟一块显存,只能采用读取的方式,请教各位,程序问题在哪?

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2013-8-16 17:05:16 | 显示全部楼层
你试试这个

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-8-16 17:14:50 | 显示全部楼层
zhaoqiwen 发表于 2013-8-16 17:05
你试试这个

谢谢,参考下

出0入0汤圆

 楼主| 发表于 2013-8-16 17:21:19 | 显示全部楼层
zhaoqiwen 发表于 2013-8-16 17:05
你试试这个

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

出0入0汤圆

发表于 2013-8-19 16:37:24 | 显示全部楼层
楼主,SSD1306的驱动程序,能不能在你的帖子里上传一下哟!!谢谢

出0入0汤圆

 楼主| 发表于 2013-8-19 20:56:55 | 显示全部楼层
chenjuan_119 发表于 2013-8-19 16:37
楼主,SSD1306的驱动程序,能不能在你的帖子里上传一下哟!!谢谢

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

出0入0汤圆

发表于 2013-8-20 10:14:51 | 显示全部楼层
我也是用8080总线的,你能上传一下最好了,谢谢…………
对了,那个28脚VCC不用外接电源的哈??

出0入0汤圆

 楼主| 发表于 2013-8-20 12:23:58 | 显示全部楼层
chenjuan_119 发表于 2013-8-20 10:14
我也是用8080总线的,你能上传一下最好了,谢谢…………
对了,那个28脚VCC不用外接电源的哈?? ...

用内部dc就不要接

出0入0汤圆

 楼主| 发表于 2013-8-21 09:42:52 | 显示全部楼层
chenjuan_119 发表于 2013-8-19 16:37
楼主,SSD1306的驱动程序,能不能在你的帖子里上传一下哟!!谢谢

给你参考
  1. void Write_Command(unsigned char Data)
  2. {
  3.         DC=0;
  4.         CS=0;
  5.         WR_oled=0;

  6.                 xData=Data;

  7.         WR_oled=1;
  8.         CS=1;
  9.         DC=1;
  10. }


  11. void Write_Data(unsigned char Data)
  12. {
  13.         DC=1;
  14.         CS=0;
  15.         WR_oled=0;

  16.                 xData=Data;
  17.        
  18.         WR_oled=1;
  19.         CS=1;
  20.         DC=1;[code]

  21. }

  22. unsigned char Read_Data()
  23. {
  24.     unsigned char temp;
  25.         DC=1;
  26.         CS=0;
  27.         WR_oled=1;
  28.           xData=0xff;
  29.         RD_oled=0;
  30.            uDelay(20);
  31.                 temp=xData;
  32.            uDelay(20);
  33.         RD_oled=1;
  34.          uDelay(20);
  35.         CS=1;
  36.         DC=1;

  37.         return temp;
  38. }
  39. void LcdXset(unsigned char x)
  40. {
  41.         Write_Command(0xb0 + (x&0x07));
  42. }

  43. void LcdYset(unsigned char y)
  44. {
  45.     y+=2;
  46.     Write_Command(0x10 | (y>>4));        // Set column at 2
  47.     Write_Command(0x00 | (y & 0x0F));
  48. }

  49. void lcd_gotoxy(unsigned char x, unsigned char y)
  50. {
  51.    
  52.     LcdYset(x);
  53.     LcdXset(y>>3);
  54. }




  55.    ///////////////////////////////////////////






  56. void LCD_Set_Pos(unsigned char x, unsigned char y)
  57. {
  58.   Write_Command(0xb0+y);
  59.   Write_Command(((x&0xf0)>>4)|0x10);
  60.   Write_Command((x&0x0f)|0x01);
  61. }

  62. void Dra_Point(unsigned char x, unsigned char y)
  63. {

  64.     unsigned char b;
  65.         y=63-y;
  66.     lcd_gotoxy(x, y);
  67.     b = Read_Data();
  68.         b = Read_Data();
  69.     b |= 0x01 << (y&0x07);                                // set dot
  70.     lcd_gotoxy(x, y);
  71.     Write_Data(b);  

  72. }
复制代码

出0入0汤圆

发表于 2013-8-21 11:01:25 | 显示全部楼层
好的,谢谢~~

出0入0汤圆

发表于 2013-10-17 10:58:33 | 显示全部楼层
标记一个,回家要去弄弄

出0入0汤圆

发表于 2013-10-27 16:39:43 | 显示全部楼层
一直用SPI口

出0入0汤圆

发表于 2014-10-20 14:33:55 来自手机 | 显示全部楼层
正好在做这个。看一下

出0入0汤圆

发表于 2016-8-29 16:52:31 | 显示全部楼层
本帖最后由 Okar 于 2016-8-29 17:02 编辑


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

  1. unsigned char OLED_RdDat(void)
  2. {
  3.   
  4.     P2DIR &= ~0X80;     //设置端口方向为输入
  5.     P4DIR &= ~0XEF;
  6.         OLED_CS_0;  //打开片选
  7.     OLED_DC_1;  //选择传输数据
  8.    
  9.     unsigned char dat = 0;
  10.        
  11.         OLED_RD_0;  //按低Rd线开始读取
  12.         delay_us(2);//等待数据稳定
  13.         OLED_RD_1;  //释放RD线
  14.        
  15.         OLED_DATAIN(dat);  //读入数据
  16.    
  17.     OLED_CS_1;  //关闭片选

  18.     return dat;
  19. }
复制代码

出0入0汤圆

发表于 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会只能定位到奇数列。
}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 21:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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