如何使用EFM8微控制器在LCD上顯示圖像
出處:維庫電子市場網(wǎng) 發(fā)布于:2025-02-20 17:29:39
當前的項目將這些功能融合在一起,以有效,方便地在LCD上顯示128 x-128像素圖像。目的是從任何標準的灰度.bmp映像文件開始,然后使用SCILAB對其進行處理,然后通過USB將其傳輸?shù)紼FM8微控制器,以便我們可以在128 x-128 x-128像素LCD上顯示。該項目僅處理一個圖像,但是此處介紹的技術很容易地顯示出由一系列相似圖像組成的簡單動畫。
該過程始于使用Paint.net 或其他一些圖像編輯應用程序創(chuàng)建圖像。該圖像被加載到SCILAB中,并處理為與LCD兼容的格式,轉換為像素數(shù)據(jù)的矩陣,并通過64個字節(jié)USB數(shù)據(jù)包傳輸?shù)紼FM8。然后,使用更新的SPI狀態(tài)機將此像素數(shù)據(jù)(四行)傳輸?shù)絃CD模塊。
端口I/O。
端口I/O配置與我們在上一篇文章中使用的配置相同。

外圍設備和中斷
外圍和中斷設置與我們在上一篇文章中使用的內(nèi)容相同:SPI配置用于與LCD模塊的通信,而Timer4用于短延遲。我們在此項目中不使用timer2,因為我們不需要幀速率。相反,當從PC接收像素數(shù)據(jù)包時,LCD會順序更新。
固件
該項目的VCP配置與我們在上一個項目中使用的配置相同。但是,還有一些其他USB功能:以前EFM8僅從SCILAB接收數(shù)據(jù),而現(xiàn)在EFM8也會傳輸數(shù)據(jù)。
void USBTxByte(unsigned char BytetoSend)
{
Block_Write(&BytetoSend, 1, &USBBytesTransmitted);}
正如上面的block_write()函數(shù)的名稱所暗示的那樣,vcpxpress庫能夠使用一個函數(shù)調(diào)用傳輸一個字節(jié)數(shù)組。但是,在此項目中,來自EFM8的USB傳輸僅用于流量控制:EFM8發(fā)送一個字節(jié)來通知Scilab,該是時候發(fā)送更多數(shù)據(jù)了。因此,usbtxbyte()函數(shù)只是使用block_write()傳輸單個字節(jié)的便利方法。
收到的USB數(shù)據(jù)包處理以下代碼:
if (API_InterruptCode & RX_COMPLETE) // USB read complete{if(USBBytesReceived == 1 && USBRxPacket[0] == NEW_IMAGE_FLAG){CLEAR_LCD = TRUE;
NextLinetoWrite = 0;
//return the new image flag byte to the PC for flow controlUSBTxByte(NEW_IMAGE_FLAG);//continue with the next USB read procedureBlock_Read(USBRxPacket, USB_PACKET_SIZE, &USBBytesReceived);}
else if(USBBytesReceived == USB_PACKET_SIZE){/*this flag tells the while loop in ImagetoLCD_main.cto process a received USB pixel data packet*/USB_PACKET_RECEIVED = TRUE;//continue with the next USB read procedureBlock_Read(USBRxPacket, USB_PACKET_SIZE, &USBBytesReceived);}
}
當Scilab腳本完成將圖像文件轉換為LCD像素數(shù)據(jù)時,它將發(fā)送一個單字節(jié)數(shù)據(jù)包,其中具有Imagetolcd_defs.h中定義為new_image_flag中的值。因此,如果接收到的數(shù)據(jù)包長度是一個,并且單個字節(jié)具有new_image_flag的值,則微控制器知道新圖像正在途中。它清除了LCD,將new_image_flag傳輸?shù)絇C,并將零加載到NextLineToWrite中,該變量是一個變量,當MicroController接收下一個像素數(shù)據(jù)包時,它保留了要更新的行地址。如果接收到的數(shù)據(jù)包長度為64個字節(jié)而不是一個字節(jié),則數(shù)據(jù)包將帶來實際的像素數(shù)據(jù)。在這種情況下,我們只是將USB_Packet_received標志設置為true; LCD更新完成后,流量控制字節(jié)將發(fā)送。
當Imagetolcd_main.c中的無限循環(huán)意識到USB_Packet_received已將其設置為true時,它調(diào)用ProcessususBrxPacket():
void ProcessUSBRxPacket()
{
unsigned char n = 0, row, column;
//copy the received pixel data to the LCD display data arrayfor(row = 0; row < LINES_PER_PACKET; row++){for(column = 0; column < NUM_LINE_DATA_BYTES; column++){LCDDisplayData[row][column] = USBRxPacket[n];n++;}
}
//wait until the SPI state variable indicates that the bus is available for a new transferwhile(LCDTxState != IDLE);UpdateLCDLines();
}
在這里,我們將像素數(shù)據(jù)傳輸?shù)竭m當?shù)亩S陣列中。在此項目中,lcddisplaydata [] []是4行乘16列:我們?nèi)匀恍枰?6列字節(jié)來容納128位水平數(shù)據(jù),但是我們只需要4行,因為像素數(shù)據(jù)是從64個字節(jié)數(shù)據(jù)包中的PC傳輸?shù)?,?4個字節(jié)除以16個字節(jié)等于4行。更新數(shù)組后,程序等待直到LCD通信接口為空閑,然后調(diào)用UpdatelCdlines()。
該項目需要對管理SPI轉移到LCD的狀態(tài)機器進行一些更改。以前,我們具有UpdateAlllCdlines()函數(shù),該函數(shù)(您可能會從名稱中猜到)啟動一個過程,該過程更新一個SPI傳輸中的所有LCD線路。但是現(xiàn)在,我們在一個SPI傳輸期間僅更新四行,并且在該過程結束時執(zhí)行了另外兩個任務:


SCILAB腳本中的另一個主要部分是通過VCP連接將像素數(shù)據(jù)發(fā)送到EFM8的FO循環(huán):

SCILAB腳本還調(diào)用TIC()和TOC()來測量和顯示傳輸和顯示一個圖像所需的時間。在上面提到的相同的2.5 GHz Windows機器的情況下,該過程僅需約50毫秒,這意味著該系統(tǒng)應該能夠舒適地維持每秒10張圖像的動畫幀速率。
上一篇:電容屏和觸摸屏的區(qū)別
下一篇:接口七個片段顯示到Arduino
版權與免責聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權均屬于維庫電子市場網(wǎng),轉載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關法律責任。
本網(wǎng)轉載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉載時,必須保留本網(wǎng)注明的作品出處,并自負版權等法律責任。
如涉及作品內(nèi)容、版權等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關權利。
- LED照明技術特性與選型運維指南2026/1/5 10:26:27
- 工業(yè)觸摸屏選型與現(xiàn)場應用技術指南2025/12/22 11:44:57
- 顯示器色深 6Bit、8Bit、10Bit 與 6 抖 8、8 抖 10、FRC2025/8/28 15:29:32
- Micro-LED技術解析2025/8/26 17:21:56
- LED顯示屏標清、高清、超清、1080P與4K的解析2025/8/8 17:05:00









