4位数码管显示4个数怎么改程序(本程序只显示三个数,,数字电压表的程序)

#include <AT89X51.H> // 包含51单片机寄存器定义的头文件
unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char codedispcode[]={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[5]=i/10000;
i=i%10000;
dispbuf[6]=i/1000;
i=i%1000;
dispbuf[7]=i/100;
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;
}
}

第1个回答  2014-05-15
……
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++;
……

试试看。
第2个回答  2014-05-15
#include <AT89X51.H>    //  包含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而已。

追问

小数点位置不对。。应该再三后面

如果加上三极管驱动数码管的位选。。为什么数码管一直亮

追答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==4)//原来为dispcount==5
    {
      P1=P1 |0x80;//点亮小数点 
    }
  dispcount++;
 if(dispcount==8)
    {
      dispcount=0;
    } 
}
看你的图,加上三极管驱动后,按照你的接法,程序中段选应该取反,而且电路中,数码管的1234端要加上上拉电阻。

相似回答