デジタルチューブの駆動


文書ディレクトリ
  • デジタルチューブの駆動
  • 1.1動的走査の周期
  • 1.2ゴーストの発生と解決策
  • 1.3デジタルチューブ駆動例プログラム
  • 1デジタルチューブの駆動
    1.1動的スキャンの周期
    1つのデジタルチューブはどのくらい点灯する必要がありますか?つまり、全てのデジタルチューブのスキャンを完了するにはどのくらいの時間がかかりますか(全体スキャン時間=単一デジタルチューブ点灯時間*デジタルチューブ個数)?答えは:10 ms以内です.
    1.2ゴーストの発生と解決策
    「ゴースト」の出現は,主にデジタルチューブのビット選択とセグメント選択によって生じる過渡的な結果である.
    ソリューションには、セグメントを閉じるか、ビットを閉じるかの2つがあります.
    1.3デジタルチューブドライバの例
    サンプルコードは次のとおりです.
    #include 
    sbit ADDR0 = P1 ^ 0;
    sbit ADDR1 = P1 ^ 1;
    sbit ADDR2 = P1 ^ 2;
    sbit ADDR3 = P1 ^ 3;
    sbit ENLED = P1 ^ 4;
    unsigned char code LedChar[] = { //          
        0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
        0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
    };
    unsigned char LedBuff[6] = { //        ,   0xFF         
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
    };
    unsigned char i = 0; //       
    unsigned int cnt = 0; //   T0     
    unsigned char flag1s = 0; //1      
    
    void main()
    {
        unsigned long sec = 0; //       
        EA = 1; //     
        ENLED = 0; //   U3,       
        ADDR3 = 1; //         ADDR0-2   ,          
        TMOD = 0x01; //   T0     1
        TH0 = 0xFC; //  T0     0xFC67,   1ms
        TL0 = 0x67;
        ET0 = 1; //   T0   
        TR0 = 1; //   T0
    
        while (1)
        {
            if (flag1s == 1) //   1      
            {
                flag1s = 0; //1        
                sec++; //      1
                //      sec                        
                LedBuff[0] = LedChar[sec % 10];
                LedBuff[1] = LedChar[sec / 10 % 10];
                LedBuff[2] = LedChar[sec / 100 % 10];
                LedBuff[3] = LedChar[sec / 1000 % 10];
                LedBuff[4] = LedChar[sec / 10000 % 10];
                LedBuff[5] = LedChar[sec / 100000 % 10];
            }
        }
    }
    /*     0        */
    void InterruptTimer0() interrupt 1
    {
        TH0 = 0xFC; //      
        TL0 = 0x67;
        cnt++; //         1
        if (cnt >= 1000) //   1000    1  
        {
            cnt = 0; //            1    
            flag1s = 1; //   1        1
        }
        //               
        P0 = 0xFF; //    
        switch (i)
        {
            case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; i++; P0 = LedBuff[0]; break;
            case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; i++; P0 = LedBuff[1]; break;
            case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; i++; P0 = LedBuff[2]; break;
            case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; i++; P0 = LedBuff[3]; break;
            case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; i++; P0 = LedBuff[4]; break;
            case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; i = 0; P0 = LedBuff[5]; break;
            default: break;
        }
    }
    

    参考資料:
  • 手を取って51単片機を教えてあげます:C言語版