数码管逐次加一同时流水灯

#include "reg52.h"                     //此文件中定义了单片机的一些特殊功能寄存器

 

typedef unsigned int u16;         //对数据类型进行声明定义

typedef unsigned char u8;

 

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

 

sbit led1=P2^0;

sbit led2=P2^1;

sbit led6=P2^5;

sbit led7=P2^6;

sbit led8=P2^7;

 

sbit beep=P1^5;

 

int tt,time;

 

u8 codesmgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};     

 

 

//延时函数,i=1时,大约延时10us

void delay(u16 i)

{

         while(i--);

}

 

/*******************************************************************************

* 函 数 名         : DigDisplay

* 函数功能                : 数码管动态扫描函数,循环扫描8个数码管显示

*******************************************************************************/

void DigDisplay()

{

         u8i;

          

          

         for(i=0;i<8;i++)

         {

         switch(i)   //位选,选择点亮的数码管,

                   {

                            case(0):

                                     LSA=0;LSB=0;LSC=0;P0=smgduan[time%10];break;//显示第0位

                            case(1):

                                     LSA=1;LSB=0;LSC=0;P0=smgduan[time/10];break;//显示第1位

                            case(2):

                                     LSA=0;LSB=1;LSC=0;P0=smgduan[time/100];break;//显示第2位

                       case(3):

                                     LSA=1;LSB=1;LSC=0;P0=smgduan[0];break;//显示第3位

                            case(4):

                                     LSA=0;LSB=0;LSC=1;P0=smgduan[0];break;//显示第4位

                            case(5):

                                     LSA=1;LSB=0;LSC=1;P0=smgduan[1];break;//显示第5位

                            case(6):

                                     LSA=0;LSB=1;LSC=1;P0=smgduan[6];break;//显示第6位

                            case(7):

                                     LSA=1;LSB=1;LSC=1;P0=smgduan[1];break;//显示第7位

                            }                

                    

         delay(80);

                P0=0x00;//消隐

         }

}

 

void fm1()

 {

 beep=~beep;  //取反 高低电平不断转换

 delay(200);  //改变频率,以改变音色500hz

}          

void fm2()

 {

 beep=~beep;  //取反 高低电平不断转换

 delay(1000);  //改变频率,以改变音色100hz

}

 

 

void init() ;

 

void main()

{       

     u8 j=0;

           u8 aa=0;

           u8 k=0;  

           init();

     while(1)

          {            

                   DigDisplay();  //数码管显示函数

                   if(time==99)

                   {

                   P0=0;

                   P2=0;

                   for(k=0;k<60;k++)

                      {

                      beep=~beep; //取反高低电平不断转换

          delay(200);  //改变频率,以改变音色500hz

          }

                    delay(100000);

                    for(k=0;k<60;k++)

                      {

                      

                      beep=~beep; //取反高低电平不断转换

          delay(1000);  //改变频率,以改变音色100hz

          }

                      while(1);

                   }

    }

}

 

void init()

P0=0;

P2=0;

time=0;

tt=0;

TMOD=0x11; 

TH0=(65536-50000)/256; //定时器装初值50ms

TL0=(65536-50000)%256;

EA=1;//开总中断

ET0=1;//开定时器0中断

TR0=1;//启动定时器0;使TR0置位=1,定时器0开始计数;停止时,使TR0=0复位;

void timer0() interrupt 1

          static int j=0;

      static  u8 aa=0;

            u8 k=0;

      TH0 =(65536-50000)/256;// 0x4c;                    //晶振11.0592Mhz 

      TL0 = (65536-50000)%256;//0x00;                    //若用12Mhz晶振 则改为TH0=0x3c;TL0=0xb0;

           

           

            tt++;

      if(tt == 1)

         {

              time++;

//              if(time==100)         //到99后在从00开始      

//                {

//                                  time= 0;

//                                 

//                                  }

                 tt = 0; 

                     }

                  

           if(time<100)

           {

     if(aa==20)

                   {

                   switch(j)

                   {

                   case0:

                     led1=0;led2=1;led6=1;led7=1;led8=1;break;

                   case1:

                     led1=1;led2=0;led6=1;led7=1;led8=1;break;

                   case2:

                     led1=1;led2=1;led6=0;led7=1;led8=1;break;

                   case3:

                     led1=1;led2=1;led6=1;led7=0;led8=1;break;

                   case4:

                     led1=1;led2=1;led6=1;led7=1;led8=0;break;

                   case5:

                     led1=1;led2=1;led6=1;led7=0;led8=1;break;

                   case6:

                     led1=1;led2=1;led6=0;led7=1;led8=1;break;

                   case7:

                     led1=1;led2=0;led6=1;led7=1;led8=1;break;

                   case8:

                    led1=0;led2=1;led6=1;led7=1;led8=1;j=-1;break;

                    default:break;

                     }  

                     j++;

                     aa=0;

                    //delay(5000);

                     }

           else

                    {

                    aa++;

                    }

       

    }

         else

         {

         led1=1;led2=1;led6=1;led7=1;led8=1;

         LSA=1;LSB=1;LSC=1;

         }

 

}

//void timer1() interrupt 3

//{

//      u8 j=0;

//      TH1 = 0x4c;                    //晶振11.0592Mhz 

//    TL1 = 0x00;                  //若用12Mhz晶振 则改为TH0=0x3c;TL0=0xb0;

//      delay(500);

//         for(j=0;j<5;j++)

//               {

//               switch(j)

//               {

//               case0:

//                 led1=0;led2=1;led6=1;led7=1;led8=1;break;

//               case1:

//                 led1=1;led2=0;led6=1;led7=1;led8=1;break;

//               case2:

//                 led1=1;led2=1;led6=0;led7=1;led8=1;break;

//               case3:

//                 led1=1;led2=1;led6=1;led7=0;led8=1;break;

//               case4:

//                 led1=1;led2=1;led6=1;led7=1;led8=0;break;

//                 }  

//                 delay(5000);

//                 }

//}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值