硬件仿真程序求指教

2019-07-16 07:16发布

本帖最后由 鼻子抽筋 于 2011-3-21 14:39 编辑

一个程序是与TM1668 结合来驱动四位数码管显示


我是要数码管0、1、2~F,来回跑

一到电路仿真就是一些乱码,请那个高手指教一下。

源程序如下:
//因为这个程序硬件仿真(简称硬仿)不是我想像的那样
//从0、1、2……E、F后又从0、1、2……E、F这样循环下去的
//为了在这个程序里好看出问题出在那里
//所以我要改进
//

/*............改后的.................*/
#include <avr/io.h>
#include <avr/iom48.h>
#include <avr/sfr_defs.h>


#define    STB 3
#define    CLK 2
#define    DIO 1

#define    uchar    unsigned    char
uchar    tab1[]={0xfa,0x22,0xb9,0xab,0x60,0xcb,0xdb,0xa2,0xfb,0xeb,0xf3,
                       0x5b,0xd8,0x3b,0xd9,0xd1,0x00
                               };
uchar    tab2[4]={0x00,0x00,0x00,0x00};
uchar    tab3[20]={0,1,2,3,4,5,6,7,
                           8,9,10,11,12,13,14,15,
                           16,16,16,16};
void delay1ms(unsigned    int);
void    set_data(unsigned    char);

int    main(void)
{
   int x=0,y=0,dat0=tab2[0],dat1=tab2[1],dat2=tab2[2],dat3=tab2[3];
   DDRB|=0x0e;
   DDRD=0xff;
   PORTD=0xff;
   PORTB|=_BV(DIO);
   PORTB|=_BV(CLK);
   PORTB|=_BV(STB);
   while(1){x=0;        
    for(x=0;x<20;x++)
       {   
           tab2[3]=tab2[2];
           PORTD=tab2[3];   //显示第四个字是什么
           dat0=tab2[3];

           tab2[2]=tab2[1];
           PORTD=tab2[2];//显示第三个字是什么
           dat1=tab2[2];

           tab2[1]=tab2[0];
           PORTD=tab2[1];//显示第二个字是什么
           dat2=tab2[1];

           y=tab3[x];
           tab2[0]=tab1[y];
           PORTD=tab2[0];//显示第一个字是什么
           dat3=tab2[0];
           
           DDRB=0x0e;
   PORTB|=_BV(CLK);
   PORTB|=_BV(STB);
   PORTB&=~_BV(STB);
   set_data(0x03);
   PORTB|=_BV(STB);

   PORTB&=~_BV(STB);
   PORTB|=_BV(CLK);   
   set_data(0x44);   
   PORTB|=_BV(CLK);
   PORTB|=_BV(STB);

   PORTB&=~_BV(STB);
   PORTB|=_BV(CLK);   
   set_data(0xc0);
   set_data(dat3);
   PORTB|=_BV(CLK);
   PORTB|=_BV(STB);

   PORTB&=~_BV(STB);
   PORTB|=_BV(CLK);   
   set_data(0xc4);
   set_data(dat2);
   PORTB|=_BV(CLK);
   PORTB|=_BV(STB);

   PORTB&=~_BV(STB);
   PORTB|=_BV(CLK);   
   set_data(0xc2);
   set_data(dat1);
   PORTB|=_BV(CLK);
   PORTB|=_BV(STB);

   PORTB&=~_BV(STB);
   PORTB|=_BV(CLK);   
   set_data(0xc6);
   set_data(dat0);
   PORTB|=_BV(STB);

   PORTB&=~_BV(STB);
   PORTB|=_BV(CLK);   
   set_data(0x8f);
   PORTB|=_BV(CLK);
   PORTB|=_BV(STB);
   PORTB&=~_BV(DIO);
           delay1ms(500);
       }
   }
}

void    set_data(unsigned    char    dat)
{
   uchar    x1;
   DDRB=0x0e;
   PORTB|=_BV(CLK);
   for(x1=0;x1<8;x1++)
   {   
       PORTB&=~_BV(CLK);
       if(dat&(1<<x1))
       {
           PORTB|=_BV(DIO);
       }
       else
           {PORTB&=~_BV(DIO);
       }
       PORTB|=_BV(CLK);
   }
   
}


void delay1ms(unsigned    int x3)
{unsigned    int x2,y2;
   for(x2=0;x2<x3;x2++)
       for(y2=0;y2<1441;y2++);
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。