求助:采样得到的数据用平滑曲线连接如何实现??
现在能够显示采样点,看起来不够美观,如何实现点之间插值平滑处理 样条插值 能不能详细一点,我用的是LPC2148在320240的lcd上显示曲线,lcd控制器是RA8835。 我现在是直接用直线将采样点连接起来的,当点多时,看起来还可以。 3.将采样数据转换成显示数据LCD显示屏为320×240点阵的图形显示模块,内置RA8803 控制器。模块不仅可以显示单一的文本、图形,而且可以实现双图层的(“或”、“异或”、“同或”、“与”四种逻辑关系)合成显示。在本示波器中显示格线与波形是在不同的层上显示,显示关系为“或”,画方格线的程序见原程序,比较简单就不多说了,着重解释一下如何将采样数据转换成显示数据。
显示屏的地址结构见图3,由图可知对显示数据的操作最小单位为字节,因为Mega32的内存为2K字节,显示波形的区域为240*240,显示一屏波形所需处理的数据为7.2K,故Mega32不可能同时处理一屏波形的全部数据,所以将一屏波形按字节分为30列,每次处理一列,处理完后直接显示,然后处理下一列。将AD转换所得的数据作为给LCD显示器写数据的列地址,因为一列数据位240字节,所以定义一个容量为240字节的数组lcd_buffer,lcd_buffer[]在初始时数据全为00H,因为每次对数据的操作至少是一个字节,而每次处理数据处理的是所显示一个点,所以对每列数据处理8次,定义一个变量m,在一列数据处理之前将其赋值为m=10000000B,处理该列第1个点时让该点垂直地址所对应的数组中的数据(00H)与m相或并将结果存入数组,再将变量m右移一位,即m=01000000B。让第2点垂直地址所对应的数组中的数据与m相或并将结果存入数组,再将变量m右移一位,即m=00100000B ……,这样直到一列数据中的8个点全处理完,重新给m赋值为m=10000000B,然后送显示。为了有较好显示效果,将显示相邻的点用线连接起来,在处理第一个点时预读出第二个点的垂直坐标,与第一个点的垂直坐标进行比较,如果比第一个点的垂直坐标小则从第一个点向第二个点拉线,如果比第一个点的垂直坐标大则从第二个点向第一个点拉线。具体程序如下所示:
for(j=0;j<30;j++) //将一屏数据分为30列
{
m=0b10000000; //
for(i=j*8;i<(j+1)*8;i++)//处理每列中的8个点
{
k=add; // 读出采样数据作为垂直坐标
lcd_buffer=(lcd_buffer|m); //让该坐标对应数据与m相或并原位保存
if(add<add) //判断拉线方向
{
for(k=add;k<add;k++)
{
lcd_buffer=(lcd_buffer|m);
}
}
else
{
for(k=add;k>add;k--)
{
lcd_buffer=(lcd_buffer|m);
}
}
m>>=1; //将m的值右移一位
}
for(h=0;h<240;h++) //送显示
{
SdCmd(0x60);SdCmd(j); //设置显示X坐标
SdCmd(0x70);SdCmd(h); //设置显示Y坐标
SdData(lcd_buffer); //传送显示数据
lcd_buffer=0; //将已送出数据的存储器单元清零
}
} 有收获 mark{:smile:}
页:
[1]