|
于是开始分析优化程序
首先
这样的肯定不能用了,于是采用指针的方式,
于是,定义4个指向4个汉字的指针及8个当前行每一列的数据
- unsigned char *pd1,*pd2,*pd3,*pd4;
- unsigned char sd1,sd2,sd3,sd4,sd5,sd6,sd7,sd8; // 当前行要显示的数据
复制代码
然后把这4个指针指向要显示的数据
- pd1 = show_array;
- pd2 = show_array1;
- pd3 = show_array2;
- pd4 = show_array3;
复制代码
然后再分别显示16行,为了缩短关显示的时间,我们在关显示前就要算出当前行要显示的数据,
并算出下一行要显示的数据
- for (j=0;j<16;j++) //循环显示8行
- {
- sd1 = *pd1;
- sd2 = *(pd1+1);
- sd3 = *pd2;
- sd4 = *(pd2+1);
- sd5 = *pd3;
- sd6 = *(pd3+1);
- sd7 = *pd4;
- sd8 = *(pd4+1);
- pd1 += 2;
- pd2 += 2;
- pd3 += 2;
- pd4 += 2;
- out_OE = 0; // 输出先关了
- set_row(j); // 设置要显示的那一行
- ..........................................
- }
-
复制代码
经仿真,在关显示前就算出本行要显示的数据,可以节省0.2ms
然后是单行输出部分进行改造,首先show_array[j*2+1]这样的不必再用了,直接使用sd1~sd8即可
然后也不再使用
- for(i=0;i<8;i++)
- {
- (变量 >>i) & 0x01;
- }
复制代码
这样的判断方法,因为这样,CPU只能一位一位地移位,而且还要判断是否移够了
于是我们进行优化成
- for(i=0;i<8;i++)
- {
- (sd1 & 0x01);
- sd1 >>= 1;//自移一位并保存起来,不用每次都移N位了
- }
复制代码
整个程序优化得差不多了,仿真测试结果为,单行数据发送的时间为0.64ms
和原来4ms比较,6倍之多呀....
还有没有优化的地方呢?
- for (i=0;i<8;i++) // 开始输出数据
复制代码
可以优化成
- for (i=8;i>0;i--) // 开始输出数据
复制代码
原因是我用的C51 51有自减并判断非0的指令一条指令就搞定,
如果判断是否小于8,则要多条指令才能完成
那么
- for (j=0;j<16;j++) //循环显示16行
复制代码
可不可以也这样优化呢?
答案是可以,但实际测试结果是反而程序执行的时间太长了,
原因是下面我们用了到j这个变量
如果也优化成那样了,则要改成
- set_row(16-j); // 设置要显示的那一行
复制代码
多了一次运算,反而慢了....
于是这里就不能改了,
最终于测试结果: 单行发送数据耗时0.63ms (11.0592M晶体,12T普通51单片机)
0.63*16=10.08ms
10.08*30帧=302.4ms
302ms/1秒 = 0.3 也就是说刷30帧的时候,有30%的时候屏是关闭的,勉强能用了
所以,这屏要是用595来驱动的话,就没这个问题了,不过,算法亦然重要 |
|