|
发表于 2009-2-26 04:24:51
|
显示全部楼层
哈哈,经过一个小时的探索,终于成功了,原来并不是因为时序Tas,Tpw,Tddr,Tah,Tc 的问题,而是我自己犯了一个严重的sb级的错误,我没有先在读数据函数里判忙,现在加上了判忙函数,结果正确,还是感谢【11楼】 lanlinhong ,你是第一个回复我的人,哈哈!感谢所有无私奉献的网友~!
如下:
//**********************************读数据**********************************//
uchar read_data(void)
{
uchar data;
busyloop();判忙
RS=1;
RW=1;
E=1;
SETIN;
data=DATAIN;
E=0;
return(data);
}
补充:(我刚写的画任意斜率直线函数和画圆函数,希望对需要的人有帮助)
//**********************************画任意点**********************************//
void lcd_draw_dot(uchar x, uchar y)//x。y为点坐标,按128*64来定义
{
uchar lcd_x,lcd_y,dot_datah,dot_datal,datah,datal;
uint dot_data=0x8000;
if(x>=0&&x<16)//初定x位置
lcd_x=0x80;
else if(x>=16&&x<32)
lcd_x=0x81;
else if(x>=32&&x<48)
lcd_x=0x82;
else if(x>=48&&x<64)
lcd_x=0x83;
else if(x>=64&&x<80)
lcd_x=0x84;
else if(x>=80&&x<96)
lcd_x=0x85;
else if(x>=96&&x<112)
lcd_x=0x86;
else if(x>=112&&x<128)
lcd_x=0x87;
else
{
write_cmd(0x30);
lcd_x=x;
write_cmd(0x92);
lcd_wz_display(wz2,sizeof(wz2)-1);
while(1);
}
if(y>=0&&y<32)//进一步确定点所在的字的位置
lcd_y=0x80+y;else
if(y>=32&&y<64)
{
lcd_y=0x80+y-32;
lcd_x+=8;
}
else
{
write_cmd(0x30);
write_cmd(0x92);
lcd_wz_display(wz2,sizeof(wz2)-1);
while(1);
}
dot_data=dot_data>>(x%16);//确定写入点数据,最终确定点位置
dot_datal=dot_data&0x00ff;
dot_datah=dot_data>>8;
write_cmd(lcd_y); //设置点的Y地址坐标
write_cmd(lcd_x); //设置点的X地址坐标
read_data();
datah=read_data();
datal=read_data();
write_cmd(lcd_y); //设置点的Y地址坐标
write_cmd(lcd_x); //设置点的X地址坐标
write_data(dot_datah|datah);
write_data(dot_datal|datal);
}
//**********************************画任意直线********************************//
void lcd_draw_lin(uchar x1, uchar y1,uchar x2,uchar y2)//x。y为起始点坐标,按128*64来定义,x2>x1
{
signed char j,k;
j=x2-x1;
k=y2-y1;
if(j==0&&k==0)
lcd_draw_dot(x1,y1);
else if(j==0&&k!=0)
for(uchar i=0;i<=abs(k);i++)
lcd_draw_dot(x1,k>0?y1++:y2++);
else if(j!=0&&k==0)
for(uchar i=0;i<=abs(j);i++)
lcd_draw_dot(j>0?x1++:x2++,y1);
else
for(uchar i=0;i<=(x2-x1);i++)
k>0?lcd_draw_dot(i+x1,i*(y2-y1)/(x2-x1)+y1):lcd_draw_dot(i+x1,y1-i*(y1-y2)/(x2-x1));
}
//***********************************画圆***********************************//
void lcd_draw_circle(uchar x, uchar y,uchar r)//x、y为圆心坐标,r为半径
{
signed char k;
uchar x1,y1;
for(x1=x-r;x1<=x+r;x1++)
{
k=x1-x;
y1=y+sqrt(r*r-k*k);
lcd_draw_dot(x1,y1);
}
for(x1=x-r;x1<=x+r;x1++)
{
k=x1-x;
y1=y-sqrt(r*r-k*k);
lcd_draw_dot(x1,y1);
}
for(y1=y-r;y1<=y+r;y1++)
{
k=y1-y;
x1=x+sqrt(r*r-k*k);
lcd_draw_dot(x1,y1);
}
for(y1=y-r;y1<=y+r;y1++)
{
k=y1-y;
x1=x-sqrt(r*r-k*k);
lcd_draw_dot(x1,y1);
}
} |
|