;******************************************************
;*标题: 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); //
//
}
}