|
3.将采样数据转换成显示数据
LCD显示屏为320×240点阵的图形显示模块,内置RA8803 控制器。模块不仅可以显示单一的文本、图形,而且可以实现双图层的(“或”、“异或”、“同或”、“与”四种逻辑关系)合成显示。在本示波器中显示格线与波形是在不同的层上显示,显示关系为“或”,画方格线的程序见原程序,比较简单就不多说了,着重解释一下如何将采样数据转换成显示数据。
显示屏的地址结构见图3,由图可知对显示数据的操作最小单位为字节,因为Mega32的内存为2K字节,显示波形的区域为240*240,显示一屏波形所需处理的数据为7.2K,故Mega32不可能同时处理一屏波形的全部数据,所以将一屏波形按字节分为30列,每次处理一列,处理完后直接显示,然后处理下一列。将AD转换所得的数据作为给LCD显示器写数据的列地址,因为一列数据位240字节,所以定义一个容量为240字节的数组lcd_buffer[240],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[k]=(lcd_buffer[k]|m); //让该坐标对应数据与m相或并原位保存
if(add[i+q]
{
for(k=add[i+q];k
{
lcd_buffer[k]=(lcd_buffer[k]|m);
}
}
else
{
for(k=add[i+q];k>add[i+q+1];k--)
{
lcd_buffer[k]=(lcd_buffer[k]|m);
}
}
m>>=1; //将m的值右移一位
}
for(h=0;h<240;h++) //送显示
{
SdCmd(0x60);SdCmd(j); //设置显示X坐标
SdCmd(0x70);SdCmd(h); //设置显示Y坐标
SdData(lcd_buffer[h]); //传送显示数据
lcd_buffer[h]=0; //将已送出数据的存储器单元清零
}
}
这是原文写的,但是感觉不是很理解。比如我采样一个10M的信号,找这个程序是一个周期8个点,那么一个8位不救完成一个周期的数据写入?相邻点在一个周期还是离得比较远的,但是得到的数据现实利用了这8个点来显示,相邻两点怎么就能连续呢? 求高人指点
[ 本帖最后由 dyh420 于 2011-4-7 21:08 编辑 ]
|
|