欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 拼湊了一個可調閃爍,感謝各位分享的大佬 [打印本頁]

作者: mlsyong321    時間: 2025-10-24 11:00
標題: 拼湊了一個可調閃爍,感謝各位分享的大佬
#include<stc8.h>
#include <intrins.h>

#define u8 unsigned char
#define u16 unsigned int
unsigned int s;


unsigned char  flagkey =0;         //按鍵標志
unsigned char Timer0Init_count = 0;//定時器溢出計數

sbit DIO = P3^3; //TM1637
sbit CLK = P3^2; //TM1637
sbit LED = P5^4; //led
sbit K1 = P5^5; //按鍵
//bit LED_Flash_flag;


u8 num[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFf,0xEF}; //0-9
u16 second,min,hour;        //TM1637六段


void Delays(unsigned int t);  //函數聲明
/*------------TM1637----------------*/
void Delay2us()                //@12.01MHz
{
        unsigned char i;      
        i = 6;
        while (--i);
}

void Delay3us()                //@12MHz
{
        unsigned char i;

        i = 10;
        while (--i);
}

void Delay5us()                //@12MHz
{
        unsigned char i;        
        i = 18;
        while (--i);
}

void I2CStart()
{
        CLK = 1;
        DIO = 1;
        Delay2us();
        DIO = 0;
}

void I2CAsk()
{
        CLK = 0;
        Delay5us();
        while(DIO);
        CLK = 1;
        Delay2us();
        CLK = 0;
}

void I2CStop()
{
        CLK = 0;
        Delay2us();
        DIO = 0;
        Delay2us();
        CLK = 1;
        Delay2us();
        DIO = 1;
}

void I2CWriteByte(u8 dat)
{
        u8 i;
        for(i=0;i<8;i++)
        {
                CLK = 0;
                if(dat&0x01)
                {
                        DIO = 1;
                }
                else
                {
                        DIO = 0;
                }
                Delay3us();
                dat>>=1;
                CLK = 1;
                Delay3us();
        }
}

void Display(u8 m,u8 s)
{
        I2CStart();        //1637 開始
        I2CWriteByte(0x40);
        I2CAsk();
        I2CStop();
        I2CStart();
        I2CWriteByte(0xC0);        //設置顯示首地址即第一個LED
        I2CAsk();

        I2CWriteByte(num[m/10]);
        I2CAsk();
        I2CWriteByte(num[m%10]);
        I2CAsk();
        I2CWriteByte(num[s/10]);
        I2CAsk();

        I2CWriteByte(num[s%10]);
        I2CAsk();
        I2CWriteByte(0xFF);
        I2CAsk();
        I2CWriteByte(0xFF);
        I2CAsk();
        I2CStop();
        I2CStart();
        I2CWriteByte(0x8F);
        I2CAsk();
        I2CStop();
}




/*------------定時器----------------*/
void Timer0Init(void)                //12M晶振,延時10Ms
{
    TMOD = 0x01; // 設置定時器0為模式1
    TH0 = 0x0D8; // 設置定時器0的初始值,用于產生10ms的定時中斷
    TL0 = 0x0F0;
    EA = 1; // 允許中斷
    ET0 = 1; // 允許定時器0中斷
    //TR0 = 1; // 啟動定時器0
}


/*------------檢察按鍵----------------*/
void anjian(void)
{
          if(K1 == 0){  // 檢測按鍵是否按下
                  TR0 = 1;//按鍵按下開始計時,溢出后中斷
          }else{
                            flagkey=0;
                  }
}

void Init_Timer1(void)
{
TMOD |= 0x10;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
TH1=0xB8;        //給定初值,這里使用定時器最大值從0開始計數一直到65535溢出
TL1=0x00;
EA=1;            //總中斷打開
ET1=1;           //定時器中斷打開
TR1=1;           //定時器開關打開
}


/*------------主程序----------------*/
void main()
{
        P3M0=0x00;
        P3M1=0x00;
        P5M0=0x00;
        P5M1=0x00;
  Timer0Init(); //定時器0初始化
        Init_Timer1();//定時器1初始化
  LED= 1;//led關   
  
        while(1)
        {
            Display(min,second);
            anjian();
                                         switch(second)
                                 {
                                         case 1:if(s==3000){LED=0;Delays(50000);LED=1;};
                                         break;
                                         case 2:if(s==1500|s==3000){LED=0;Delays(50000);LED=1;};
                                         break;
                                         case 3:if(s==1000|s==2000|s==3000){LED=0;Delays(50000);LED=1;};
                                         break;
                                         case 4:if(s==750|s==1500|s==2250|s==3000){LED=0;Delays(50000);LED=1;};
                                         break;
                                         case 5:if(s==600|s==1200|s==1800|s==2400|s==3000){LED=0;Delays(50000);LED=1;};
                                         break;
                                         case 6:if(s==500|s==1000|s==1500|s==2000|s==2500|s==3000){LED=0;Delays(50000);LED=1;};
                                         break;
                                         case 7:if(s==422|s==844|s==1300|s==1700|s==2100|s==2600|s==3000){LED=0;Delays(50000);LED=1;};
                                         break;
                                         case 8:if(s==375|s==750|s==1125|s==1500|s==1875|s==2250|s==2625|s==3000){LED=0;Delays(50000);LED=1;};
                                         break;
                                         case 9:if(s==335|s==670|s==1000|s==1335|s==1670|s==2000|s==2335|s==2670|s==3000){LED=0;Delays(50000);LED=1;};
                                         break;
                                         case 10:if(s==300|s==600|s==900|s==1200|s==1500|s==1800|s==2100|s==2400|s==2700|s==3000){LED=0;Delays(50000);LED=1;};
                                         break;
                                         case 11:if(s==275|s==550|s==825|s==1100|s==1375|s==1650|s==1925|s==2200|s==2475|s==2750|s==3000){LED=0;Delays(50000);LED=1;};
                                         break;
                                         case 12:if(s==250|s==500|s==750|s==1000|s==1250|s==1500|s==1750|s==2000|s==2250|s==2500|s==2750|s==3000){LED=0;Delays(50000);LED=1;};
                                         break;
                                         case 13:if(s==236|s==470|s==700|s==940|s==1180|s==1420|s==1660|s==1900|s==2140|s==2380|s==2620|s==2860|s==3000){LED=0;Delays(50000);LED=1;};
                                         break;
                                         case 14:if(s==214|s==428|s==642|s==870|s==1084|s==1298|s==1512|s==1726|s==1940|s==2154|s==2369|s==2583|s==2797|s==3000){LED=0;Delays(50000);LED=1;};
                                         break;
                                         case 15:if(s==200|s==400|s==600|s==800|s==1000|s==1200|s==1400|s==1600|s==1800|s==2000|s==2200|s==2400|s==2600|s==2800|s==3000){LED=0;Delays(50000);LED=1;};
                                         break;
                                         case 16:if(s==187|s==400|s==562|s==750|s==937|s==1125|s==1312|s==1500|s==1687|s==1875|s==2063|s==2250|s==2438|s==2625|s==2813|s==3000){LED=0;Delays(50000);LED=1;};
                                         break;
                                         case 17:if(s==176|s==352|s==529|s==706|s==882|s==1058|s==1235|s==1411|s==1588|s==1764|s==1941|s==2117|s==2294|s==2471|s==2647|s==2824|s==3000){LED=0;Delays(50000);LED=1;};
                                         break;
                                         case 18:if(s==166|s==333|s==500|s==666|s==833|s==1000|s==1166|s==1333|s==1500|s==1666|s==1833|s==2000|s==2166|s==2333|s==2500|s==2666|s==2833|s==3000){LED=0;Delays(50000);LED=1;};
                                         break;
                                         case 19:if(s==157|s==315|s==472|s==630|s==788|s==945|s==1103|s==1261|s==1418|s==1576|s==1734|s==1891|s==2049|s==2207|s==2364|s==2522|s==2680|s==2837|s==3000){LED=0;Delays(50000);LED=1;};
                                         break;
                                         case 20:if(s==150|s==300|s==450|s==600|s==750|s==900|s==1050|s==1200|s==1350|s==1500|s==1650|s==1800|s==1950|s==2100|s==2250|s==2400|s==2550|s==2700|s==2850|s==3000){LED=0;Delays(50000);LED=1;};
                                         break;
                                 }
                                       
        }
}




/*------------定時器中斷子程序----------------*/
void Timer0Interrupt(void) interrupt 1
        {
   if(flagkey==0)
        {
   flagkey=1;      
   Timer0Init_count ++;
   if(Timer0Init_count>5)
        {
   TR0 = 0;//關定時器
   TH0 = 0x0D8;//賦初值
   TL0 = 0x0F0;      

   Timer0Init_count=0;


    second++;
               
    if(second==21)
             {
        second=0;
                       
       }                              
                       
}
}
}
void Timer1_isr(void) interrupt 3 using 1
{
TH1=0xB8;                 //重新賦值 20ms
TL1=0x00;
s++;
        if(s==3010)
        {
                s=0;
        }


}
void Delays(unsigned int t)
{
while(--t);
}

作者: uid566381    時間: 2025-11-4 11:09
按鍵檢測沒有防抖處理
flagkey的使用邏輯不太清晰




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1