1. 程式人生 > >STC89C52RC控制WS2812B LED 調色調光(三)

STC89C52RC控制WS2812B LED 調色調光(三)

前言

     到了本系列的一個終結了。前篇中接入了EC11進行調光,但是對三基色進行整體調光,本文加入三基色分別調光。

正文

     上篇文章中我們利用到EC11的兩個脈衝介面,本次加入按鍵功能。在51程式碼中實現按鍵掃描,監測EC11的按鍵是否被按下,如果有按,則迴圈當前切換的顏色,並用4腳三基色led標識出當前要調整的色彩,並啟用一個定時器進行4秒左右的倒計時,時間到了時就把led熄滅,並關閉定時器。

鍵盤掃描程式碼:

//檢測到按鍵
        if(p01 == 0) {
            //消抖
            delays(1);
            if(p01 == 0) {
                controlC = (controlC + 1) % 4;
                TR0 = 0; //先關計時器,重新計數
                TH0 = 0; //重新裝填計數
                TL0 = 0;
                coutrolCount = 0;
                TR0 = 1;//再開

                redLed = 1;
                greenLed = 1;
                blueLed = 1;
                if(controlC == CRED) {
                    redLed = 0;
                } else if(controlC == CGREEN) {
                    greenLed = 0;
                } else if(controlC == CBLUE) {
                    blueLed = 0;
                }
                delays(200);
            }
        }

     注意在裡面有對定時器進行重置的操作,在編碼器的外部中斷中也需要有這樣的操作,以免時鐘計時時間到了對三色無法調節。 

      搞定三基色調光,我們再來考慮斷電儲存三色值,以便下次啟動時能直接使用上次值,提高使用者體驗度。斷電儲存要使用到EEPROM,正好51系列內部都帶有大小不等的EEPROM,對於儲存我們的三色值是足夠的。

      對於EEPROM的資料網上很多,在此不做過多描述,下面是讀寫擦除的程式碼:


void IapIdle()
{
    IAP_CONTR = 0;
    IAP_CMD = 0;
    IAP_TRIG = 0;
    IAP_ADDRH = 0X80;
    IAP_ADDRL = 0;
}

//EEPROM 讀取一個byte
uchar IapReadByte(int addr)
{
    uchar dat;
    EA = 0;

    IAP_CONTR = ENABLE_IAP;
    IAP_CMD = CMD_READ;
    IAP_ADDRL = addr;
    IAP_ADDRH = addr >> 8;
    IAP_TRIG = 0X46;
    IAP_TRIG = 0XB9;
    delays(1);
    dat = IAP_DATA;
    IapIdle();

    EA = 1;
    return dat;
}

//EEPROM 寫一個byte  該地址必須要擦寫過的,或是0xff,要不然資料是不對的
void IapWriteByte(int addr,uchar dat)
{
    EA = 0;
    IAP_CONTR = ENABLE_IAP;
    IAP_CMD = CMD_PROGRAM;
    IAP_ADDRL = addr;
    IAP_ADDRH = addr >> 8;
    IAP_DATA = dat;
    IAP_TRIG = 0X46;
    IAP_TRIG = 0XB9;
    delays(1);
    IapIdle();
    EA = 1;
}

//EEPROM 擦寫一個扇區
void IapEraseSector(int addr)
{
    EA = 0;
    IAP_CONTR = ENABLE_IAP;
    IAP_CMD = CMD_ERASE;
    IAP_ADDRL = addr;
    IAP_ADDRH = addr >> 8;
    IAP_TRIG = 0X46;
    IAP_TRIG = 0XB9;
    delays(14);
    IapIdle();
    EA = 1;
}

電路圖

ec11調色調光

結束語

      終於完結了ws2812b的一系列調光調色,最終回頭看看本系列用到的51知識:鍵盤掃描,外部中斷,計時器

,還有外部輸出頻率的精確控制,能學得的東西學是不少的。

      下一步準備把做成的調色調光整合後做成一個檯燈,到時會出一個製作視訊,敬請期待!

附程式下載連結:

https://download.csdn.net/download/yaleond/10805887