本帖最后由 jianghuoo00 于 2011-10-20 16:18 编辑
想用数码管通过A/D转换显示。单片机RA0(即AN0)连接一个电位器,通过调节电位器数码管显示不同电压。RB0--RB7接数码管段码,RC0--RC3接数码管位码。
可是结果显示有问题,没有达到目的,请教各位指点指点。是配置问题还是其他。
#include<p33FJ32MC204.h>
#define uchar unsigned char
#define uint unsigned int
const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
const uchar table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};
void init();
uint get_ad();
void delay(uint x);
void disp(uchar num1,uchar num2,uchar num3,uchar num4);
void main()
{
uint lednum;
uchar a1,a2,a3,a4;
init();
while(1)
{
lednum=get_ad();
a1=lednum/1000;
a2=lednum%1000/100;
a3=lednum%100/10;
a4=lednum%10;
disp(a1,a2,a3,a4);
}
}
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void init() //初始化,配置
{
TRISA=1;
PORTA=0;
TRISB=0;
PORTB=0;
TRISC=0;
PORTC=0;
AD1CON1bits.ADON=0; //开始关闭ADC模块
AD1CON1=0x00e0; //在空闲模式下模块继续工作,10位工作模式,整数,由内部计数器结束采样并启动转换
AD1CON2=0;
AD1CON3=0x8408;
AD1CHS0=0;
AD1CHS123=0;
AD1CSSL=0x0001;
AD1PCFGL=1; //AN0输入
AD1CON1bits.ADON=1; //启动ADC转换
}
uint get_ad() //AD采样,获取AD值
{
uint adval;
float advalf;
AD1CON1bits.SAMP = 1; //开始采样,采样结束后自动开始转换
while(!AD1CON1bits.DONE); //ADC是否转换完成
adval=AD1PCFGL;
advalf=adval/1023.0*5.0;
adval=advalf*1000; //保留小数位
return(adval);
}
void disp(uchar num1,uchar num2,uchar num3,uchar num4)
{
LATB=table1[num1];//显示第一个数码管,有小数点的
PORTC=0x0e;
delay(2);
LATB=table[num2];//显示第二个数码管
PORTC=0x0d;
delay(2);
LATB=table[num3];//显示第三个数码管
PORTC=0x0b;
delay(2);
LATB=table[num4];//显示第四个数码管
PORTC=0x07;
delay(2);
} |