STC89C52RC控制WS2812B LED 調色調光(三)
阿新 • • 發佈:2018-11-25
前言
到了本系列的一個終結了。前篇中接入了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; }
電路圖
結束語
終於完結了ws2812b的一系列調光調色,最終回頭看看本系列用到的51知識:鍵盤掃描,外部中斷,計時器
,還有外部輸出頻率的精確控制,能學得的東西學是不少的。
下一步準備把做成的調色調光整合後做成一個檯燈,到時會出一個製作視訊,敬請期待!
附程式下載連結:
https://download.csdn.net/download/yaleond/10805887