求助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 static/image/common/back.gif
你试试这个
谢谢,参考下 zhaoqiwen 发表于 2013-8-16 17:05 static/image/common/back.gif
你试试这个
你那个不是80总线的,刚在pudn上找了一个,移植后改了下可以了 楼主,SSD1306的驱动程序,能不能在你的帖子里上传一下哟!!谢谢 chenjuan_119 发表于 2013-8-19 16:37 static/image/common/back.gif
楼主,SSD1306的驱动程序,能不能在你的帖子里上传一下哟!!谢谢
80总线的哦,需要的话明天吧,记得提醒我… 我也是用8080总线的,你能上传一下最好了,谢谢…………
对了,那个28脚VCC不用外接电源的哈?? chenjuan_119 发表于 2013-8-20 10:14 static/image/common/back.gif
我也是用8080总线的,你能上传一下最好了,谢谢…………
对了,那个28脚VCC不用外接电源的哈?? ...
用内部dc就不要接 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);
} 好的,谢谢~~{:smile:} 标记一个,回家要去弄弄 一直用SPI口 正好在做这个。看一下 本帖最后由 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;
} 地址设置错了 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]