我用到的硬件:
单片机:STMF103C8T6
点阵屏:SGD GY2416C9 显示线片是UC1611S
先说一下UC1611S,买来后跟买家要的屏幕初始化代码,直接用的。也懒的去看数据手册了,它默认设置的是竖向写8位数据,低位在上,高位在下。
画横线的原理就是用一个for循环连续写数据,页面坐标不变,列坐标自动加1,一次写一个像素点。
代码如下:
for(i=0;i<length;i++)
{
send_dat(dat);
}
画竖线的原理--因为页坐标是一页代表8行,所以先把页坐标转换成具体的坐标,然后从第一个像素点所在的页开始先写一次数据,然后用for循环是写,8位数据后更新一次页坐标:
if(x%8)
Lcd_Address(x/8,y), send_dat(0xFF << x%8), x=x+8;
length = (length - x%8);
if(length/8)
for(i=0;i<length/8;i++)
Lcd_Address(x/8+i,y);
send_dat(0xFF);
if(length%8)
Lcd_Address(x/8+i,y), send_dat(0x01 << length%8);
画斜线用的是Bresenham算法,其实这个也可以画水平横线和垂直直线。它是根据x的变化值和y的变化值做比较,大者为主线(就是每次它都递增,另一坐标或递增或不递增来填补斜度,两者的变化值一样是就是45度角,这种情况下,两个坐标都递增。其中一个坐标一样是就是水平或垂直线)。用循环递增描点。每次画一个点,最后形成线条。代码:
void Draw_line(u8 x0, u8 y0, u8 x1, u8 y1)
int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1;
int dy = abs(y1-y0), sy = y0<y1 ? 1 : -1;
int err = dx-dy, e2;
do{
disp_point(x0,y0);
//if (x0==x1 && y0==y1) break;
e2 = 2*err; //e2 = 2dx - 2dy
if (e2 >= -dy) { err -= dy; x0 += sx; }
if (e2 <= dx) { err += dx; y0 += sy; }
}while(!(x0==x1 && y0==y1));
画了一个立方体和一个三角形。附件是工程文件。