/********************************************************************
程序名称:片内模数转换演示实验
时钟频率:内部RC 1M
引脚    :接键盘与显示部分
    **PC0.......PC7   键盘与显示a.....g**
       **PD0.......PD7   键盘与显示1.....8**
       **PA0     模拟电压**
    **Aref    电源正极**
********************************************************************/
#include<iom16v.h>
#include
#include
#include
#pragma interrupt_handler ad:15
unsigned long m=0;
unsigned int adc,adc1=0,adc2=0,adc3=0,adc4=0,l;
const unsigned char f[]=
      {
      0x7e,0x0c,0xb6,0x9e,0xcc,0xda,0xfa,0x0e,0xfe,0xde
      };//码段转换
void  adcc(void)
      {
         PORTA=0x00;
        DDRA=0xf0;
        PORTD=0x00;
        DDRD=0xff;
        PORTC=0x00;
        DDRC=0xff;
        ADMUX=0x40; //ADC状态寄存器定义
        ADCSRA=0x8e;//ADC状态寄存器定义
        SREG=0x80;//开放全局中断
        ADCSRA|=BIT(ADSC);//启动一次转换
      }
/*******************************************状态寄存器设置******************/
void Delay(void)
 {
 unsigned int a, b;
 for (a = 1; a<20; a++)
  for (b = 1; b<20; b++)
   ;
   } 
/****************************延时******************/    
void  ad(void)
      {
   if (adc3==2)
   adc1=ADC;
   if (adc3==4)
   adc2=ADC;
   if (adc1==adc2)
   adc=adc1;
   adc3++;
   if (adc3>4)
   adc3=0;
   ADCSRA|=BIT(ADSC);
      }
/************************AD采样中断服务子程序**************************/
void main(void)//主程序
{
char i=0;
adcc();
while(1)
{
if (i==20)
m=(long)adc*5000/1023,i=0;
PORTC=f[m%10];
PORTD=0xfe;
Delay(); 
PORTC=f[m/10%10];
PORTD=0xfd;
Delay() ;
PORTC=f[m/100%10];
PORTD=0xfb;
Delay() ;
PORTC=f[m/1000%10]|0x01;
PORTD=0xf7;
Delay() ;
i++;
}
}