本帖最后由 鼻子抽筋 于 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++);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>