#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
/**********************************************************************************
细节描述:P0口作为数码管的位选。 P1口作为AD数据输出口。
注意AD的OUT和单片机的连线!!!
1.做数字电压表的话只需把P1口的数据处理即可。
*************************************************************************************/
//片选=0的时候才是关!
char smg_table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管 共阳极
unsigned char AdData;
sbit Smg0_Switch = P2^0;
sbit Smg1_Switch = P2^1;
sbit Smg2_Switch = P2^2;
sbit START=P2^3;
sbit EOC=P2^4;
sbit ADDA=P2^5;
sbit ADDB=P2^6;
sbit ADDC=P2^7;
sbit ALE=P3^0;
sbit OE=P3^1;
void delay(uint x)
{
uint i,j;
for(i=x;i;i--)
for(j=125;j;j--);
}
void Smg_Display(uint x)
{
uint ge,shi,bai;
bai=x/100;
shi=x/10%10;
ge=x%10;
if(bai!=0)
{
Smg0_Switch=1;
P0=smg_table[bai];
delay(5);
Smg0_Switch=0;
}
if(!(bai==0&&shi==0))
{
Smg1_Switch=1;
P0=smg_table[shi];
delay(5);
Smg1_Switch=0;
}
Smg2_Switch=1;
P0=smg_table[ge];
delay(5);
Smg2_Switch=0;
}
void AD()
{
START=0;
OE=0;
START=1;_nop_();START=0; //正脉冲信号
ALE=1;ADDA=0;ADDB=0;ADDC=0;;//选通INT0
while(!EOC);
OE=1; //输出数据
Smg_Display(P1);
OE=0;
}
void main()
{
while(1)
{
AD();
}
}