日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

最容易扩展的光立方程序设计

發布時間:2023/12/9 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最容易扩展的光立方程序设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

光立方的設計有很多不同思路,在此講述一下我的光立方程序設計思路
對象:一個8x8x8的光立方
光立方實體圖片:

底層由64個發光二極管排列成8x8方陣,總共8層,每一層所有發光二極管的陰極連在一起引出,每豎條的發光二極管陽極依次焊接在一起,顯示原理類似數碼管的動態掃描!

程序中構造一個空間立方體,每個發光二極管都可看做是空間中的一個坐標點。就以一個數組表示,該數組為全局變量,如下:

該光立方數組管理512個LED,共64字節大小,512位,每一位代表一個LED,當相應二進制位為1時代表LED亮,為0時代表相應LED滅。建立此光立方數組后很容易想到只要單獨寫一個處理器中斷中或者操作系統線程,其中按一定頻率將該數組數據動態掃描到實體上(這部分涉及到I/O口的操作,不同的處理器這部分操作不同),而其他處理圖形或數字的函數放在其他線程中即可(這部分函數完全脫離硬件),這樣硬件掃描部分和軟件控制部分完全分離互不干擾,思路清晰,也利于后面程序擴展。
在ucos-ii中單獨創建一個線程執行掃描函數:

OSTaskCreate(Display,NULL,(OS_STK *)&DisplayStk[TASK_STK_SIZE-1],(INT8U)5);void Display(void *p_arg) {p_arg = p_arg;while(1){DisplayPix();OSTimeDlyHMSM(0,0,0,4);//根據實際效果調節延時時間} }

DisplayPix()函數需要根據實際I/O口編寫,作用是將光立方數組里的數據掃描到實體上。為了保證在處理底層I/O時不被其他線程干擾,我將該線程優先級提到最高,這樣也能保證掃描效果的流暢性。如果你要保證其他任務的實時性,將該線程的優先級調低也可,但是此處就要編寫不可重入代碼或者加互斥鎖。

接下來考慮軟件部分,有兩個函數必須實現,這兩個函數是以后擴展其它函數的基礎。寫好這兩個函數后,加入一些必要的算法可以讓光立方充滿生命,如果要顯示字母或圖形可以用取模軟件生成對應字母的字模數組,以備顯示。
1.設置空間坐標點LED的亮滅狀態SetPix函數

/************** 函數:SetPix 參數:(x,y,z)待動作的LED,color,1-點亮,0-熄滅,其他值-無操作 說明:開關空間坐標點LED ****************/ void SetPix(INT8S x,INT8S y,INT8S z,INT8S color) {INT8S Pix;Pix = z*8 + y; switch(color){case 0:LED8x8x8[Pix] &= ~(1<<x); //熄滅位置燈break;case 1:LED8x8x8[Pix] |= 1<<x; //點亮位置燈break;default://其他值,保持該點LED狀態,無操作break; } }

2.讀取空間坐標點的亮滅狀態GetPix函數

/************** 函數:GetPix 參數:(x,y,z)待動作的LED 輸出:LED狀態 說明:讀取對應坐標點LED的狀態 ****************/ INT8S GetPix(INT8S x,INT8S y,INT8S z) {INT8S Pix;Pix = LED8x8x8[z*8+y];Pix &= 1<<x;if(Pix==0)return 0;elsereturn 1; }

以上函數并沒有對參數范圍進行檢查,不算嚴格,實際需小心謹慎,確保傳入的參數范圍在實際范圍內,或者最好在函數中對參數進行檢查。

總結

以上是生活随笔為你收集整理的最容易扩展的光立方程序设计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。