/* 利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,
与此同时利用定时器0以500MS速度进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止
然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“765666”。到此保持住*/
//定时器0采用查询法,定时器1采用中断法
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit FM=P2^3;
sbit dula=P2^6;
sbit wela=P2^7;
sbit led1=P1^0;
#define TH_M2 (65636-50000)/256;
#define TL_M2 (65636-50000)%256;
void delayms(int);/*延时函数*/
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//void display(uchar,uchar);
uchar num,num1,num2,bai,shi,ge;
int k=1,z1=765,z2=432,z=0,b=0,n=0;
void main()
{
P1=0x7f;
TH1=TH_M2;
TL1=TL_M2;
TMOD=0X11;/*t0工作在方式1*/
EA=1;/* 开全局中断.*/
ET1=1;
TR1=1;
while(1)
{ if(z==2) //每0.1s送一个数据 //if(z==2) 如果写成后面那种那么在while中的程序是自动
{ z=0; // z=0; 一直在扫的,那么还没等0.1S到,程序就自己
if(z2>398) // if(z2>398) 在以大于5ms一点的时间在扫描。
z2--; // z2--; 其中z2一定要在里面,这样即使没到0.1S而程序
} //自己运行也不会改变数据的状态
dula=1;
P0=table[z1/100];
dula=0;
P0=0x00;
wela=1;
P0=0xfe;//低电平开启
wela=0;
P0=0x00;
delayms(5);
dula=1;
P0=table[z1%100/10];
dula=0;
P0=0x00;
wela=1;
P0=0xfd;//低电平开启
wela=0;
P0=0x00;
delayms(5);
dula=1;
P0=table[z1%100%10];
dula=0;
P0=0x00;
wela=1;
P0=0xfb;//低电平开启
wela=0;
P0=0x00;
delayms(5);//
//如果if的小包含while中全部程序,那么意思就是每到1s才执行里面的程序,所以前面两个数只能1S显示扫一次,就显示不出来(人眼的余辉效应就失效了)
dula=1;
P0=table[z2/100];
dula=0;
P0=0x00;
wela=1;
P0=0xf7;//低电平开启
wela=0;
P0=0x00;
delayms(5);
dula=1;
P0=table[z2%100/10];
dula=0;
P0=0x00;
wela=1;
P0=0xef;//低电平开启
wela=0;
P0=0x00;
delayms(5);
dula=1;
P0=table[z2%100%10];
dula=0;
P0=0x00;
wela=1;
P0=0xdf;//低电平开启
wela=0;
P0=0x00;
delayms(5);
///////////////////////////////////////////////////////////////////
if(z2!=398)
{
for(k=0;k<10;k++)
{ TH0=TH_M2;
TL0=TL_M2;
TR0=1;
while(TF0==0);
TF0=0;
}
P1=P1>>1;
// delayms(500);
if(P1==0x00)
P1=0x7f;
// break;
}
// if(z2==10)
// k=0;
//////////////////////////////////////////////////////////////////
if(z2==398)
{
for(k=0;k<100;k++) //当z2=398,开始启动定时器0
{ TH0=TH_M2;
TL0=TL_M2;
TR0=1;
while(TF0==0);
TF0=0;
/*if(k==20)
P1=0x00;
if(k==40)
P1=0xff;
if(k==60)
P1=0x00;
if(k==80)
P1=0xff;
if(k==100)
P1=0x00;
//P0=0xff; */
}
while(1)
{ z1=765;
z2=666;
dula=1;
P0=table[z1/100];
dula=0;
P0=0x00;
wela=1;
P0=0xfe;//低电平开启
wela=0;
P0=0x00;
delayms(5);
dula=1;
P0=table[z1%100/10];
dula=0;
P0=0x00;
wela=1;
P0=0xfd;//低电平开启
wela=0;
P0=0x00;
delayms(5);
dula=1;
P0=table[z1%100%10];
dula=0;
P0=0x00;
wela=1;
P0=0xfb;//低电平开启
wela=0;
P0=0x00;
delayms(5);//
//如果if的小包含while中全部程序,那么意思就是每到1s才执行里面的程序,所以前面两个数只能1S显示扫一次,就显示不出来(人眼的余辉效应就失效了)
dula=1;
P0=table[z2/100];
dula=0;
P0=0x00;
wela=1;
P0=0xf7;//低电平开启
wela=0;
P0=0x00;
delayms(5);
dula=1;
P0=table[z2%100/10];
dula=0;
P0=0x00;
wela=1;
P0=0xef;//低电平开启
wela=0;
P0=0x00;
delayms(5);
dula=1;
P0=table[z2%100%10];
dula=0;
P0=0x00;
wela=1;
P0=0xdf;//低电平开启
wela=0;
P0=0x00;
delayms(5);
}
}
}
}
void t1(void)interrupt 3
{ z++;
TH1=TH_M2;
TL1=TL_M2;
}
void delayms(int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=1;j<=120;j--); //1ms
}
帮我看看,为什么程序停止在下面这段程序中啊,谢谢了
if(z2!=398)
{
for(k=0;k<10;k++)
{ TH0=TH_M2;
TL0=TL_M2;
TR0=1;
while(TF0==0);
TF0=0;
}
P1=P1>>1;
// delayms(500);
if(P1==0x00)
P1=0x7f;
// break;
} |