先上原理图。此图是我压缩过的,太大了不让上传,实际上的管脚连接是,
我用的MCU是ATMEGA16, 74HC595的 11管脚是接PC0,
12管脚是接PC1,
14管脚是接PC2,
我的电路就是参考这个原理图搭的,但程序是把51的这个程序改成AVR的。
现在的问题是两个数码管常亮,我想是让这两个数码管在同一时间,显示不同的数字。
附上我修改的程序,请高手指教,
#include<avr/io.h>
#include<util/delay.h>
#define uint unsigned int
#define uchar unsigned char
typedef struct _bit_struct
{
unsigned char bit0 : 1 ;
unsigned char bit1 : 1 ;
unsigned char bit2 : 1 ;
unsigned char bit3 : 1 ;
unsigned char bit4 : 1 ;
unsigned char bit5 : 1 ;
unsigned char bit6 : 1 ;
unsigned char bit7 : 1 ;
}bit_field;
//定义一个宏,用来得到每一位的值
#define GET_BITFIELD(addr) (*((volatile bit_field *) (addr)))
//定义每一个位
#define DAT GET_BITFIELD(PORTC).bit2
void port_init(void)
{
PORTC = 0x00;
DDRC = 0xFF;
}
uchar const tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void sendbyte(uchar byte)
{
uchar num,c;
num=tab[byte];
for(c=0;c<8;c++)
{
PORTC&=~(1<<PC0);
DAT = num&0x80;
num=num<<1;
PORTC|=(1<<PC0);
}
}
void out595(void)
{
PORTC&=~(1<<PC1);
PORTC|=(1<<PC1);
}
void display(uchar word)
{
uchar i,j;
i=word/10;
j=word-10*i;
sendbyte(j);
sendbyte(i);
out595();
}
int main(void)
{
port_init();
while(1)
{
display(19);
}
}
|