这是神马情况啊!程序没错的,为什么仿真不对

[复制链接]
hgjinwei 发表于 2012-6-26 10:45 | 显示全部楼层
这个玩意,搞搞数字逻辑还可以,你还想用来仿真电气特性?别折腾了。
m564522634 发表于 2012-6-26 11:22 | 显示全部楼层
我看你电路是用的共阳数码管了,但你的程序开位选的时候怎么开的是D=0XFE呀不是开D=0X01吗

评分

参与人数 1威望 +1 收起 理由
雷影少年 + 1 我很赞同

查看全部评分

m564522634 发表于 2012-6-26 11:24 | 显示全部楼层
程序要实现的功能是12345678吧
 楼主| 雷影少年 发表于 2012-6-26 11:27 | 显示全部楼层
楼主别仿真了,就在开发板上弄吧。
NE5532 发表于 2012-6-26 10:23

好吧!我不较真了。
做别的去
m564522634 发表于 2012-6-26 11:29 | 显示全部楼层
把d=0xfe改为d=0x01;试下
 楼主| 雷影少年 发表于 2012-6-26 11:43 | 显示全部楼层
我看你电路是用的共阳数码管了,但你的程序开位选的时候怎么开的是D=0XFE呀不是开D=0X01吗
m564522634 发表于 2012-6-26 11:22

我也在纠结这个呢给的原理图是说共阳数码管的,但是只有这样写才正确,公共端要为0的时候对应的数码管才亮,但是我的段码有确实是共阳管的段码,不明白这是什么原因?是不是原理图有问题
lnak 发表于 2012-6-26 11:57 | 显示全部楼层
三极管通了,加上拉电阻试试!
 楼主| 雷影少年 发表于 2012-6-26 16:12 | 显示全部楼层
本帖最后由 雷影少年 于 2012-6-26 16:13 编辑

感谢各位的帮助,程序总算是搞定了,以我目前的水平只能写这么次的程序了
不论好坏都传上来吧!再给前辈们一个批评的的机会,给比我飞得慢的菜鸟们一个例子吧!
加了点注释,程序的功能就是8为数码管动态显示0~7,8个数字,回头再加别的功能吧!
下面是程序:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code seg[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};  //数码管段码
void delay(uchar x)  //延时程序
{
uchar a,b;
for(a=x;a>0;a--)
  for(b=100;b>0;b--);
}
void main()      //主程序
{
uint c=0;   //段码选择变量
uchar d=0x7f;   //最左侧数码管亮(选位)
while(1)     
{  
  P0=0xff;    //段码清零,防止数码管出现余辉
  P2=d;   //选位
  P0=seg[c];  //调用段码表
  delay(10);    //延时
  c++;    //段码加1
  if(c==8)   //是否显示到数字7
  c=0;    //重新装载段码选择变量
  d=_cror_(d,1); //位选变量右移一位
}
}
这是效果
欢迎各位前辈继续批斗:@ ,你们不批评我不知道错在哪啊:'(

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 雷影少年 发表于 2012-6-26 16:15 | 显示全部楼层
给他在加个左移的功能让0~F16个数左移显示出来,看看要多久才能写出来
 楼主| 雷影少年 发表于 2012-6-26 17:00 | 显示全部楼层
本帖最后由 雷影少年 于 2012-6-26 17:05 编辑

这个写的挺快的,就是还有个小BUG:每当8~F出现后全部数码管会有个短暂的显示8.而后才重新显示0~7
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code seg[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};         //数码管段码
void delay(uchar x)                //延时程序
{
        uchar a,b;
        for(a=x;a>0;a--)
                for(b=100;b>0;b--);
}
void main()                           //主程序
{
        uint c=0;                        //段码选择变量
        uchar d=0x7f;                 //最左侧数码管亮(选位)
        while(1)                  
        {  
                P0=0xff;           //段码清零,防止数码管出现余辉
                P2=d;                        //选位
                P0=seg[c];                //调用段码表
                delay(10);           //延时
                c++;                  //段码加1
                if(c==8)          //是否显示到数字7
                c=0;                  //重新装载段码选择变量
                d=_cror_(d,1); //位选变量右移一位
        }
}
NE5532 发表于 2012-6-26 22:28 | 显示全部楼层
对初学者来说,程序没有好次,能跑对就是成功。楼主既然在开发板上弄对了,那就是对了,好不好是另外的话。
 楼主| 雷影少年 发表于 2012-6-27 08:12 | 显示全部楼层
对初学者来说,程序没有好次,能跑对就是成功。楼主既然在开发板上弄对了,那就是对了,好不好是另外的话。
NE5532 发表于 2012-6-26 22:28

刚醒来的时候突然想把程序的左移方式改下,由原来的F出现后重新显示0~7,改为循环显示,即出现8~F的下一状态为9~F~0,仅仅改了几个变量就OK了,修改的地方加了红色
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code seg[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};  //数码管段码
void delay(uchar x)  //延时程序
{
uchar a,b;
for(a=x;a>0;a--)
  for(b=100;b>0;b--);
}
void main()      //主程序
{
uchar c,d=0x7f,e,i,il;  //c:数码管段选偏移量;d:数码管位选变量;e:数码管段码地址变量
while(1)     
{   
  for(il=100;il>0;il--)
  {
   e=c;
   for(i=8;i>0;i--)
   {
    P0=0xff;    //段码清零,防止数码管出现余辉
    P2=d;   //选位
    P0=seg[e];  //调用段码表
    delay(10);    //延时
    e++;    //段码加1
    if(e==c+8)   //是否最后一个数码管
    {e=c;}
    if(e==16)
    e=0;    //重新装载段码地址变量
    d=_cror_(d,1); //位选变量右移一位
   }
  }
  c++;
  if(c>15)
  c=0;

}
}
 楼主| 雷影少年 发表于 2012-6-27 08:13 | 显示全部楼层
做时钟去:lol
yushiqian2012 发表于 2012-6-27 18:31 | 显示全部楼层
dakaiyanjie
sedatefire 发表于 2012-7-1 00:29 | 显示全部楼层
哎,新手上路,各种纠结,何况是软件硬件都要搞,慢慢来
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部