……
OE = 1;
getdata=P0;
OE = 0;
i = getdata * 196;
dispbuf[4] = i / 10000;
i = i % 10000;
dispbuf[5] = i / 1000;
i = i % 1000;
dispbuf[6] = i / 100;
i = i % 100;
dispbuf[7] = i / 10;
ST = 1;
ST = 0;
……
……
……
P2=dispbitcode[dispcount]; //扫描数码管的每一位
if(dispcount==4)
{
P1=P1 |0x80;
}
dispcount++;
……
试试看。
#include// 包含51单片机寄存器定义的头文件
unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00};//共阴极数码管
unsigned char dispbuf[8]={10,10,10,10,10,0,0,0};
unsigned char dispcount;
unsigned char getdata;
unsigned int temp;
long int i;
unsigned int R1;
sbit ST=P3^0; //定义管脚
sbit OE=P3^1; //定义管脚
sbit EOC=P3^2; //定义管脚
sbit CLK=P3^3; //定义管脚
void main(void)
{
ST=0;//初始化时,使ST和OE信号全为低电平
OE=0;
ET0=1; //允许定时器T0中断
ET1=1; //允许定时器T1中断
EA=1; //允许中断
TMOD=0x12; //使用定时器T1的工作方式1及T0的工作方式2
TH0=216; //定时器T0的高8位赋初值
TL0=216; //定时器T0的低8位赋初值
TH1=(65536-5000)/256; //定时器T1的高8位赋初值
TL1=(65536-5000)%256; //定时器T1的低8位赋初值
TR1=1; //启动定时器T1
TR0=1; //启动定时器T0
ST=1; //产生启动转换的正脉冲信号
ST=0;
while(1) //无限循环等待中断
{
if(EOC==1)
{
OE=1;
getdata=P0;
OE=0;
i=getdata*196;
dispbuf[4]=i/10000;//原为dispbuf[5]
i=i%10000;
dispbuf[5]=i/1000;//原为dispbuf[6]
i=i%1000;
dispbuf[6]=i/100;//原为dispbuf[7]
i=i%100;
dispbuf[7]=i/10;//新增一位
ST=1;
ST=0;
}
}
}
void t0(void) interrupt 1 using 0 //定时器0 中断服务
{
CLK=~CLK; //定时取反一次,制造脉冲
}
void t1(void) interrupt 3 using 0 //定时器1 中断服务
{
TH1=(65536-6000)/256;
TL1=(65536-6000)%256;
P2=0xff;
P1=dispcode[dispbuf[dispcount]]; //数码管的字段码
P2=dispbitcode[dispcount]; //扫描数码管的每一位
if(dispcount==5)
{
P1=P1 |0x80;//点亮小数点
}
dispcount++;
if(dispcount==8)
{
dispcount=0;
}
}
//其实如果原理图和这个代码配套的话,代码无需修改就可以直接显示8位,只不过低5位数码管固定显示0而已。