一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2278|回复: 12
收起左侧

32x64的双色屏为什么最后一行亮度高?

[复制链接]
发表于 2015-6-7 18:39 | 显示全部楼层 |阅读模式
从网上东拼西凑了几段程序,自己写了个万年历,但是发现上下半屏的最后一行亮度比其他行高,我水平有限,不知是什么原因,推测是显示扫描程序的问题,贴上显示扫描程序,高手们给看看问题出在哪里?谢谢!


void display()
{
    uchar i,j;
        for(i=0;i<16;i++)
              {               
                        update_dis_buff1(i);
                        update_dis_buff2(i);
                        for(j=0;j<8;j++)
                                {
                                        if(i<8)       
                                        {       
                                                if(j==7)
                                                        sendbyte5(dis_buff1[j]);                 //扫描橙色
                                                        else
                                                                sendbyte1(dis_buff1[j]);
                                                        sendbyte3(dis_buff2[j]);
                                        }
                                                else
                                                {       
                                                        sendbyte2(dis_buff1[j]);
                                                        if(RY)                                           //如果是闰月
                                                                {
                                                                if(j>4)
                                                                        sendbyte6(dis_buff2[j]);        //扫描橙色       
                                                                        else
                                                                                sendbyte4(dis_buff2[j]);
                                                                }
                                                                else                                                //如果不是闰月
                                                                        {
                                                                                if(j>3)
                                                                                        sendbyte6(dis_buff2[j]);        //扫描橙色       
                                                                                        else
                                                                                sendbyte4(dis_buff2[j]);
                                                                        }   
                                                }       
                                }
                    STR=0;                                         
                    STR=1;
                    P3=i;  
                }                                 
}

IMG_20150607_180426.jpg
IMG_20150607_180659.jpg
发表于 2015-6-7 18:55 | 显示全部楼层
这个子程序的内容,是扫描整个屏,完了之后,最后一行处于点亮状态,退出去了。一会回来继续。
这样,最后一行点亮的时间,远比其他行长,就显得更亮。
比较好的做法是,改写子程序,使用静态变量,每次执行只扫描一行,就退出,这样使得每行的点亮时间大致相等。
更好的做法是,用定时器,每次扫描一行。
发表于 2015-6-7 19:47 | 显示全部楼层
楼上正解!
我说说不太好的做法,在你程序基础上,每扫描一行,延时一下,再把这行关闭显示!相当于亮度控制     (可能会有闪烁感)   
或者,增加第17行,扫描17行时,把第16行关闭显示!
发表于 2015-6-7 20:06 | 显示全部楼层
扫描完最后一行关闭显示就好了
发表于 2015-6-7 21:47 | 显示全部楼层
我改的程序,把i的循环去掉,每次调用后递增,相当于我说的前一种方法。
结果是亮度基本一致且前15行亮度会提高,但如果主程序其他部分太长,显示会有闪烁。
只要用定时器中断调用这个子程序就变成我说的后一种方法了。
void display()
{
    static unsigned char i;
    unsigned char j;

                        update_dis_buff1(i);
                        update_dis_buff2(i);
                        for(j=0;j<8;j++)
                                {
                                        if(i<8)        
                                        {        
                                                if(j==7)
                                                        sendbyte5(dis_buff1[j]);                 //扫描橙色
                                                        else
                                                                sendbyte1(dis_buff1[j]);
                                                        sendbyte3(dis_buff2[j]);
                                        }
                                                else
                                                {        
                                                        sendbyte2(dis_buff1[j]);
                                                        if(RY)                                           //如果是闰月
                                                                {
                                                                if(j>4)
                                                                        sendbyte6(dis_buff2[j]);        //扫描橙色        
                                                                        else
                                                                                sendbyte4(dis_buff2[j]);
                                                                }
                                                                else                                                //如果不是闰月
                                                                        {
                                                                                if(j>3)
                                                                                        sendbyte6(dis_buff2[j]);        //扫描橙色        
                                                                                        else
                                                                                sendbyte4(dis_buff2[j]);
                                                                        }   
                                                }        
                                }
                    STR=0;                                         
                    STR=1;
                    P3=i;  
    i++;
    i&=0x0f;
}
发表于 2015-6-7 22:24 | 显示全部楼层
把这段显示程序小改一下,放到中断里面就好了……

void display()
{
    uchar i,j;
        i++;if(i>16){i=0;}
                              
                        update_dis_buff1(i);
                        update_dis_buff2(i);
                        for(j=0;j<8;j++)
                                {
                                        if(i<8)        
                                        {        
                                                if(j==7)
                                                        sendbyte5(dis_buff1[j]);                 //扫描橙色
                                                        else
                                                                sendbyte1(dis_buff1[j]);
                                                        sendbyte3(dis_buff2[j]);
                                        }
                                                else
                                                {        
                                                        sendbyte2(dis_buff1[j]);
                                                        if(RY)                                           //如果是闰月
                                                                {
                                                                if(j>4)
                                                                        sendbyte6(dis_buff2[j]);        //扫描橙色        
                                                                        else
                                                                                sendbyte4(dis_buff2[j]);
                                                                }
                                                                else                                                //如果不是闰月
                                                                        {
                                                                                if(j>3)
                                                                                        sendbyte6(dis_buff2[j]);        //扫描橙色        
                                                                                        else
                                                                                sendbyte4(dis_buff2[j]);
                                                                        }   
                                                }        
                                }
                    STR=0;                                         
                    STR=1;
                    P3=i;  
                                               
}
 楼主| 发表于 2015-6-8 10:25 | 显示全部楼层
谢谢大神们的回复!
sdf15937和reiyawea两位提供的程序应该是一样的,我换了reiyawea的程序后,屏闪烁的厉害,然后我把它放到定时器中断里就好了,但是温度显示混乱了,我分析是我的单片机速度太低了,定时器中断时影响了18B20的读取,谁让俺现在还用89s52和22mhz的晶振呢‘’‘
发表于 2015-6-8 11:23 | 显示全部楼层
把OE取反就可以
发表于 2015-6-8 11:25 来自手机 | 显示全部楼层
roamer 发表于 2015-6-8 10:25 static/image/common/back.gif
谢谢大神们的回复!
sdf15937和reiyawea两位提供的程序应该是一样的,我换了reiyawea的程序后,屏闪烁的厉害,然后我把它放到定时器中断里就好了,但是温度显示混乱了,我分析是我的单片

中断打乱了温度时序。读温度前禁用中断即可。可以在每分钟0秒启动测温,1秒读取。来自: Android客户端
发表于 2015-6-8 15:20 | 显示全部楼层
OE取反试试吧

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-21 23:12 , Processed in 0.058222 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表