一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2635|回复: 13
收起左侧

[51单片机] 好久没有码代码了,感觉脑子不够用了……已经解决了

[复制链接]
发表于 2019-8-15 16:39 | 显示全部楼层 |阅读模式
本帖最后由 lxclia 于 2019-8-22 09:00 编辑

是很脑抽的原因。仿真用的是AT的52单片机,没有Xdata,编译的时候某些函数优化到Xdata里面了,导致仿真不正常。
仿真的软件里面加了256B的Xdata就正常了。


代码很简单,就是一个用两个595带8个7段的数码管。直接给数字可以显示,但是替换成变量就无法显示了……
比如这里
Display(0,1);第0个数字显示1,这样就是正常的
要是换成
Display(0,a);,哪怕这个a=1也是无法正常显示的。
附上完整代码,希望各位老司机带带我
#include <reg52.h>
#include <intrins.h>


sbit SCK = P3^5;    // 数据输入时钟线,脉冲
sbit SI  = P3^6;    // 数据线
sbit RCK = P3^7;    // 锁存

unsigned char code SMG[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90,0x83,0xc6,0xa1,0x86,0x8e};  // 段码
unsigned char code Wei[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};    // 位选
unsigned char Val[8]  = {0};    // 要显示的数据


//************************ 函数声明 ************************


//控制74HC595输出数据
void Output(void)
{
    RCK = 0;
    RCK = 1;
}



//向74HC595中写入一字节数据
void Write_Byte(unsigned char dat)
{
    unsigned char i = 0;

    for(i=0; i<8; i++)
    {
        SCK = 0;
        SI  = dat & 0x80;
        dat <<= 1;   
                SCK = 1;   
    }
}



//显示函数

void Display(unsigned char n,unsigned char m)
{
    Write_Byte(Wei[n]);
    Write_Byte(SMG[m]);
    Output();
}



int main(void)
{   


    while(1)
    {
                unsigned char a;
                a++;
                if(a>10000000)a=0;
                Display(0,1);
                Display(1,2);
                Display(2,3);
                Display(3,4);
                Display(4,5);
                Display(5,(a/1000%10));
                Display(6,(a/100%10));
                Display(7,(a/10%10));        
    }


}





       截图201908151639111615..png 8x8+8x16.rar (45.59 KB, 下载次数: 24)

发表于 2019-8-15 20:26 | 显示全部楼层
unsigned char最大值255吧?

点评

看程序应该是没有关系,大于255自然就从0开始了……这程序我也看不出啥问题……  详情 回复 发表于 2019-8-15 20:30
发表于 2019-8-15 20:30 来自手机 | 显示全部楼层
lazymike 发表于 2019-8-15 20:26
unsigned char最大值255吧?

看程序应该是没有关系,大于255自然就从0开始了……这程序我也看不出啥问题……
发表于 2019-8-15 22:14 | 显示全部楼层
在主程序的while循环中显示的话是不是因为刷新得太快而看不清显示的内容?
要不在定时中断中显示?每0.5秒刷新一次。或在所有显示内容结束后加一个5000ms的延时。
  1. int main(void)
  2. {
  3.     while(1)
  4.     {
  5.                 unsigned char a;
  6.                 a++;
  7.                 if(a>10000000)a=0;
  8.                 Display(0,1);
  9.                 Display(1,2);
  10.                 Display(2,3);
  11.                 Display(3,4);
  12.                 Display(4,5);
  13.                 Display(5,(a/1000%10));
  14.                 Display(6,(a/100%10));
  15.                 Display(7,(a/10%10));
  16.                 delayms(5000);
  17.     }


  18. }
复制代码
发表于 2019-8-15 23:51 | 显示全部楼层
就这主循环里,就算显示正常,你眼睛也看不过来。这个char a分解错了。
发表于 2019-8-19 19:01 | 显示全部楼层
本帖最后由 pla155 于 2019-8-19 19:06 编辑

楼上分析的正确,程序这样修改一下,每一次刷新595,都来一个延时2毫秒,效果可能会好一些。 这样,刷新率会达到 62 Hz。 想50Hz就延时2.5毫秒。
  while(1)
    {
                unsigned char a;
                a++;
//   if(a>10000000)a=0;  加溢出,自然就变为 0

                Display(0,1);
                delayms(2);

               Display(1,2);
               delayms(2);

                Display(2,3);
               delayms(2);

                Display(3,4);
                delayms(2);

               Display(4,5);
                delayms(2);

               Display(5,(a/100));
                delayms(2);

               Display(6,(a/10%10));
                delayms(2);

               Display(7,(a%10));
                delayms(2);
    }








点评

楼上分析可不正确,至少12345这5个数字是固定显示的,也是“乱码”了  详情 回复 发表于 2019-8-22 09:03
发表于 2019-8-19 23:29 | 显示全部楼层
彼此彼此,5-6年没有写过代码了,感觉就像那口钟一样,坏在那里了。。。

点评

呵呵,在跟谁彼此呢  详情 回复 发表于 2019-8-21 18:52
发表于 2019-8-21 18:52 | 显示全部楼层
40560335 发表于 2019-8-19 23:29
彼此彼此,5-6年没有写过代码了,感觉就像那口钟一样,坏在那里了。。。

呵呵,在跟谁彼此呢
 楼主| 发表于 2019-8-22 09:03 | 显示全部楼层
pla155 发表于 2019-8-19 19:01
楼上分析的正确,程序这样修改一下,每一次刷新595,都来一个延时2毫秒,效果可能会好一些。 这样,刷新率 ...

楼上分析可不正确,至少12345这5个数字是固定显示的,也是“乱码”了
发表于 2019-8-22 10:04 | 显示全部楼层
谢谢指正,
没用过模拟仿真软件,仅仅是根据程序分析的。
期待你的结论。

本版积分规则

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

GMT+8, 2024-3-29 22:02 , Processed in 0.083013 second(s), 52 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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