一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
12
返回列表 发新帖
楼主: shqi2003
收起左侧

求助【点阵屏第十六行一闪一闪的问题】

  [复制链接]
发表于 2010-7-25 11:43 | 显示全部楼层
本帖最后由 狗狗百里游 于 2010-7-25 11:47 编辑

if(time>=50)     //每2.5秒刷新一次温度数据
   {
    time=0;
    tempchange();     //温度转换命令
    wendu_shi=get_temp()/100;
    wendu_ge=get_temp()%100/10;
     
   }      
这个函数里面有控制P1的代码,你屏蔽完这部分函数估计就不闪了。

解决办法
要把
   for(j=0;j<16;j++)   //行扫描
     {     
}
弄成一个独立函数,然后在tempchange();     //温度转换命令
里面调用
   for(j=0;j<16;j++)   //行扫描
     {     
}

不然你的点阵行不更新的,运行到P1=16 就卡住了。


或者

  if(time>=50)     //每2.5秒刷新一次温度数据
   {
    time=0;
//这里加一个获取上一次转换温度的函数
    tempchange();     //温度转换命令 ,这个要等800us左右温度才更新,不要用阻塞函数,不然你的点阵就不更新了。发送DS18B20发送转换温度命令后直接退出,
    wendu_shi=get_temp()/100;
    wendu_ge=get_temp()%100/10;
     
   }

还有
   for(j=0;j<16;j++)   //行扫描
改成
   for(j=1;j<16;j++)   //行扫描
你的硬件貌似P1=0,是全黑
发表于 2010-7-25 14:02 | 显示全部楼层
本帖最后由 litchiate 于 2010-7-25 14:05 编辑

是否只注释掉了一行?

如果是把温度相关的都注释掉看看?

1820部分得改下,太耗时间了。
 楼主| 发表于 2010-7-25 14:37 | 显示全部楼层
if(time>=50)     //每2.5秒刷新一次温度数据
   {
    time=0;
    tempchange();     //温度转换命令 ...
狗狗百里游 发表于 2010-7-25 11:43 https://www.yleee.com.cn/images/common/back.gif



    谢谢回复,我太菜鸟了,目前还不能理解你的意思。
发表于 2010-7-25 15:02 | 显示全部楼层
第一:先检查你的程序其他地方有没有调用P1端口。
第二:屏蔽掉

if(time>=50)     //每2.5秒刷新一次温度数据
   {
    time=0;
    tempchange();     //温度转换命令
     wendu_shi=get_temp()/100;
    wendu_ge=get_temp()%100/10;
     
   }      
看还闪不。

第三:把下面的弄成一个独立函数,方便调用。
   for(j=1;j<16;j++)   //行扫描
     {     
.......
}

当j=16, P1=j; 循环结束, 也就是闪的那行。然后时间都交给tempchange();  了
你的tempchange函数太耗时间,可以优化成不怎么耗时间的。

比如
发送DS18B20发送转换温度命令后直接退出,
下一次1秒后,
暂停中断,
再读取温度。然后再发送DS18B20发送转换温度命令后直接退出,(耗的时间估计还不到2ms
记得恢复中断。
如此循环,耗的时间估计还不到2ms
你们弄点阵的程序,一定要弄几个功能模块啊,好测试硬件是否损坏。
单亮任意一行,循环由上到下单亮任意一行,显示三角形这样。
这样就方便识别led点阵的发送方向,好设置字模的方向
 楼主| 发表于 2010-7-26 22:40 | 显示全部楼层
if(time>=50)     //每2.5秒刷新一次温度数据
   {
    time=0;
    tempchange();     //温度转换命令 ...
狗狗百里游 发表于 2010-7-25 11:43 https://www.yleee.com.cn/images/common/back.gif


根据你的提示1】估计是温度更新引起的。2】这个函数里面有控制P1的代码,你屏蔽完这部分函数估计就不闪了。

原来的问题就这部分程序,我只加了2句就完全OK了,问题是我这样加是不是符合程序的逻辑,呵呵!!
   init_timer0();  //中断初始化
                while(1)
                {
        
    if(time>=50)  //每2.5秒刷新一次温度数据
                        OE=1;//增加部分
                        P1=0xFFFF; //增加部分

                        {                             
   time=0;
   tempchange();     //温度转换命令
 楼主| 发表于 2010-7-26 23:15 | 显示全部楼层
顺便改了有小数点的玩玩。
5字温度计.jpg
发表于 2010-7-27 07:42 | 显示全部楼层
求助【点阵屏第十六行一闪一闪的问题】
为了看问题方便清楚,特地字模取反,下面2个图就是第十六行一闪一闪 ...
shqi2003 发表于 2010-7-25 00:06 https://www.yleee.com.cn/images/common/back.gif


  一。  判断是否是温度更新所致,先让EA=0;

         void init_timer0()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)/256;
EA=0;    //==============================
ET0=1;
TR0=1;
}



二。  在行扫点亮2MS后。关显示  (154-18,19脚)

    P1=j;  //放上面会错乱 消影
    STB=1;  //下降沿,上升沿显示错乱
    STB=0;
                                
    delay(2);
   
     OE=1;              //
发表于 2010-7-27 07:55 | 显示全部楼层
本帖最后由 倪大德 于 2010-7-27 07:57 编辑
根据你的提示1】估计是温度更新引起的。2】这个函数里面有控制P1的代码,你屏蔽完这部分函数估计就不闪 ...
shqi2003 发表于 2010-7-26 22:40 https://www.yleee.com.cn/images/common/back.gif


         看来是温度更新引起的!您的程序是转换前关显示

init_timer0();  //中断初始化
                while(1)
                {
        
    if(time>=50)  //每2.5秒刷新一次温度数据
    {
                        OE=1;//增加部分     =========转换前关显示      
                      time=0;
                           
      tempchange();     //温度转换命令
     tempchange();     //温度转换命令
    wendu_shi=get_temp()/100;
    wendu_ge=get_temp()%100/10;
     
   }  

    另外:

          DS18B20温度转换可在93.75~750MS完成9位和12位的数字量,点阵无需12位数字量。

程序中可选择9位,以减少温转时间。不妨一试!
 楼主| 发表于 2010-7-27 15:41 | 显示全部楼层
本帖最后由 shqi2003 于 2010-7-27 15:45 编辑

谢谢倪工!!

现在我这样改才是解决闪耀和长亮的问题
  if(time>=50)     //每2.5秒刷新一次温度数据
                        OE=1;
                        P1=0xFFFF;
   {
                              
    time=0;
    tempchange();     //温度转换命令
                                 
                                                                        
    wendu_shi=get_temp()/100;
    wendu_ge=get_temp()%100/10;
    wendu_sx=get_temp()%10;
                              
   }
                       
         
   for(j=0;j<16;j++)   //行扫描
     {
                        
     OE=1;
                                 
    dat=wendu[j][0];    //温
    WriteByte();
    dat=wendu[j][1];   
    WriteByte();
    dat=wendu[j+16][0];  //度  
    WriteByte();
    dat=wendu[j+16][1];   
    WriteByte();
   
    dat=table[wendu_shi][j];   //温度十位
    WriteByte();     
    dat=table[wendu_ge][j];       //温度个位
    WriteByte();
                                    
    dat=wendu[j+32][0];    //℃  
    WriteByte();
    dat=wendu[j+32][1];   
    WriteByte();
                                P1=j;  //放上面会错乱 消影
                                 OE=0;
                                STB=1;  //下降沿,上升沿显示错乱
                                STB=0;                                                                                                                              
                                delay(2);

  DS18B20温度转换可在93.75~750MS完成9位和12位的数字量,点阵无需12位数字量。

程序中可选择9位,以减少温转时间。不妨一试!


你的【一】和【二】

需要晚上试试,慢慢研究。
发表于 2010-7-28 00:30 | 显示全部楼层
P1=j;&#160;&#160;//放上面会错乱 消影
&#160; &#160; STB=1;&#160;&#160;//下降沿,上升沿显示错乱
&#160; &#160; STB=0;

改成

&#160; &#160; STB=1;&#160;&#160;//下降沿,上升沿显示错乱
&#160; &#160; STB=0;


&#160; &#160;P1=j;&#160;&#160;//放上面会错乱 消影

应该得吧

本版积分规则

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

GMT+8, 2025-4-28 16:26 , Processed in 0.052307 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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