展开全部
你用什么控制位选,我这有138控制的
/********************************
用LS138控制两位数码管显示99~0,
利用定时器0延时1分钟
*********************************/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LS138A=P2^2;
sbit LS138B=P2^3;
sbit LS138C=P2^4;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint);
uint num,i,led[2],numt0,temp,numdis;
void display(uchar numdis)//显示程序
{
/* temp++;
if(temp==480)//调整此数值改变数码显示速度
{
temp=0;//延时计数 每扫描一次加一次
--numdis;//每隔10个扫描周期加一次
}
led[0]=table[numdis%100/10];//十位
led[1]=table[numdis%10];//个位
for(i=0;i<2;i++)//实现2位动态扫描循环
{
P0=led[i];//将字模送到P0口显示
switch(i)//使用switch语句控制位选
{
case 0:LS138A=0;LS138B=0;LS138C=0; break;
case 1:LS138A=1;LS138B=0;LS138C=0; break;
}
delay(1);//此处控制动态显示,太长会有闪烁感
}*/
P0=table[numdis%100/10];
LS138A=0;LS138B=0;LS138C=0;
delay(1);
P0=table[numdis%10];
LS138A=1;LS138B=0;LS138C=0;
delay(1);
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()
{
TMOD=0x01;//设置定时器0为工作方式1(M1M0为01)
TH0=(65536-45872)/256;//装初值11.0592M晶振定时50ms数为45872
TL0=(65536-45872)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
}
void main()
{
init();
num=99;//装入初始值99,数码管显示为99
while(1)
{
display(num);
}
}
void T0_time() interrupt 1
{
TH0=(65536-45872)/256;//重装初值
TL0=(65536-45872)%256;
numt0++;//numt0每加1次判断一次是否到20次
if(numt0==20)//如果到了20次,说明1秒时间到
{
numt0=0;//然后把numt0清0重新再计20次
num--;
if(num==0)//如果num减到0,重回初始值
num=99;
}
}
望采纳!
/********************************
用LS138控制两位数码管显示99~0,
利用定时器0延时1分钟
*********************************/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LS138A=P2^2;
sbit LS138B=P2^3;
sbit LS138C=P2^4;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint);
uint num,i,led[2],numt0,temp,numdis;
void display(uchar numdis)//显示程序
{
/* temp++;
if(temp==480)//调整此数值改变数码显示速度
{
temp=0;//延时计数 每扫描一次加一次
--numdis;//每隔10个扫描周期加一次
}
led[0]=table[numdis%100/10];//十位
led[1]=table[numdis%10];//个位
for(i=0;i<2;i++)//实现2位动态扫描循环
{
P0=led[i];//将字模送到P0口显示
switch(i)//使用switch语句控制位选
{
case 0:LS138A=0;LS138B=0;LS138C=0; break;
case 1:LS138A=1;LS138B=0;LS138C=0; break;
}
delay(1);//此处控制动态显示,太长会有闪烁感
}*/
P0=table[numdis%100/10];
LS138A=0;LS138B=0;LS138C=0;
delay(1);
P0=table[numdis%10];
LS138A=1;LS138B=0;LS138C=0;
delay(1);
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()
{
TMOD=0x01;//设置定时器0为工作方式1(M1M0为01)
TH0=(65536-45872)/256;//装初值11.0592M晶振定时50ms数为45872
TL0=(65536-45872)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
}
void main()
{
init();
num=99;//装入初始值99,数码管显示为99
while(1)
{
display(num);
}
}
void T0_time() interrupt 1
{
TH0=(65536-45872)/256;//重装初值
TL0=(65536-45872)%256;
numt0++;//numt0每加1次判断一次是否到20次
if(numt0==20)//如果到了20次,说明1秒时间到
{
numt0=0;//然后把numt0清0重新再计20次
num--;
if(num==0)//如果num减到0,重回初始值
num=99;
}
}
望采纳!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询