#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6; //申明U1锁存器
sbit wela=P2^7; //申明U2锁存器
sbit adwr=P3^6; //定义A/D的WR端口
sbit adrd=P3^7; //定义A/D的RD端口
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void start()
{
adwr=1;
adwr=0; //启动AD转换
adwr=1;
}
void init()
{
P0=0x7f; //0111 1111
}
void display(uchar bai,uchar shi,uchar ge)
{
dula=1;
P0=table[bai]; //送段选数据
dula=0;
P0=0xff; //送位选数据前关闭所以显示
wela=1;
P0=0x7e; //送位选数据
wela=0;
delayms(5); //延时
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0x7d; //0111 1101
wela=0;
delayms(5);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0x7b; //0111 1101
wela=0;
delayms(5);
}
void main()
{
uchar a,A1,A2,A3,adval;
init();
for(a=10;a>0;a--) //TX-1C实验板A/D工作效率较低,所以启动转换后要多留点时间用来转换把显示的部分放在这里的原因也是为了延长转换时间
{
display(A1,A2,A3);
}
while(1);
{
start();
delayms(100);
P1=0xff; //读取P1口之前先给其写全1 //选通ADCS
adrd=0; //A/D使能读
delayms(100);
adval=P1; //A/D数据读取赋给P1口
adrd=1;
delayms(100);
A1=adval/100;
A2=adval%100/10;
A3=adval%10;
}
}
1、这个程序有个WARNING
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?START?111
2、程序是想实现通过调AD来实现数码管的数字变化,可是我的数码管一直不显示
3、main里的display为什么能放在这里,不应该是先把A1A2A3都表示出来后再写display吗?