dポイントプレゼントキャンペーン実施中!

picからsg12864を制御しています。
直線の描画を行った際、まっすぐな縦線が点線のようになってしまいます。
横線・斜線は問題なく描画できます。また、ビットマップをそのまま表示した場合も問題なく描画できます。
後閑さんのプログラムを使用しています。下記のlcd_Lineを使用しています。
for文を使用して、1秒間隔でlcd_Pixelで点を打って直線を描画て動作を確認したところ、一度は黒いドットが表示されますが、消えてしまう箇所がありました。消えてしまう箇所はいつも同じです。
どなたか、解決方法がわかる方はいらっしゃいませんでしょうか?

#defineabs(a)(((a)>0) ? (a) : -(a))
void lcd_Line(int x0, int y0, int x1, int y1)
{
int steep, t;
intdeltax, deltay, error;
int x, y;
int ystep;

/// 差分の大きいほうを求める
steep = (abs(y1 - y0) > abs(x1 - x0));
/// x、yの入れ替え
if(steep){
t = x0; x0 = y0; y0 = t;
t = x1; x1 = y1; y1 = t;
}
if(x0 > x1) {
t = x0; x0 = x1; x1 = t;
t = y0; y0 = y1; y1 = t;
}
deltax = x1 - x0;// 傾き計算
deltay = abs(y1 - y0);
error = 0;
y = y0;
/// 傾きでステップの正負を切り替え
if(y0 < y1) ystep = 1; else ystep = -1;
/// 直線を点で描画
for(x=x0; x<x1; x++) {
if(steep) lcd_Pixel(y,x,1); else lcd_Pixel(x,y,1);
error += deltay;
if((error << 1) >= deltax) {
y += ystep;
error -= deltax;
}
}
}

void lcd_Pixel(int Xpos, int Ypos, char On){
char cs, data, page, pos, count, i;

/* if colum >127 then do nothing */
if(Xpos<128){
if(Xpos>63){// 64=<colum<=127?
Xpos = Xpos-64;// shift 64 dot
cs = 1;
}
else
cs = 2;
page = (char)(7-Ypos/8);// set page
lcd_Write(cs, 0xB8+page, 1);
lcd_Write(cs, 0x40+Xpos, 1);// set colum
data = lcd_Read(cs,0);// get current data
lcd_Write(cs, 0x40+Xpos, 1);// set colum ????
data = lcd_Read(cs,0);// get current data????
pos =1;// set bit position
count = (char)(7-Ypos%8);// set bit
for(i=0; i<count; i++)// caluculate 2^n
pos *= 2;
lcd_Write(cs, 0x40+Xpos, 1);// back address
if(On==1)// set or reset bit
lcd_Write(cs, data | pos, 0);// set 1
else
lcd_Write(cs, data & ~pos, 0);// set 0
}
}

A 回答 (1件)

>pos =1;// set bit position


>count = (char)(7-Ypos%8);// set bit
>for(i=0; i<count; i++)// caluculate 2^n
>pos *= 2;

の部分で、countが0のときでも、pos は pos *=2 を通って
pos = 2となり、

count = 7のときは、pos = 256 => pos = 0となり

点が表示されないところがあるのではないですか?

pos = 1 の状態が存在しないように思いますが...
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!