#include< reg52.h> #include< intrins.h> #define uint unsigned int #define uchar unsigned char uchar code disp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7f,0x39,0x3f,0x79,0x71}; //数码管显示十六进制,从0到f uchar code select[]={7,6,5,4,3,2,1,0}; //位选数组,自左至右 uchar tt0,tt1; uint temp1=0xfe; uint temp=432; void alllight(); void delay(uint z); void init() //初始化函数 { TMOD=0x11; //定时器0工作在方式一 TH0=(65536-50000)/256; //装入初值 TL0=(65536-50000)%256; TH1=(65536-50000)/256; //装入初值 TL1=(65536-50000)%256; EA=1; //开总中断 ET0=1; //开定时器0中断 ET1=1; TR0=1; TR1=1; //计时开始 } void Timer0() interrupt 1 //定时器0中断子程序 { TH0=(65536-50000)/256; //再次装入初值 TL0=(65536-50000)%256; tt0++; } void Timer1() interrupt 3 //定时器1中断子程序 { TH0=(65536-50000)/256; //再次装入初值 TL0=(65536-50000)%256; tt1++; } void display(uint temp) //显示子程序 { uint bai,shi,ge; bai=temp/100; shi=temp%100/10; ge=temp%100%10; if(bai!=0) //此处的判断是为了消除重影,不然当没有到100时,百位上总会有一个0在隐隐约约的显示 { P0=disp[bai]; //显示百位 P2=select[2]; delay(1); //延时0.1s左右 } P0=disp[shi]; //显示十位 P2=select[1]; delay(1); P0=disp[ge]; //显示个位 P2=select[0]; delay(1); } void delay(uint z) //延时子函数,z为传递的参数,用来决定延时时间的长短,若z为1,延时时间大概为0.001s { uint x,y; for(x=z;x>0;x--) for(y=10;y>0;y--); } void main() { init(); while(1) { if(tt1!=2) //数码管显示程序段 { P0=disp[7]; //显示高三位的765 P2=select[5]; delay(1); P0=disp[6]; P2=select[4]; delay(1); P0=disp[5]; P2=select[3]; delay(1); display(temp); } else if(tt1==2) { tt1=0; if(temp==398) { TR1=0; } else { temp--; } } if(tt0==10) //流水灯程序段 { tt0=0; { if(temp==398) alllight(); } temp1=_crol_(temp1,1); P1=temp1; } } } void alllight() //数码管停止后的动作 { while(tt0<=60) { temp1=0xff; if(tt0%10==0) { P1=~temp1; } P0=disp[7]; //显示高三位的765 P2=select[5]; delay(1); P0=disp[6]; P2=select[4]; delay(1); P0=disp[5]; P2=select[3]; delay(1); display(temp); } while(1) { P1=0xff; P0=0x76; //显示字母H P2=3; delay(1); P0=0x79; //显示字母E P2=4; delay(1); P0=0x38; //显示字母L P2=5; delay(1); P0=0x38; //显示字母L P2=6; delay(1); P0=0x3f; //显示字母O P2=7; delay(1); } }
高手,可我是初学,不懂
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |