;******************************************************
;*标题:  ATmega16L单片机数码管显示示例程序
;*文件:             
;*版本:  1.0
;*******************************************************
#include <avr/io.h>
#include <avr/delay.h>
//注: 内部函数_delay_ms() 最高延时 262.144mS@1MHz 即 32.768ms@8MHz
//  该函数可以实现较精确的定时for()/while()指令很难计算延时时间
//  为了使 _delay_ms()函数的延时正确,须在makefile中设定F_CPU为实际的系统时钟频
//  本范例为4MHz内部RC振荡器 即 F_CPU=4000000
//**********************************
#define uchar unsigned char //数据类型说明
#define uint unsigned int //数据类型说明
#define RD4 4 //
#define RD5 5 //
#define RD6 6 //
#define RD7 7 //
//**********************************
uchar table[11]={0xc0,0xf9,0xa4,0xb0,0x99, // 0, 1, 2, 3,4,
         0x92,0x82,0xf8,0x80,0x90, 0xff} ;// 5, 6, 7, 8, 9, off
uchar buf[4] ;
uchar disppoint;       //
//**********************************
void DelayMs(uint i)     //Ms级延时函数,参数i:延时时间
{ uint j ;
 for( ;i!=0 ;i--)
 {for(j=8000 ;j!=0 ;j--) ;}
}
//**********************************
//**********************************
void put_num(char c)
{
 PORTC=table[c&0x0f]; //
}
//*********************************
void main()
{
  DDRD=0xFF ;   //置PD口为输出
  PORTD=0xFF ;
  DDRC=0xFF ;
  PORTC=0xFF ;   //置PC口为输出
buf[0]=0;    //
 buf[1]=1;    //
buf[2]=2;    //
  buf[3]=3;    //
while(1)
 {
 
   disppoint=0;        //
   put_num(buf[disppoint]); //
   PORTD &=~(1<<RD4);    //
   DelayMs(1);        //
   PORTD |= (1<<RD4);    //
   disppoint++;       //
   put_num(buf[disppoint]); //
   PORTD &=~(1<<RD5);   //
   DelayMs(1);       //
   PORTD |= (1<<RD5);   //
   disppoint++;       //
   put_num(buf[disppoint]); //
   PORTD &=~(1<<RD6);   //
   DelayMs(1);       //
   PORTD |= (1<<RD6);   //
   disppoint++;      //
   put_num(buf[disppoint]); //
   PORTD &=~(1<<RD7);   //
   DelayMs(1);       //
   PORTD |= (1<<RD7);   //
               //
 }
}