|
驱动一个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》
|