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

2025-03-06 02:20:27
推荐回答(2个)
回答1:

……
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:

#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而已。