#include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit pw=P1^4;//发光管的使能端 sbit wei=P2^7;//数码管的位选端 sbit duan=P2^6;//数码管的段选端 uchar temp,aa,num; // uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};//数码管数显编码表 void delay(uint z);//延时
void main() { pw=0; //开启发光管使能端 num=0; //附于初始值为0 aa=0; //附于始值为0 TMOD=0X01; //设定计时/计数器模式控制暂存器值 TH0=(65536-50000)/256; //中断初值,高8位 TL0=(65536-50000)%256; //中断初值,低8位 EA=1; //开启总中断 ET0=1; //开启定时中断 TR0=1; //启动定时 temp=0xfe; //附值发光管第一个灯亮11111110 P0=temp; duan=1; //开启段选 P0=table[0]; //段选显示数值初值为0 duan=0; //关闭段选,锁存 wei=1; //让位选处于直通状态 P0=0x100; //位选位数值,数码管位数,二制为100000000,0的才能亮,这样八个数码管都亮 wei=0; //锁存,保持上一步的状态 while(1) //死循环下级程序. { delay(1000); //流水灯速度 temp=_crol_(temp,1); //向左移位 P0=temp; }
} void delay(uint z) //流水灯延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--);
} void timer0() interrupt 1 //中断函数 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; aa++; if(aa==20) //数显速度 { aa=0; num++; if(num==16) //数显值到最高位F时返回初值0; num=0; duan=1; P0=table[num]; duan=0; } } |